Почему на моих графиках БПФ есть эти горизонтальные линии?

#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.