# Frequency-wavenumber spectrum?

**URL:** <https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821>\
**Category:** General Usage\
**Tags:** question, fftw, fourier\
**Created:** [June 18, 2024, 6:45pm UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821 "2024-06-18T18:45:33Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)\
**Post date:** [June 18, 2024, 6:45pm UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/1 "2024-06-18T18:45:33Z")

</div>

Hi everyone.  
I have some 2D data in time and space. I am trying to do some Frequency-wavenumber analysis. Anyone has a code to compute the proper Frequency-wavenumber spectrum?

Let me know.  
Kind regards.  
M.

---

<div class="post-metadata">

**Author:** ![abraemer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abraemer/32/51403_2.png) [@abraemer](https://discourse.julialang.org/u/abraemer)\
**Post date:** [June 18, 2024, 8:33pm UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/2 "2024-06-18T20:33:16Z")

</div>

You mean you want to compute a FFT? Have a look at FFTW.jl 🙂

---

<div class="post-metadata">

**Author:** ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)\
**Post date:** [June 19, 2024, 12:01pm UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/3 "2024-06-19T12:01:25Z")

</div>

I want a 2D FFT and then I need to do something like fftshift in 2D. I am unsure this is enough to achieve:

> **[capon\_1969-ieee-high-resolution\_frequency-wavenumber\_spectrum\_analysis.pdf](https://epsc.wustl.edu/~ggeuler/reading/cam_noise_biblio/capon_1969-ieee-high-resolution_frequency-wavenumber_spectrum_analysis.pdf)**
>
> 889.98 KB

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [June 19, 2024, 8:09pm UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/4 "2024-06-19T20:09:38Z")

</div>

Then you use FFTW.jl and the functions `fft` (or one of its variants) and `fftshift`.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [June 19, 2024, 11:45pm UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/5 "2024-06-19T23:45:59Z")

</div>

Using FFTW.jl and Plots.jl you can get a simple FK plot like this for two waves travelling at different speeds:

 ![FK_plot](https://global.discourse-cdn.com/julialang/original/3X/6/f/6fec6ab98af0a0c4e463dc86d5978ca0a7cb758f.png)

> **Code**
>
> ```julia
> # 1 - Define an oscillatory signal:
> f(t,t0) = (t>t0) ? sin(2π*30*(t - t0)) * exp(-20*(t - t0)) : 0
> 
> # 2- Create input wavefield with two propagating waves:
> Nt, Nx = 1001, 201
> t = LinRange(0., 2., Nt) # time (s)
> x = LinRange(0., 1000., Nx) # distance (m)
> Vp, Vs = 2000., 1100. # velocity (m/s)
> Wt = f.(t', x/Vp) + f.(t', x/Vs) 
> 
> # 3 - Compute FK spectrum
> using FFTW, Printf
> Wf = abs.(fft(Wt)')
> FK = 20*log10.(Wf .+ 1e-3*maximum(Wf))
> FK0 = reverse(fftshift(FK[1:(Nt÷2+1),:], 2), dims=2) # physicists' FFT2D has opposite signs for time and space (outward travelling waves)
> fi = rfftfreq(Nt, 1/(t[2]-t[1]))
> ki = fftshift(fftfreq(Nx, 1/(x[2]-x[1])))
> 
> # 4 - Plot data
> using Plots, Measures; gr(dpi=600, size=(1000,600))
> p1 = heatmap(x, t, Wt', yflip=true, xlabel="x [m]", ylabel="t [s]")
> p2 = heatmap(ki, fi, FK0, xlabel="k [1/m]", ylabel="f [Hz]", c=:jet)
> plot(p1, p2, margins=10mm)
> 
> ```

The aliasing is clearly seen.  
Some numerical artifacts, due to the input not being periodic, would require additional work to minimize.

---

<div class="post-metadata">

**Author:** ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)\
**Post date:** [June 20, 2024, 6:45am UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/6 "2024-06-20T06:45:39Z")

</div>

Hi @rafael.guerra can you send me the lines for this example?

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [June 20, 2024, 11:30am UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/7 "2024-06-20T11:30:28Z")

</div>

The code was posted below the figure.

---

<div class="post-metadata">

**Author:** ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)\
**Post date:** [June 20, 2024, 1:55pm UTC](https://discourse.julialang.org/t/frequency-wavenumber-spectrum/115821/8 "2024-06-20T13:55:06Z")

</div>

Sorry. I did not see! Thanks a lot!
