Changeset 40
- Timestamp:
- Jun 10, 2014 10:41:57 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/doublefourier.py
r31 r40 39 39 print 'DoubleFourier.run' 40 40 41 # convert lengths to m. Wavenumbers leave as cm-1. 41 42 fts = self.previous_results['fts'] 42 43 fts_wn = fts['fts_wn'] 43 opd_max = fts['opd_max'] 44 fts_wn_truncated = fts['fts_wn_truncated'] 45 opd_max = fts['opd_max'] / 100.0 44 46 fts_nsample = fts['ftsnsample'] 45 vdrive = fts['vdrive'] 47 vdrive = fts['vdrive'] / 100.0 46 48 delta_opd = fts['delta_opd'] 49 delta_time = delta_opd / vdrive 47 50 48 51 times = np.arange(int(fts_nsample), dtype=np.float) 49 times *= (opd_max / vdrive) / float(fts_nsample-1) 52 times *= delta_time 53 opd_start = -((fts_nsample + 1) / 2) * delta_opd 50 54 51 55 beamsgenerator = self.previous_results['beamsgenerator'] … … 57 61 skymodel = skygenerator['sky model'] 58 62 spatial_axis = self.result['spatial axis'] = skygenerator['spatial axis'] 59 self.result['frequency axis'] = fts_wn 63 self.result['frequency axis'] = fts_wn_truncated 60 64 61 65 # assuming nx is even then transform has 0 freq at origin and [nx/2] is … … 70 74 self.result['baseline interferograms'] = collections.OrderedDict() 71 75 # for baseline in bxby: 72 for baseline in bxby[: 3]:73 print baseline76 for baseline in bxby[:1]: 77 print 'baseline', baseline 74 78 measurement = np.zeros(np.shape(times)) 79 opd = np.zeros(np.shape(times)) 75 80 76 81 # FTS path diff and possibly baseline itself vary with time … … 78 83 79 84 # calculate the sky that the system is observing at this 80 # moment, incorporating various errors in turn 81 sky_now = skymodel 85 # moment, incorporating various errors in turn. Be explicit 86 # about the copy otherwise a reference is made instead. 87 sky_now = skymodel.copy() 82 88 83 89 # 1. baseline should be perp to centre of field. … … 108 114 # calculate fourier phase shift to move point at [0,0] to 109 115 # [rowpos, colpos] 110 print 'shift', colpos, rowpos111 116 shiftx = np.zeros([nx], np.complex) 112 117 shiftx[:nx/2] = np.arange(nx/2, dtype=np.complex) … … 127 132 jobs = {} 128 133 # go through freq planes and shift them 129 for iwn,wn in enumerate(fts_wn ):134 for iwn,wn in enumerate(fts_wn_truncated): 130 135 # submit jobs 131 136 indata = (sky_now[:,:,iwn], shift,) … … 133 138 indata, (), ('numpy',)) 134 139 135 for iwn,wn in enumerate(fts_wn ):140 for iwn,wn in enumerate(fts_wn_truncated): 136 141 # collect and store results 137 142 temp = jobs[wn]() … … 139 144 140 145 if t == times[0]: 141 self.result['sky at time 0'] = sky_now 146 # take copy of array to fix a snapshot of it now 147 self.result['sky at time 0'] = sky_now.copy() 142 148 143 149 # 2. telescopes should be centred on centre of field … … 163 169 164 170 if t == times[0]: 165 self.result['sky*beams at time 0'] = sky_now 171 # take copy of array to fix a snapshot of it now 172 self.result['sky*beams at time 0'] = sky_now.copy() 166 173 167 174 # 3. baseline error revisited … … 180 187 fft_now = np.zeros(np.shape(sky_now), np.complex) 181 188 spectrum = np.zeros(np.shape(fts_wn), np.complex) 182 for iwn,wn in enumerate(fts_wn ):189 for iwn,wn in enumerate(fts_wn_truncated): 183 190 184 191 # derive shift needed to place baseline at one of FFT coords … … 196 203 colpos = 0.0 197 204 rowpos = 0.0 198 print 'spatial colpos, rowpos', colpos, rowpos199 205 200 206 # calculate fourier phase shift to move point at [rowpos,colpos] to … … 226 232 227 233 # set amp/phase at this frequency 228 spectrum[ iwn] = temp[0,0]234 spectrum[wn==fts_wn] = temp[0,0] 229 235 230 236 if t == times[0]: 231 self.result['skyfft at time 0'] = fft_now 237 self.result['skyfft at time 0'] = fft_now.copy() 232 238 233 239 axis = co.Axis(data=fts_wn, title='wavenumber', … … 242 248 243 249 if t == times[0]: 244 # test version250 # test interferogram 245 251 # inverse fft of emission spectrum at this point 246 temp = np.fft.ifft(spectrum) 247 pos = np.fft.rfftfreq(len(spectrum)) 252 reflected_spectrum = np.zeros([2*(len(spectrum)-1)], 253 np.complex) 254 reflected_spectrum[:len(spectrum)].real = spectrum 255 reflected_spectrum[len(spectrum):].real = spectrum[-2:0:-1] 256 257 temp = np.fft.ifft(reflected_spectrum) 258 pos = np.fft.fftfreq(len(reflected_spectrum), d=fts_wn[1]-fts_wn[0]) 248 259 249 260 # move 0 frequency to centre of array … … 253 264 axis = co.Axis(data=pos, title='path difference', 254 265 units='cm') 255 temp = co.Spectrum(data=temp, 266 temp = co.Spectrum(data=temp, axis=axis, 256 267 title='Detected interferogram', units='') 257 268 … … 259 270 260 271 mirror_error = 0.0 261 opd = 2.0 * (vdrive * t + mirror_error) 262 print 'opd', opd, vdrive, t, mirror_error 263 opd_ipos = opd / delta_opd 264 265 # make spectrum symmetric 272 opd[tindex] = opd_start + (vdrive * t + mirror_error) 273 opd_ipos = opd[tindex] / delta_opd 274 275 # calculate shift needed to move point at opd to 0 266 276 nfreq = len(fts_wn) 267 symmetric_spectrum = np.zeros([2*nfreq]) 268 symmetric_spectrum[:nfreq] = spectrum 269 symmetric_spectrum[nfreq:] = spectrum[::-1] 270 271 # calculate shift needed to move point at opd to 0 272 shift = np.zeros([2*nfreq], dtype=np.complex) 277 ndoublefreq = 2 * (nfreq - 1) 278 shift = np.zeros([ndoublefreq], dtype=np.complex) 273 279 shift[:nfreq] = np.arange(nfreq, dtype=np.complex) 274 shift[nfreq:] = np.arange(-nfreq, 0, dtype=np.complex) 275 shift = np.exp((-2.0j * np.pi * opd_ipos * shift) / float(nfreq)) 280 shift[nfreq:] = np.arange(nfreq, dtype=np.complex)[-2:0:-1] 281 shift = np.exp((-2.0j * np.pi * opd_ipos * shift) / \ 282 float(ndoublefreq)) 283 284 # reflect spectrum about 0 to give unaliased version 285 reflected_spectrum = np.zeros([2*(len(spectrum)-1)], np.complex) 286 reflected_spectrum[:len(spectrum)].real = spectrum 287 reflected_spectrum[len(spectrum):].real = spectrum[-2:0:-1] 276 288 277 289 # apply phase shift and fft 278 symmetric_spectrum *= shift279 spectrum_fft = np.fft. fft(symmetric_spectrum)290 reflected_spectrum *= shift 291 spectrum_fft = np.fft.ifft(reflected_spectrum) 280 292 measurement[tindex] = spectrum_fft[0] 281 293 294 # if np.array_equal(baseline, bxby[0]): 295 # if 'skyfft check' not in self.result.keys(): 296 # self.result['skyfft check'] = {} 297 # temp = co.Spectrum(data=spectrum_fft, 298 # title='Test interferogram', units='') 299 # self.result['skyfft check'][t] = temp 300 301 axis = co.Axis(data=np.array(opd), title='path difference', 302 units='cm') 303 temp = co.Spectrum(data=measurement, axis=axis, 304 title='Detected interferogram', units='') 282 305 self.result['baseline interferograms'][tuple(baseline)] = \ 283 measurement306 temp 284 307 285 308 return self.result
Note:
See TracChangeset
for help on using the changeset viewer.