Как визуализировать БПФ сигнала в Юлии? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь визуализировать сигнал и его частотный спектр в Юлии.

Я нашел пакет FFTW , который обеспечивает БПФ и 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 Гц, но все, что я получил, былостранный результат:

Imgur

Сейчас я игнорирую отрицательные частоты.

Как мне это сделать в Джулии?

1 Ответ

1 голос
/ 08 мая 2019

То, что вы называете fs в вашем коде, - это не частота дискретизации, а обратная величина: период выборки.

Функция fftfreq принимает выборку rate в качестве второго аргумента. Поскольку в качестве второго аргумента вы указываете период выборки, частоты, возвращаемые функцией, неправильно масштабируются на (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")
...