stft#
- scipy.signal.stft(x, fs=1.0, window='hann', nperseg=256, noverlap=None, nfft=None, detrend=False, return_onesided=True, границе='zeros', дополненный=True, ось=-1, масштабирование='spectrum')[источник]#
Вычислите кратковременное преобразование Фурье (устаревшая функция).
STFT можно использовать как способ количественной оценки изменения частотного и фазового содержания нестационарного сигнала во времени.
Наследие
Эта функция считается устаревшей и больше не будет получать обновления. Хотя в настоящее время у нас нет планов по ее удалению, мы рекомендуем, чтобы новый код использовал более современные альтернативы.
ShortTimeFFTявляется более новой реализацией STFT / ISTFT с большим количеством функций. A сравнение между реализациями можно найти в Кратковременное преобразование Фурье раздел Руководство пользователя SciPy.- Параметры:
- xarray_like
Временной ряд значений измерений
- fsfloat, опционально
Частота дискретизации x временной ряд. По умолчанию 1.0.
- windowstr или tuple или array_like, опционально
Желаемое окно для использования. Если window является строкой или кортежем, он передаётся в
get_windowдля генерации значений окна, которые по умолчанию являются DFT-чётными. См.get_windowдля списка окон и требуемых параметров. Если window если это array_like, он будет использоваться напрямую как окно, и его длина должна быть nperseg. По умолчанию используется окно Ханна.- npersegint, необязательный
Длина каждого сегмента. По умолчанию 256.
- noverlapint, необязательный
Количество точек перекрытия между сегментами. Если None,
noverlap = nperseg // 2. По умолчанию None. При указании ограничение COLA должно выполняться (см. примечания ниже).- nfftint, необязательный
Длина БПФ, используемая, если требуется дополненное нулями БПФ. Если None, длина БПФ равна nperseg. По умолчанию None.
- detrendstr или функция или False, опционально
Определяет, как удалять тренд в каждом сегменте. Если
detrendявляется строкой, она передается как тип аргумент дляdetrendфункция. Если это функция, она принимает сегмент и возвращает сегмент с удалённым трендом. Еслиdetrendявляется False, детрендинг не выполняется. По умолчанию False.- return_onesidedbool, необязательно
Если True, возвращает односторонний спектр для реальных данных. Если False возвращает двусторонний спектр. По умолчанию True, но для комплексных данных всегда возвращается двусторонний спектр.
- границеstr или None, опционально
Определяет, расширяется ли входной сигнал на обоих концах, и как генерируются новые значения, чтобы центрировать первый сегмент с окном на первой входной точке. Это позволяет восстановить первую входную точку, когда используемая оконная функция начинается с нуля. Допустимые варианты:
['even', 'odd', 'constant', 'zeros', None]. По умолчанию 'zeros', для расширения нулевым заполнением. Т.е.[1, 2, 3, 4]расширяется до[0, 1, 2, 3, 4, 0]дляnperseg=3.- дополненныйbool, необязательно
Определяет, дополняется ли входной сигнал нулями в конце, чтобы сигнал точно вписывался в целое число сегментов окна, чтобы весь сигнал был включен в выходные данные. По умолчанию True. Дополнение происходит после расширения границ, если границе не является None, и дополненный является True, как это установлено по умолчанию.
- осьint, необязательный
Ось, вдоль которой вычисляется STFT; по умолчанию — по последней оси (т.е.
axis=-1).- scaling: {‘spectrum’, ‘psd’}
Масштабирование по умолчанию 'spectrum' позволяет каждой частотной линии Zxx интерпретироваться как спектр амплитуд. Опция 'psd' масштабирует каждую линию до спектральной плотности мощности - это позволяет вычислить энергию сигнала путём численного интегрирования по
abs(Zxx)**2.Добавлено в версии 1.9.0.
- Возвращает:
- fndarray
Массив частот выборки.
- tndarray
Массив времен сегментов.
- Zxxndarray
STFT от x. По умолчанию последняя ось Zxx соответствует временам сегментов.
Смотрите также
istftОбратное коротковременное преобразование Фурье
ShortTimeFFTНовая реализация STFT/ISTFT с большим количеством функций.
check_COLAПроверить, выполняется ли ограничение Constant OverLap Add (COLA)
check_NOLAПроверить, выполняется ли ограничение Nonzero Overlap Add (NOLA)
welchСпектральная плотность мощности методом Уэлча.
spectrogramСпектрограмма методом Уэлча.
csdСпектральная плотность мощности методом Уэлча.
lombscargleПериодограмма Ломба-Скаргла для неравномерно дискретизированных данных
Примечания
Чтобы включить инверсию STFT через обратное STFT в
istft, оконное преобразование сигнала должно удовлетворять условию "Ненулевого Перекрытия с Суммированием" (NOLA), и входной сигнал должен иметь полное покрытие оконным преобразованием (т.е.(x.shape[axis] - nperseg) % (nperseg-noverlap) == 0). дополненный аргумент может быть использован для достижения этого.Для сигнала во временной области \(x[n]\), окно \(w[n]\), и размер шага \(H\) = nperseg - noverlap, оконный кадр во временном индексе \(t\) задается формулой
\[x_{t}[n]=x[n]w[n-tH]\]Уравнение реконструкции с наложением-сложением (OLA) задаётся как
\[x[n]=\frac{\sum_{t}x_{t}[n]w[n-tH]}{\sum_{t}w^{2}[n-tH]}\]Ограничение NOLA гарантирует, что каждый нормировочный член, появляющийся в знаменателе уравнения реконструкции OLA, ненулевой. Независимо от выбора window, nperseg, и noverlap удовлетворяющие этому ограничению могут быть проверены с помощью
check_NOLA.Добавлено в версии 0.19.0.
Ссылки
[1]Оппенгейм, Алан В., Рональд В. Шафер, Джон Р. Бак "Обработка дискретных сигналов", Prentice Hall, 1999.
[2]Дэниел В. Гриффин, Джей С. Лим «Оценка сигнала по модифицированному кратковременному преобразованию Фурье», IEEE 1984, 10.1109/TASSP.1984.1164317
Примеры
>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng()
Сгенерировать тестовый сигнал, синусоиду 2 В среднеквадратичных, частота которой медленно модулируется около 3 кГц, искаженную белым шумом экспоненциально убывающей амплитуды, дискретизированный на частоте 10 кГц.
>>> fs = 10e3 >>> N = 1e5 >>> amp = 2 * np.sqrt(2) >>> noise_power = 0.01 * fs / 2 >>> time = np.arange(N) / float(fs) >>> mod = 500*np.cos(2*np.pi*0.25*time) >>> carrier = amp * np.sin(2*np.pi*3e3*time + mod) >>> noise = rng.normal(scale=np.sqrt(noise_power), ... size=time.shape) >>> noise *= np.exp(-time/5) >>> x = carrier + noise
Вычислить и построить амплитуду STFT.
>>> f, t, Zxx = signal.stft(x, fs, nperseg=1000) >>> plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=amp, shading='gouraud') >>> plt.title('STFT Magnitude') >>> plt.ylabel('Frequency [Hz]') >>> plt.xlabel('Time [sec]') >>> plt.show()
Сравните энергию сигнала x с энергией его STFT:
>>> E_x = sum(x**2) / fs # Energy of x >>> # Calculate a two-sided STFT with PSD scaling: >>> f, t, Zxx = signal.stft(x, fs, nperseg=1000, return_onesided=False, ... scaling='psd') >>> # Integrate numerically over abs(Zxx)**2: >>> df, dt = f[1] - f[0], t[1] - t[0] >>> E_Zxx = sum(np.sum(Zxx.real**2 + Zxx.imag**2, axis=0) * df) * dt >>> # The energy is the same, but the numerical errors are quite large: >>> np.isclose(E_x, E_Zxx, rtol=1e-2) True