Space-Time Fourier Transform: Wavenumber-Frequency Domain Shift

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

There is no resemblance between your notation D(x,t), D(kx,t), etc... and your code. That's making it very hard to interpret what corresponds to what.
D(x,t) makes reference to the data in the space-time domain, in the code is called 'data' and so on...
What do you mean "and so on"? I see no pattern to the notation.
Is wk_data the same as D(kx,w) or is there a wkx_data somewhere else in your workspace?
Originally you wrote exp(-1i*kz.*zo), but in your code, I see exp(-1i*kz.*dz). Are zo and dz the same?
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.
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)

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

Asked:

on 12 Jun 2013

Answered:

on 11 May 2021

Community Treasure Hunt

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

Start Hunting!