Space-Time Fourier Transform: Wavenumber-Frequency Domain Shift
13 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaires
Matt J
le 12 Juin 2013
Modifié(e) : Matt J
le 12 Juin 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?
Réponses (2)
Matt J
le 12 Juin 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 commentaires
nadav potasman
le 11 Mai 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 commentaires
Voir également
Catégories
En savoir plus sur Discrete Fourier and Cosine Transforms dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!