Когда частота сигнала падает точно на ячейку БПФ, амплитуда становится равной 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-ом бине, но он плоский, как на следующем рисунке.
Однако, если просто немного изменить частоту на 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)
Результат правильный, как в следующий рисунок:
ПОЧЕМУ? Это проблема реализации numpy FFT? Или это ограничение стандартного алгоритма БПФ?