Функция fftfreq
Функция fftfreq из модуля numpy.fft возвращает массив частот,
соответствующих элементам выходного массива дискретного преобразования Фурье.
Первый параметр n задаёт длину окна преобразования,
второй параметр d определяет шаг дискретизации (интервал между отсчётами).
Функция возвращает одномерный массив частот, где положительные частоты
расположены в первой половине, а отрицательные - во второй.
Синтаксис
np.fft.fftfreq(n, d=1.0)
Параметры:
-
n- длина окна преобразования (целое число); -
d- шаг дискретизации (float, по умолчанию 1.0).
Возвращаемое значение:
-
одномерный массив
ndarrayчастот длинойn.
Пример
Вычислим частоты для массива из 8 отсчётов с шагом дискретизации 1 секунда:
import numpy as np
freqs = np.fft.fftfreq(8)
print(freqs)
Результат выполнения кода:
[0. 0.125 0.25 0.375 -0.5 -0.375 -0.25 -0.125]
В результате получаем частоты от 0 до 0.5 Гц с положительным знаком,
затем отрицательные частоты от -0.5 до -0.125 Гц.
Пример
Изменим шаг дискретизации, чтобы получить физические частоты для сигнала с частотой дискретизации 1000 Гц (шаг 0.001 секунды):
import numpy as np
sample_rate = 1000
n = 1024
freqs = np.fft.fftfreq(n, d=1/sample_rate)
print(freqs[:10])
print(freqs[-10:])
Результат выполнения кода:
[0. 0.9765625 1.953125 2.9296875 3.90625
4.8828125 5.859375 6.8359375 7.8125 8.7890625]
[-502.9296875 -501.953125 -500.9765625 -500. -499.0234375
-498.046875 -497.0703125 -496.09375 -495.1171875 -494.140625]
Положительные частоты растут до 500 Гц, затем идут отрицательные частоты,
что соответствует теореме Найквиста.
Пример
Используем fftfreq вместе с fft для визуализации спектра сигнала:
import numpy as np
import matplotlib.pyplot as plt
sample_rate = 100
t = np.linspace(0, 1, sample_rate, endpoint=False)
signal = np.sin(2 * np.pi * 10 * t) + 0.5 * np.sin(2 * np.pi * 25 * t)
fft_vals = np.fft.fft(signal)
freqs = np.fft.fftfreq(sample_rate, d=1/sample_rate)
magnitude = np.abs(fft_vals)
print("First 5 frequencies:", freqs[:5])
print("First 5 magnitudes:", magnitude[:5])
Результат выполнения кода:
First 5 frequencies: [0. 1. 2. 3. 4.]
First 5 magnitudes: [6.66133815e-16 5.00000000e+01 2.28997518e-14
2.17622783e-14 7.73231121e-14]
На частотах 10 и 25 Гц будут пики амплитуды,
соответствующие частотам синусоид в сигнале.
Пример
Для чётного количества отсчётов частота Найквиста равна 0.5 / d,
а для нечётного - меньше. Сравним результаты:
import numpy as np
print("Even n=6:")
print(np.fft.fftfreq(6))
print("\nOdd n=7:")
print(np.fft.fftfreq(7))
Результат выполнения кода:
Even n=6:
[ 0. 0.16666667 0.33333333 -0.5 -0.33333333 -0.16666667]
Odd n=7:
[ 0. 0.14285714 0.28571429 0.42857143 -0.42857143 -0.28571429
-0.14285714]
Для нечётного n частота Найквиста не достигается,
а максимальная положительная частота меньше 0.5.