#python #numpy #fft #dft
Вопрос:
Я новичок в Python и обработке сигналов, и у меня возникли проблемы с FFT.
Я должен проанализировать набор данных и найти по ним частоты модуляции. Для этого я написал базовый сценарий FFT, и результат выглядел довольно странно. Он показывает пики, как обычный график БПФ. Однако для каждой линии она имеет горизонтальную линию, которая соединяет два конца, а не концы, расходящиеся в стороны.
Я хотел бы спросить, в чем здесь может быть проблема.
Это мой сценарий:
from numpy.fft import fft, fftfreq
import matplotlib.pyplot as plt
Nsample = len(data)
n=96 #for zero-padded
window = np.hanning(Nsample/2) #Hann window
data1 = data[(data['condition']=='a')]
data2 = data[(data['condition']=='b')]
#Apply Hann window then do FFT
data1_Hann = data1['val']*window
data1_FFT = fft(data1_Hann, n)
freq1 = fftfreq(n, d=0.026)
data2_Hann = data2['val']*window
data2_FFT = fft(data2_Hann, n)
freq2 = fftfreq(n, d=0.026)
plt.plot(freq1, np.abs(data1_FFT), freq2, np.abs(data2_FFT))
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
data
это DataFrame
содержит значения 2 различных условий, перемешанных вместе, поэтому я разделяю их, и окно Ханнинга применяется для половины начального номера выборки. Для каждого условия есть только 12 значений, поэтому я делаю заполнение нуля, чтобы пики отображались четко, а график выглядел более гладким (я пробовал использовать меньшее число для заполнения нуля, но линия все еще остается).
Комментарии:
1. Уверены, что ваш сюжет не просто снова разворачивается к началу и соединяет начальную и конечную точки?
2. @gavinb О, спасибо за ваш комментарий, я нашел причину. Кажется, что он начинается с середины, идет по положительному направлению частотной оси, а затем возвращается к отрицательному концу. Я также нашел способ отредактировать его. Большое спасибо!
3. np.fft.fftshift может быть вам полезен
4. @yanziselman да, спасибо. Я тоже это понял.
Ответ №1:
Ответ: График выглядит так из-за порядка вывода расчета бпф: он начинается с 0 Гц (более подробная информация представлена здесь: https://numpy.org/doc/stable/reference/generated/numpy.fft.fftfreq.html)
Я исправил это с помощью функции numpy.fft.fftshift () (более подробная информация представлена здесь: https://numpy.org/doc/stable/reference/generated/numpy.fft.fftshift.html).
Решение было предложено @gavinb и @yanziselman.