I’m trying to learn some basic Non-Uniform FFT.
I want to see if I can get a frequency spectrum of a laser pulse with a NUFFT type 1 using the FINUFFT.jl library.
Here’s the example:
using FFTW using FINUFFT c = 2.998e8; #m/s speed of light wl = 525.0e-9; #m wavelength pl = wl/c; #period wlfreq = c/wl; #2pi*Hz frequency fwhm = 500.0e-15; #temporal fwhm tau0 = fwhm/sqrt(2*log(2)); #gaussian fwhm tlbw = 0.44/fwhm #transform limited bandwidth maxf = c/wl +tlbw minf = c/wl-tlbw df = (maxf - minf)/1.0e3 #simulation dt = pl/5.0; t0 = -2.0*fwhm tend = 2.0*fwhm ttot = ceil(Int64,(tend-t0)/dt) E = [exp(-t^2/tau0^2)*cos(2.0*pi*wlfreq*t) for t in t0:dt:tend]; t = [i for i in t0:dt:tend]; lent = length(E) Nt = length(t);
The pulse looks like:
Taking the fft:
freq = FFTW.fftshift(FFTW.fftfreq(lent,1/dt)) Ef = FFTW.fftshift(FFTW.fft(E)); If = abs2.(Ef); #intensity spectrum
Which is exactly what I expect.
Now I want to us a NUFFT type 1 according to:
I decide to take nonuniform points in the form of a tangent curve so as to get most of the FWHM of the pulse:
#nonuniform indices to extract sampling points #using tangent curve maxpi = pi*22.0/100.0; dpi = 2.0*maxpi/(lent/2); l = [i for i in -maxpi:dpi:maxpi]; tt = @. tan(1.95*l); ttt = @. -tt+tt; ttt = @. ttt*lent/8.81+1; t4 = @. ceil(Int64,ttt); #extract nonuniform points Enu = convert.(ComplexF64,E[t4]); #field at nonuniform points tnu = t[t4]; #time at noniniform points lentnu = length(Enu)
This looks like:
wmax = freq[end]; #max freq get from previous FFTW, around 1.5e15 Nw = length(freq); #number of total points| dw = 2*wmax/Nw; # spacing of target k grid| w = dw .* [i for i in ceil(Int64,-Nw/2):ceil(Int64,Nw/2-1)]; # % a particular uniform M-grid of this spacing| #normalize Enunorm = Enu ./ maximum(E) fhat = FINUFFT.nufft1d1(tnu, Enunorm, 1, 1.0e-12, Nw); #% type 1, requesting M modes
And the intensity spectrum looks like:
Not sure what to make of it. The amplitudes change but by an extremely small bit?
The main pulse frequency is off by more than 2.