Space-Time Fourier Transform: Wavenumber-Frequency Domain Shift
13 views (last 30 days)
Show older comments
Hello, I am performing Time and Space domain Fourier Transform. The input data is 2D (x,t) organized in a matrix where each column represents a position in space and each row a time-sample. For the moment I need to go from space-time to space-frequency to wavenumber (kx)-frequency(w) and there apply a time-shift proportional to a depth difference zo=co*to that is a function of angle (and thus requiring using kz); then go back to space-time, so:
D(x,t)->D(x,w)->D(kx,w)->D(kx,w)*exp(-i*kz*zo)->D'(x,w)->D'(x,t)
which in the code are named as:
* D(x,t)=data; (data in the time-space domain)
* D(x,w)=w_data; (data in the frequency-space domain)
* D(kx,w)=wk_data; (data in the frequency-wavenumber domain)
* D(kx,w)*exp(-i*kz*zo)=shifted_wk_data; (shifted data in the frequency-wavenumber domain)
* D'(x,w)=shifted_w_data; (shifted data in the frequency-space domain)
* D'(x,t)=shifted_data; (shifted data in the time-space domain)
The ' is just to set it apart from the non-shifted data, it does not stand for transposition, differentiation or anything else.
I use the following: The input data, t_data is organized as -tmax:0:tmax (in time) and -xmax:0:xmax (in space), with the w following fft so: 0:wmax:-wmax:-dw, and similar for kx=0:kxmax:-kxmax:-dkx. w is angular frequency and kx is angular horizontal wavenumber. kz is then defined as:
kz= + sqrt((w/c)^2-kx^2) if w>0
kz= - sqrt((w/c)^2-kx^2) if w<0
w_data=fft(data,[],1);
wk_data=ifft(w_data,[],2);
shifted_wk_data=wk_data.*exp(-1i*kz.*dz);
shifted_w_data=fft(shifted_wk_data,[],2);
shifted_data=ifft(shifted_w_data,[],1,'symmetric');
The code is successfully applying the transformations and the data is organized properly, BUT after shifting, the amplitudes of the data are being reduced substantially.
I checked each domain separately and the output is correctly recovered:
- time-shifting: D(x,t)->D(x,w)->D(x,w)*exp(-i*w*to)->D(x,t-to)
- space-shifting: D(x,t)->D(kx,t)->D(kx,t)*exp(i*kx*xo)->D(x-xo,t)
The problem thus lies on the D(kx,w) implementation.
5 Comments
Matt J
on 12 Jun 2013
Edited: Matt J
on 12 Jun 2013
OK. But I still can't see anything suspicious other than the missing 2*pi coefficient mentioned below in my Answer.
You say only the amplitudes AFTER the shift look strange? So, shifted_data looks improperly scaled, but every other intermediate result looks fine? What if you set dz=0? In that case, you are just applying a succession of transforms followed directly by their inverses and you should get "data" back again. Is that not what happens?
Answers (2)
Matt J
on 12 Jun 2013
One thing that jumps out at me is that MATLAB FFTs assume frequencies are expressed in Hz, so instead of
exp(-1i*kz.*dz);
you should probably have
exp(-1i*2*pi*kz.*dz);
0 Comments
nadav potasman
on 11 May 2021
anyone solve the problem? i'm in the same situation.
one more question - why wk_data calculated by the inverst fft on the second diminsion? isn't suppose to be the fft2 of the data?
0 Comments
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!