Space-Time Fourier Transform: Wavenumber-Frequency Domain Shift

13 views (last 30 days)
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
Marina
Marina on 12 Jun 2013
yes, D(kx,w)=wk_data, as for the others I actually edited the question to include this info. So again:
  • 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)
And yes, zo=dz.
Matt J
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?

Sign in to comment.

Answers (2)

Matt J
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);

nadav potasman
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?

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!