Как время преобразуется в частоту в БПФ - PullRequest
2 голосов
/ 07 января 2020

Я новичок в FFT и пытаюсь понять код Python, пытаясь вручную выполнить тестирование. Причина, по которой я тестирую, состоит в том, чтобы шаг за шагом понимать БПФ.

import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import fft, fftfreq

n = 1000 #Number of samples on x axis
Lx = 100 #Time period in seconds
omg = 2.0*np.pi/Lx #Frequency is in cycles per second. Multiplying by 2π gives the frequency in radians

x = np.linspace(0, Lx, n)# np.linspace(start = val, stop = val, num = val), here 0 to 100 with 1000 numbers

#A Sine wave with 1 wave with 1 amplitude
y = (1.0*np.sin(1.0*omg*x))

freqs = fftfreq(n)
#print('FFT Values freqs ',freqs[mask])

# Used to ignore half the values
mask = freqs > 0

# fft values
fft_vals = fft(y)

#Theoritical FFT
fft_theo = 2.0*np.abs(fft_vals/n)
#print('FFT Amplitude ',fft_theo[mask])
plt.figure(1)
plt.title('Original Signal')
plt.plot(x, y)
plt.xlabel('Time in seconds')
plt.ylabel('Amplitude')
plt.legend()

plt.figure(2)
plt.title('FFT values using Mask')
plt.plot(freqs[mask], fft_theo[mask], color='xkcd:salmon')
plt.xlabel('Frequency in Hz')
plt.ylabel('Amplitude')
plt.legend()

plt.show

Ниже приводится мое понимание программы. Вход представляет собой синусоидальную волну с амплитудой 1, а ось x - время в периодах, которое 100s Теперь длина одной волны равна 2 PI, которая делится на 1000. Я понял, что ввод одной синусоиды со временем по оси x и амплитудой по оси y

Для преобразования этого времени в частоту используется функция fftfreq. , Здесь я не понимаю, как эта функция конвертируется. Чтобы игнорировать отрицательные значения, переменная маски должна содержать только частоты, которые больше 0. Опять же я не понимаю, как или почему мы должны вызывать функцию fft для преобразования амплитуды, потому что амплитуда должна оставаться неизменной, и только время должно быть преобразовано в частоту. .

Затем вычисляется теоретическое значение fft_theo = 2,0 * np.abs (fft_vals / n), так что результат будет таким, как ожидалось

enter image description here

enter image description here

Также в выводе я не понял, почему амплитуда равна 1 на частоте 0.

Пожалуйста, помогите мне понять БПФ с точки зрения непрофессионала.

Спасибо, Аша

1 Ответ

0 голосов
/ 07 января 2020

Величина БПФ не преобразует время в частоту для одной синусоиды.

Вместо этого она разлагает, возможно, гораздо более интересные формы сигнала.

Она преобразует форму волны, предположительно состоящую из суммы из огромного числа синусоид, в массив, содержащий количество каждой частоты, коррелированное с набором N / 2 синусоид с различными частотами.

Пик, который вы видите в нижней части графика, указывает на одну сильную корреляцию против чрезвычайно низкой частоты (по сравнению с диапазоном X вашего графика). С огромным количеством корреляций против более высоких частот все ноль.

...