Numpy FFT не дает ожидаемых результатов - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь найти частотный спектр в текущем сигнале от соленоида, управляемого драйвером 100 Гц с ШИМ. Сигнал дискретизируется с частотой 19200 Гц.

Ниже приведен график сигнала. Сигнал является частью данных более длинных временных рядов. 1024 точки данных извлекаются из 22 второй точки.

Текущий сигнал

Следующий код используется для анализа

import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)
plt.plot(t,y)

Fs=19200              # (Hz) sampling rate
N=len(y)   # length of signal
time=N/Fs #total time of signal, 1/time is the fundamantal frequency
freq=np.arange(N)/time  # frequency vector for fft spectrum plot
freq=freq[0:int(N/2)]  # one sided frequecy
Y=np.fft.fft(y)/N*2     # fft of signal
Y=Y[0:int(N/2)]         # one sided frequency

plt.figure(2)
plt.plot(freq,abs(Y))  # one sided frequency plot

plt.xlabel("Hz")
plt.ylabel("Units")
plt.title("FFT spectrum")
plt.grid()
plt.show()

Можно ожидать, что в спектре будет доминирующая составляющая 100 Гц, но результаты с бесформенным БПФ не отражают этого. Ниже приведен частотный график numpy.fft.

БПФ Спектр

Ниже приведен график анализа Matlab fft для аналогичного сигнала. Как и ожидалось, есть доминирующий компонент с частотой 100 Гц и его гармоники.

Сигнал для анализа Matlab fft

Matlab FFT спектр

1 Ответ

0 голосов
/ 29 июня 2018

Я бы посоветовал вам выполнить дискретное преобразование Фурье для функции, для которой вы уже знаете аналитический результат. Как только вы удовлетворены увиденным, вы запускаете несколько строк кода для чего-то, для чего вы не знаете результат, как я уже делал в этом обсуждении

Числовое преобразование Фурье прямоугольной функции

Как видите, как в Matlab, так и в Python смещение правой стороны спектра (fftshift (y)) должно выполняться до и после числового преобразования Фурье.

Вас также может заинтересовать так называемая теорема Найквиста, которая устанавливает минимальную частоту дискретизации, для которой может применяться числовое преобразование Фурье, но я не думаю, что в данный момент это ваша проблема, поскольку частота дискретизации ваш спектр выглядит довольно высоким.

Кстати, правильный способ выполнения быстрого преобразования Фурье для пошаговой функции с использованием python описан ниже

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-3, 3, 0.01)
y = np.zeros(len(x))
y[200:400] = 1
# Step function for which the Fourier Transform is well known to be sin(x)/x
yShift = np.fft.fftshift(y) 
# Shift of the N/2 sampling data on the right side to the left side
fftyShift = np.fft.fft(yShift)
# Numerical Fourier Transform (Lanczos)
ffty = np.fft.fftshift(fftyShift)
# Shift of the N/2 transformed data on the right side to the left side

plt.plot(ffty)
plt.show()
...