;+
; Procedure:
; thm_get_fft_cal_pars
;
; Purpose:
; Given the signal source, and begin and end of the time interval,
; return the FFT RAW->PHYS transformation parameters.
;
; Calling Sequence:
; thm_get_fft_cal_pars, tbeg, tend, fft_sel, nbins, cal_pars=cal_pars
; Arguements:
; tbeg, tend DOUBLE, time in seconds since THEMIS epoch.
; fft_sel INT, FilterBank source selection indicator.
; nbins, INT, number of frequency bins in spectrum (16, 32, 64).
; cal_pars STRUCT, see Notes below for elements.
;
;
; Notes:
; -- use of TBEG and TEND for time-dependent calibration parameters is not currently implemented!
; -- E-field gains and units are for actual deployed boom lengths (CDE).
; -- Elements of cal_pars are as follows:
;
; $LastChangedBy: jimm $
; $LastChangedDate: 2007-11-16 12:28:13 -0800 (Fri, 16 Nov 2007) $
; $LastChangedRevision: 2043 $
; $URL $
;-
pro thm_get_fft_cal_pars, tbeg, tend, fft_sel, nbins, cal_pars=cal_pars
; attenuation factors from Flight model measurements plus modeling;
; JWB, UCBSSL, 1 Feb 2007.
cal_par_time = '2002-01-01/00:00:00'
; set the unit strings.
units_scm = 'nT!U2!N/Hz'
units_edc = '(V/m)!U2!N/Hz' ; <--- NOTE that E-field units are mV/m (deployed state).
units_eac = '(V/m)!U2!N/Hz' ; <--- NOTE that E-field units are mV/m (deployed state).
units_v = 'V!U2!N/Hz'
; determine the frequency binning and bin width.
; note that even though there is a variable bin width across the spectrum (df/f ~ const.),
; the on-board calculation produces a result that should be normalized with a constant bin width of 8 Hz.
if (fft_sel ge 12) and (fft_sel le 14) then $
rate = '16k' else $
rate = '8k'
thm_fft_freq_bins, rate=rate, nbins=nbins, cent_freq=cent_freq
bin_width = 8. ; Hz.
; determine the attenuation factors for each frequency bin.
; note that these are attenuation factors for spectral density, rather than amplitude,
; and so are the square of the analogous frequency response factors in the CAL_FBK routine.
; note that there is an upper limit on the attenuation factor to keep from amplifying noise bins.
max_atten_fac = 100.
thm_comp_scm_response, 'dummy', cent_freq, scm_resp
thm_comp_efi_response, 'SPB', cent_freq, spb_resp
thm_comp_efi_response, 'AXB', cent_freq, axb_resp
thm_comp_eac_response, 'dummy', cent_freq, eac_resp
; set up the various gain factors.
adc_factor = 1.0/float( 2L^16 - 1L)
gain_v = 2.0*105.2*adc_factor
gain_edc = 2.0*15.0*adc_factor
gain_eac = 2.0*2.54*adc_factor
gain_scm = 2.0*5.0*adc_factor
l12 = 49.6 ; meters.
l34 = 40.4 ; meters.
l56 = 5.63 ; meters.
lv = 1.0 ; unitless.
lscm = 1.0 ; unitless.
case 1 of
(fft_sel ge 0) and (fft_sel le 3): begin ; SPB V channels.
gain = gain_v
freq_resp = spb_resp
units = units_v
len = lv
end
(fft_sel ge 4) and (fft_sel le 5): begin ; AXB V channels.
gain = gain_v
freq_resp = axb_resp
units = units_v
len = lv
end
(fft_sel ge 6) and (fft_sel le 7): begin ; SPB EDC channels.
gain = gain_edc
freq_resp = spb_resp
units = units_edc
if fft_sel eq 6 then $
len = l12 else $
len = l34
end
(fft_sel eq 8): begin ; AXB EDC channels.
gain = gain_edc
freq_resp = axb_resp
units = units_edc
len = l56
end
(fft_sel ge 9) and (fft_sel le 11): begin ; SCM channels.
gain = gain_scm
freq_resp = scm_resp
units = units_scm
len = lscm
end
(fft_sel ge 12) and (fft_sel le 13): begin ; SPB EAC channels.
gain = gain_eac
freq_resp = spb_resp*eac_resp
units = units_eac
if fft_sel eq 12 then $
len = l12 else $
len = l34
end
(fft_sel eq 14): begin ; AXB EAC channels.
gain = gain_eac
freq_resp = axb_resp*eac_resp
units = units_eac
len = l56
end
(fft_sel ge 16) and (fft_sel le 17): begin ; EFI DQ channels.
gain = gain_edc
freq_resp = spb_resp
units = units_edc
len = l12
end
(fft_sel ge 18) and (fft_sel le 19): begin ; SCM DQ channels.
gain = gain_scm
freq_resp = scm_resp
units = units_scm
len = lscm
end
else: begin ; invalid source selection.
gain = !values.f_nan
freq_resp = !values.f_nan*fltarr( nbins)
units = 'undef'
len = !values.f_nan
end
endcase
; lump the ADC->Phys factor, boom length, and freq bin width into a single factor.
gain = (gain/len)^2/bin_width ; (unit/ADC)^2/Hz.
; Correct for Hanning window and bitshift from FFT processor
; Bitshift is 4 bits (i.e. *16), and Hanning correction is 4
gain/=64.
; convert the total voltage gains into attenuation factors for spectral density,
; and impose the MAX_ATTEN_FAC limit on the upscaling factor.
freq_resp = 1./freq_resp^2 < max_atten_fac
cal_pars = { $
cal_par_time:cal_par_time, $
gain:gain, ff:cent_freq, freq_resp:freq_resp, units:units $
}
return
end