function spectra_2d_remake,data,f0=f0,f1=f1,w0=w0,w1=w1,noisy=noisy,plot=plot,test=test,data1=data1,nofloat=nofloat ; Purpose: reconstruct the original data from a portion of the spectrum ; Category: statistics maths ; Keywords: ; f0=f0 [default 0] - lowest frequency retained ; f1=f1 [default 0.5] - highest frequency retained ; w0=w0 [default wmin] - most negative wavenumber retained ; w1=w1 [default wmax] - most positive wavenumber retained ; /nofloat - inhibit conversion of result to floating, only useful if the ; input array was complex ; /noisy - print out some info about whats removed (mostly used only for debug) ; /test - used only for debug ; /plot - used only for debug ; data1=data1 - return array of filtered fft values (mostly used only for debug) ; Example: @comm_error ; Check the data dimensions are even (not a real requirement but simplifies) s=size(data) if (s(0) ne 2) then message,'Require 2-d array' if ((s(1) mod 2 ne 0) or (s(2) mod 2 ne 0)) then message,'Require both dimensions to be even' ; Keywords if (n_elements(f0) eq 0) then f0=0 if (n_elements(f1) eq 0) then f1=0.5 ; Define some useful numbers m=s(1) ; Space m1=m/2 n=s(2) ; Time n1=n/2 freq=indgen(n1+1)/float(n) freq1=indgen(n)/float(n) wn=[indgen(m1+1),reverse(-indgen(m1-1)-1)] wn1=[0,-indgen(m1-1)-1,reverse(indgen(m1)+1)] if (n_elements(w0) eq 0) then w0=-m1 if (n_elements(w1) eq 0) then w1=m1 ; Compute FFT data1=fft(data) if (keyword_set(test)) then data1(*,*)=1 ; Remove bits we don't want (frequency) i=where(freq lt f0 or freq gt f1,count) if (count gt 0) then begin data1(*,i)=0 if (keyword_set(noisy)) then print,'Removing (freq): ',i endif j=where(i gt 0 and i lt n1,count) if (count gt 0) then begin data1(*,n-i(j))=0 if (keyword_set(noisy)) then print,'Removing (freq): ',n-i(j) endif if (keyword_set(noisy)) then print,'Removed ',(count/float(n))*100,'% of frequencies, leaving #',n-count ; Remove bits we don't want (wavenumber) i=where(wn lt w0 or wn gt w1,count) if (keyword_set(noisy) and count gt 0) then print,'Removing (wave (+ve freq)): ',wn(i),i if (keyword_set(plot) and count gt 0) then for f=0,n1 do plots,wn(i),freq(f),psym=2 if (count gt 0) then data1(i,0:n1)=0 i=where(wn1 lt w0 or wn1 gt w1,count) if (keyword_set(noisy) and count gt 0) then print,'Removing (wave (-ve freq)): ',wn1(i),i if (keyword_set(plot) and count gt 0) then for f=n1+1,n-1 do plots,wn1(i),freq1(f),psym=4 if (count gt 0) then data1(i,n1+1:n-1)=0 ; Remake data2=fft(data1,/inv) ; Convert to float, usually if (not keyword_set(nofloat)) then data2=float(data2) ; Return return,data2 end