Проблема, скорее всего, связана с тем, что numpy's linspace()
.Режим по умолчанию включает конечную точку stop
.Так что time
это 0, 1/999, 2/999, ..., 1
.Напротив, fft
обрабатывает сигнал длиной N
как периодический сигнал, дискретизированный при 0, T/N, ... , T(N-1)/N
, таким образом избегая избыточности конечной точки.Поэтому в вычисленном DFT используется кадр длины T = 1000/999.Следовательно, частоты ДПФ равны k * 999/1000, а не k.Поскольку длина кадра не кратна периоду сигнала (1/6 с), возникает проблема, называемая спектральная утечка .
Чтобы избежать спектральной утечки, длинакадр можно сократить до кратного периода, удалив конечную точку:
time = np.linspace(0,1,1000,endpoint=False)
Возвращает time
как 0, 1/1000, .... 999/1000, обработано DFTкак кадр длины 1, который кратен периоду входного сигнала (1/6 с).
Если длинакадр не кратен периоду сигнала, входной сигнал может быть оконным , чтобы частично смягчить эффект, связанный с разрывом на краю кадра, но импульсные частоты все еще существуют.Наконец, фактические частоты могут быть надлежащим образом вычислены путем оценки частоты пика в качестве его средней частоты с учетом плотности мощности.См. Мой ответ на Почему значения частоты округляются в сигнале с использованием БПФ?