Странный спектр БПФ от почти идеальной синусоиды - PullRequest
1 голос
/ 17 марта 2019

Я получил некоторый сигнал в моей симуляции Abaqus для проверки.Истинный сигнал должен быть идеальной синусоидой на частоте 300 кГц, и я произвел fft для дискретизированного сигнала, используя scipy.fftpack.fft.

Но я получил странный спектр, как показано ниже (извините, что я слишком ленив, чтобы масштабировать ось X спектра до правильной частоты).На том же рисунке я разрезал сигнал на части и построил график во временной области.Я также повторил тот же процесс для чистой синусоиды.enter image description here Это меня совершенно удивляет.Как указано ниже в коде, частота дискретизации составляет 16,66 от частоты сигнала.На данный момент, я думаю, это связано с очень маленькой ошибкой в ​​периоде выборки.Теоретически, Абакус должен отобрать его через регулярный промежуток времени.Как видите, есть небольшая ошибка, так что точки в моем сигнале кажутся более толстыми, чем идеальный сигнал.Но дает ли такая маленькая ошибка разительную разницу в частотном спектре?В противном случае, почему частотный спектр такой?


FYI1: Это увеличенный спектр моего сигнала: enter image description here

FYI2: Этокод python, который использовался для получения приведенных выше цифр

def myfft(x, k, label):
    plt.plot(np.abs(fft(x))[0:k], label = label)
    plt.legend()

plt.subplot(4,1,1)
for i in range(149800//200):
    plt.plot(mysignal[200*i:200*(i+1)], 'bo')
plt.subplot(4,1,2)
myfft(mysignal,150000//2, 'fft of my signal')
plt.subplot(4,1,3)
[Fs,f, sample] =  [5e6,300000, 150000]
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
for i in range(149800//200):
    plt.plot(y[200*i:200*(i+1)], 'bo')
plt.subplot(4,1,4)
myfft(y,150000//2, 'fft of a perfect signal')
plt.subplots_adjust(top = 2, right = 2)

FYI3: Здесь - мой сигнал в форматах .npy и .txt.Сигнал довольно длинный.Имеет 150001 баллов..txt - это необработанный файл от Abaqus.Формат .npy - это то, что я использовал для создания вышеприведенного графика - (1) вектор времени удаляется и (2) данные имеют половину точности и нормализуются.

1 Ответ

2 голосов
/ 17 марта 2019

Любой стандартный алгоритм БПФ, который вы используете, основан на предположении, что сигнал, который вы предоставляете, имеет одинаковую выборку.Равномерное в этом контексте означает одинаково разнесенное во времени.Ваш сигнал явно не равномерно дискретизирован, поэтому БПФ «не видит» идеальный синус, но искаженную версию.Как следствие, вы видите все эти дополнительные спектральные компоненты, которые FFT вычисляет, чтобы отобразить ваш искаженный сигнал в частотную область.У вас есть два варианта сейчас.Повторно сэмплируйте ваш сигнал, т. Е. Он будет равномерно дискретизирован, и используйте готовое БПФ или возьмите неоднородное БПФ для получения спектра.Вот одна библиотека, которую вы могли бы использовать для расчета неоднородного БПФ .

...