Numpy БПФ дают неожиданный результат, когда частота сигнала падает точно на ячейку БПФ - PullRequest
1 голос
/ 27 февраля 2020

Когда частота сигнала падает точно на ячейку БПФ, амплитуда становится равной 0! Но если я немного сместлю частоту сигнала, результат будет в порядке.

Воспроизведение кода:

Здесь частота сигнала составляет 30

import numpy as np
import matplotlib.pyplot as plt
N = 1024
Freq = 30
t = np.arange(N)
x = np.sin(2*np.pi*Freq/N*t)
f = np.fft.fft(x)
plt.plot(t, x)
plt.plot(t, f)

Я бы ожидал на выходе должен быть огромный всплеск в 30-ом бине, но он плоский, как на следующем рисунке. enter image description here

Однако, если просто немного изменить частоту на 30,1, чтобы она не попала в точную ячейку,

import numpy as np
import matplotlib.pyplot as plt
N = 1024
Freq = 30.1
t = np.arange(N)
x = np.sin(2*np.pi*Freq/N*t)
f = np.fft.fft(x)
plt.plot(t, x)
plt.plot(t, f)

Результат правильный, как в следующий рисунок: enter image description here

ПОЧЕМУ? Это проблема реализации numpy FFT? Или это ограничение стандартного алгоритма БПФ?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

f - комплексное число, я должен использовать abs (f) для построения графика. Это ускользнуло от меня: P

0 голосов
/ 27 февраля 2020
  1. Чтобы получить спектр мощности, нужно взять величину коэффициента Фурье. Построение коэффициента Фурье напрямую отбрасывает мнимый компонент и только отображает реальный компонент.
  2. Технически, x и f не должны быть нанесены на одну и ту же ось x, поскольку они имеют разные значения.
import numpy as np
import matplotlib.pyplot as plt

T = 1 # Total signal duration (s)
N = 1024 # samples over signal duration
Freq = 30 # frequency: (Hz)
t = np.arange(N)/N*T # time array

df = 1.0/T # resolution of angular frequency
f = np.arange(N)*df


x = np.sin(2*np.pi*Freq*t)
xhat = np.fft.fft(x) # Fourier series of x

plt.plot(t, x)
plt.xlabel("t (s)")
plt.ylabel("x")
plt.savefig("fig1.png")

plt.cla()
plt.plot(f, np.abs(xhat))
plt.xlabel("f (Hz)")
plt.ylabel("|fft(x)|")
plt.savefig("fig2.png")

enter image description here enter image description here

...