Frequency Calibration Notes from CrIS NPP
Thu, Dec 7, 20171 Previous Work
1.1 Npp
1.1.1 Locations
- Early calibration codes are in ~strow/Work/Cris/Calval/Npp/
- Later long-term time series are in ~strow/Work/Cris/Stats
1.1.2 Commissioning Codes
- I am just describing what I am finding in these old codes. I think I will re-write them completely. For now I am describing what I found in
cris_speccal_v2.m
. Early codes used rtp allfov output. Spectra with good contrast (min/max BT > 5K) and "clear scenes" with less than 5K of clouds are used. The "clear scenes" are determined by comparing
\begin{equation} \text{btc_surf} = \text{radtot(f(indsurf),prof.calc(indsurf,:)./ew);} \\ \text{bto_surf} = \text{radtot(f(indsurf),prof.robs1(indsurf,:)./ew);} \end{equation}bto_surf
tobtc_surf
. These are derived as follows:Note that
prof.rcalc
is a clear-only simulation. Not sure why this is done, it seems fine to me to just use BTobs and BTcal directly to test for clear.- We did not use a clear rtp file because I was worried the calibration might be time dependent. That turned out to not be a problem.
- The code has an option to not do absolute frequency calibration, but instead calibration relative to FOV5. This option treats prof.robs1 for FOV5 as the computed radiance. I think I continued to use the contrast and clear tests for this, but in theory I could probably relax them a lot with this approach.
- To start, the computed radiance is interpolated to a 60X finer grid using finterp2. Then, further spline interpolations are done on this BTcal that are used for the cross-correlations.
- All of this is done on programmable "time block", looks to be set to 6 minutes, the granule length.
- Output is: (nblocks are the number of discrete time blocks used.)
results(ifov).percent_shift = results(ifov).percent_shift(1:nblocks); results(ifov).rtime_min = results(ifov).rtime_min(1:nblocks); results(ifov).rtime_max = results(ifov).rtime_max(1:nblocks); results(ifov).rlat_mintime = results(ifov).rlat_mintime(1:nblocks); results(ifov).rlat_maxtime = results(ifov).rlat_maxtime(1:nblocks); results(ifov).orbit_phase = results(ifov).orbit_phase(1:nblocks); results(ifov).landfrac = results(ifov).landfrac(1:nblocks); results(ifov).count = results(ifov).count(1:nblocks); results(ifov).corrcoef = results(ifov).corrcoef(1:nblocks); results(ifov).ccall = results(ifov).ccall(:,1:nblocks); results(ifov).bto = results(ifov).bto(:,1:nblocks); results(ifov).btc = results(ifov).btc(:,1:nblocks); results(ifov).ppm = 1E6 * results(ifov).percent_shift * channel_df * 0.01 / mean_freq;
- These data are then processed by codes like
process_freqcal_feb24.m
in the subdirectory Feb24. Or many of them in the code (top level)process_freqcal_series.m
. - The output of
process_freqcal
codes are read intomod_dg.m
(or similar) for fitting the focal plane geometry. - Looks like there is a fft version:
cris_speccal_v2_fft.m
- Looks like test.m is a version of D. Tobin's approach where he intercompares radiances relative to FOV5 and then find the freqcal that minimizes each relative to FOV5 radiances.
1.1.3 Long Term Trending Codes
- Codes matching
cris_speccal_stats*.m
do spectral calibration using stats files as inputs. In particularcris_speccal_stats_highres_sw.m
uses the \cd lines in the short-wave high resolution data to get the Neon calibration. These work very well because they are above clouds. This code has better handling of indices and has a subroutine,getind.m
that specifies which indices to use for the correlations. This is probably a better starting point than the Commissioning Codes.