如何在 Julia 中可视化信号的 FFT?
How to visualize FFT of a signal in Julia?
我正在尝试在 Julia 中可视化信号及其频谱。
我找到了 FFTW package that provides the FFT and DSP 的频率。
这是我正在尝试的正弦信号:
using Plots
using FFTW
using DSP
# Number of points
N = 2^14 - 1
# Sample rate
fs = 1 / (1.1 * N)
# Start time
t0 = 0
tmax = t0 + N * fs
# time coordinate
t = [t0:fs:tmax;]
# signal
signal = sin.(2π * 60 * t) # sin (2π f t)
# Fourier Transform of it
F = fft(signal)
freqs = fftfreq(length(t), fs)
freqs = fftshift(freqs)
# plots
time_domain = plot(t, signal, title = "Signal")
freq_domain = plot(freqs, abs.(F), title = "Spectrum")
plot(time_domain, freq_domain, layout = 2)
savefig("Wave.pdf")
我希望看到一个峰值在 60 Hz 的漂亮图,但我得到的只是一个奇怪的结果:
我暂时忽略负频率。
我应该如何在 Julia 中执行此操作?
您在代码中所说的 fs
不是您的采样率,而是它的倒数:采样周期。
函数fftfreq
将采样率作为第二个参数。由于您作为第二个参数给出的是采样周期,因此函数返回的频率被错误地按 (1/(Ts^2))
.
缩放
我将fs
重命名为Ts
,并将fftfreq
的第二个参数更改为采样率1.0/Ts
。我认为您还需要移动 fft
的结果。
# Number of points
N = 2^14 - 1
# Sample period
Ts = 1 / (1.1 * N)
# Start time
t0 = 0
tmax = t0 + N * Ts
# time coordinate
t = t0:Ts:tmax
# signal
signal = sin.(2π * 60 .* t) # sin (2π f t)
# Fourier Transform of it
F = fft(signal) |> fftshift
freqs = fftfreq(length(t), 1.0/Ts) |> fftshift
# plots
time_domain = plot(t, signal, title = "Signal")
freq_domain = plot(freqs, abs.(F), title = "Spectrum", xlim=(-1000, +1000))
plot(time_domain, freq_domain, layout = 2)
savefig("Wave.pdf")
我正在尝试在 Julia 中可视化信号及其频谱。
我找到了 FFTW package that provides the FFT and DSP 的频率。
这是我正在尝试的正弦信号:
using Plots
using FFTW
using DSP
# Number of points
N = 2^14 - 1
# Sample rate
fs = 1 / (1.1 * N)
# Start time
t0 = 0
tmax = t0 + N * fs
# time coordinate
t = [t0:fs:tmax;]
# signal
signal = sin.(2π * 60 * t) # sin (2π f t)
# Fourier Transform of it
F = fft(signal)
freqs = fftfreq(length(t), fs)
freqs = fftshift(freqs)
# plots
time_domain = plot(t, signal, title = "Signal")
freq_domain = plot(freqs, abs.(F), title = "Spectrum")
plot(time_domain, freq_domain, layout = 2)
savefig("Wave.pdf")
我希望看到一个峰值在 60 Hz 的漂亮图,但我得到的只是一个奇怪的结果:
我暂时忽略负频率。
我应该如何在 Julia 中执行此操作?
您在代码中所说的 fs
不是您的采样率,而是它的倒数:采样周期。
函数fftfreq
将采样率作为第二个参数。由于您作为第二个参数给出的是采样周期,因此函数返回的频率被错误地按 (1/(Ts^2))
.
我将fs
重命名为Ts
,并将fftfreq
的第二个参数更改为采样率1.0/Ts
。我认为您还需要移动 fft
的结果。
# Number of points
N = 2^14 - 1
# Sample period
Ts = 1 / (1.1 * N)
# Start time
t0 = 0
tmax = t0 + N * Ts
# time coordinate
t = t0:Ts:tmax
# signal
signal = sin.(2π * 60 .* t) # sin (2π f t)
# Fourier Transform of it
F = fft(signal) |> fftshift
freqs = fftfreq(length(t), 1.0/Ts) |> fftshift
# plots
time_domain = plot(t, signal, title = "Signal")
freq_domain = plot(freqs, abs.(F), title = "Spectrum", xlim=(-1000, +1000))
plot(time_domain, freq_domain, layout = 2)
savefig("Wave.pdf")