fft#
- scipy.fft.fft(x, n=None, ось=-1, norm=None, overwrite_x=False, workers=None, *, plan=None)[источник]#
Вычислить одномерное дискретное преобразование Фурье.
Эта функция вычисляет 1-D n-точечное дискретное преобразование Фурье (ДПФ) с эффективным алгоритмом быстрого преобразования Фурье (БПФ) [1].
- Параметры:
- xarray_like
Входной массив, может быть комплексным.
- nint, необязательный
Длина преобразованной оси вывода. Если n меньше длины входных данных, входные данные обрезаются. Если больше, входные данные дополняются нулями. Если n не указана, длина ввода вдоль оси, заданной ось используется.
- осьint, необязательный
Ось, по которой вычисляется БПФ. Если не задана, используется последняя ось.
- norm{“backward”, “ortho”, “forward”}, опционально
Режим нормализации. По умолчанию “backward”, что означает отсутствие нормализации на прямых преобразованиях и масштабирование на
1/nнаifft. "forward" вместо этого применяет1/nкоэффициент на прямом преобразовании. Дляnorm="ortho", оба направления масштабируются на1/sqrt(n).Добавлено в версии 1.6.0:
norm={"forward", "backward"}были добавлены опции- overwrite_xbool, необязательно
Если True, содержимое x может быть уничтожен; по умолчанию False. Подробнее см. в примечаниях ниже.
- workersint, необязательный
Максимальное количество рабочих процессов для параллельных вычислений. Если отрицательное, значение оборачивается с
os.cpu_count(). Смотрите ниже для более подробной информации.- planобъект, опционально
Этот аргумент зарезервирован для передачи предварительно вычисленного плана, предоставленного поставщиками FFT. В настоящее время не используется в SciPy.
Добавлено в версии 1.5.0.
- Возвращает:
- выходкомплексный ndarray
Усечённый или дополненный нулями вход, преобразованный вдоль оси, указанной ось, или последний, если ось не указано.
- Вызывает:
- IndexError
if оси больше, чем последняя ось x.
Смотрите также
Примечания
FFT (Быстрое преобразование Фурье) относится к способу эффективного вычисления дискретного преобразования Фурье (DFT) с использованием симметрий в вычисляемых членах. Симметрия максимальна, когда n является степенью двойки, и преобразование поэтому наиболее эффективно для таких размеров. Для плохо факторизуемых размеров,
scipy.fftиспользует алгоритм Блюстейна [2] и поэтому никогда не хуже, чем O(n log n). Дальнейшее улучшение производительности может быть достигнуто дополнением входных данных нулями с помощьюnext_fast_len.Если
xявляется одномерным массивом, тогдаfftэквивалентноy[k] = np.sum(x * np.exp(-2j * np.pi * k * np.arange(n)/n))
Частотный член
f=k/nнаходится по адресуy[k]. Приy[n/2]мы достигаем частоты Найквиста и переходим к отрицательным частотам. Таким образом, для 8-точечного преобразования частоты результата: [0, 1, 2, 3, -4, -3, -2, -1]. Чтобы переупорядочить вывод fft так, чтобы нулевая частота была в центре, как [-4, -3, -2, -1, 0, 1, 2, 3], используйтеfftshift.Преобразования могут выполняться с одинарной, двойной или расширенной точностью (long double) с плавающей запятой. Входные данные с половинной точностью будут преобразованы в одинарную точность, а нечисловые входные данные будут преобразованы в двойную точность.
Если тип данных
xявляется вещественным, автоматически используется алгоритм "вещественного БПФ", который примерно вдвое сокращает время вычислений. Для дальнейшего повышения эффективности используйтеrfft, который выполняет те же вычисления, но выводит только половину симметричного спектра. Если данные вещественные и симметричные, тоdctможет снова удвоить эффективность, генерируя половину спектра из половины сигнала.Когда
overwrite_x=Trueуказана, память, на которую ссылаетсяxможет использоваться реализацией любым способом. Это может включать повторное использование памяти для результата, но это никоим образом не гарантируется. Не следует полагаться на содержимоеxпосле преобразования, так как это может измениться в будущем без предупреждения.The
workersАргумент задаёт максимальное количество параллельных задач для разделения вычисления БПФ. Это выполнит независимые одномерные БПФ внутриx. Итак,xдолжен быть как минимум 2-D, и непреобразованные оси должны быть достаточно большими, чтобы разбить на блоки. Еслиxслишком мал, может быть использовано меньше заданного количества задач.Ссылки
[1]Кули, Джеймс У., и Джон У. Тьюки, 1965, "Алгоритм для машинного вычисления комплексных рядов Фурье," Math. Comput. 19: 297-301.
[2]Bluestein, L., 1970, “A linear filtering approach to the computation of discrete Fourier transform”. IEEE Transactions on Audio and Electroacoustics. 18 (4): 451-455.
Примеры
>>> import scipy.fft >>> import numpy as np >>> scipy.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8)) array([-2.33486982e-16+1.14423775e-17j, 8.00000000e+00-1.25557246e-15j, 2.33486982e-16+2.33486982e-16j, 0.00000000e+00+1.22464680e-16j, -1.14423775e-17+2.33486982e-16j, 0.00000000e+00+5.20784380e-16j, 1.14423775e-17+1.14423775e-17j, 0.00000000e+00+1.22464680e-16j])
В этом примере действительный вход имеет БПФ, которое является эрмитовым, т.е. симметричным в действительной части и антисимметричным в мнимой части:
>>> from scipy.fft import fft, fftfreq, fftshift >>> import matplotlib.pyplot as plt >>> t = np.arange(256) >>> sp = fftshift(fft(np.sin(t))) >>> freq = fftshift(fftfreq(t.shape[-1])) >>> plt.plot(freq, sp.real, freq, sp.imag) [
, ] >>> plt.show()