Frequency Calibration Notes from CrIS NPP

L. Larrabee Strow

1 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 bto_surf to btc_surf. These are derived as follows:

    \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}

    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 into mod_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 particular cris_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.

comments powered by Disqus