closest_STFT_dual_window#
- scipy.signal.closest_STFT_dual_window(win, hop, desired_dual=None, *, масштабированный=True)[источник]#
Вычисление двойственного окна STFT для заданного окна, наиболее близкого к желаемому двойственному окну.
Для заданного окна короткого преобразования Фурье win увеличивается на hop образцов, вычисляется двойное окно, которое минимизирует
abs(dual_win - desired_dual)**2когда масштабированный являетсяFalse. Для масштабированный установлено вTrue,abs(alpha*dual_win - desired_dual)**2минимизируется с помощью alpha являясь оптимальным коэффициентом масштабирования. AValueErrorвозникает, если не удается определить допустимое двойное окно.- Параметры:
- winnp.ndarray
Окно должно быть вещественным или комплексным одномерным массивом.
- hopint
Приращение в выборках, на которое окно сдвигается на каждом шаге.
- desired_dual: np.ndarray | None
Желаемое двойное окно должно быть одномерным массивом той же длины, что и win. Если установлено в
None(по умолчанию), затем desired_dual предполагается прямоугольным окном, т.е.,np.ones_like(win).- масштабированныйbool
Если установлено (по умолчанию), вычисляется ближайшая масштабированная версия вместо ближайшего двойственного окна.
- Возвращает:
- dual_winnp.ndarray
Двойное окно
alpha*win(с интервалом хопа hop), который ближе всего к desired_dual. Обратите внимание, что двойное окно win является dual_win/alpha и что двойное окно dual_win является alpha*win. dual_win имеет ту же форму, что и win и desired_win.- alphafloat | complex
Масштабный коэффициент для win. Он всегда равен единице, если масштабированный установлено в
False.
Смотрите также
ShortTimeFFTКратковременное преобразование Фурье, способное использовать двойное окно для вычисления обратного преобразования.
ShortTimeFFT.from_win_equals_dualСоздать экземпляр, где окно и его двойник равны.
Примечания
Для заданного окна и hop интервал, все возможные двойные окна выражаются через hop линейные условия уравнения (24) в Кратковременное преобразование Фурье раздел Руководство пользователя SciPy. Следовательно, уменьшение hop, увеличивает количество степеней свободы множества всех возможных двойных окон, улучшая способность лучше аппроксимировать desired_dual.
Эта функция также может использоваться для определения окон, которые удовлетворяют так называемому условию "Constant OverLap Add" (COLA) [1]. Утверждается, что суммирование всех значений касающихся окон в любой заданной позиции выборки даёт ту же константу \(\alpha\). Ур. (24) показывает, что это эквивалентно наличию прямоугольного двойного окна, т.е. двойственное окно является
alpha*np.ones(m).Некоторые примеры окон, удовлетворяющих COLA (взяты из [2]):
Прямоугольное окно при перекрытии 0, 1/2, 2/3, 3/4, …
Окно Бартлетта при перекрытии 1/2, 3/4, 5/6, …
Окно Ханна на 1/2, 2/3, 3/4, …
Любое окно семейства Блэкмана с перекрытием 2/3
Любое окно с
hop=1
Ссылки
[1]Джулиус О. Смит III, "Спектральная обработка аудиосигналов", онлайн-книга, 2011, https://www.dsprelated.com/freebooks/sasp/
[2]G. Heinzel, A. Ruediger и R. Schilling, “Spectrum and spectral density estimation by the Discrete Fourier transform (DFT), including a comprehensive list of window functions and some new at-top windows”, 2002, http://hdl.handle.net/11858/00-001M-0000-0013-557A-5
Примеры
Покажем, что окно Бартлетта с 75% перекрытием удовлетворяет условию COLA:
>>> import matplotlib.pyplot as plt >>> import numpy as np >>> from scipy.signal import closest_STFT_dual_window, windows ... >>> m = 24 >>> win, w_rect = windows.bartlett(m, sym=False), np.ones(m) >>> d_win, alpha = closest_STFT_dual_window(win, m//4, w_rect, scaled=True) >>> print(f"COLA: {np.allclose(d_win, w_rect*alpha)}, {alpha = :g}") COLA: True, alpha = 0.5
Мы также можем определить, для каких интервалов скачка выполняется условие COLA:
>>> hops, deviations, alphas = np.arange(1, 16, dtype=int), [], [] >>> for h_ in hops: ... w_cola, alpha = closest_STFT_dual_window(w_rect, h_, win, scaled=True) ... deviations.append(np.linalg.norm(w_cola - win*alpha)) ... alphas.append(alpha) ... >>> fg0, (ax0, ax1) = plt.subplots(2, 1, sharex='all', tight_layout=True) >>> ax0.set_title(f"COLA Window closest to a {m}-Sample Bartlett Window") >>> ax0.set(ylabel=r"$||w_\text{cola}-\alpha w||$", xlim=(0, hops[-1]-.5)) >>> ax1.set(xlabel="Hop Interval", ylabel=r"Scaling factor $\alpha$", ... ylim=(0, 1.25)) >>> ax0.plot(hops, deviations, 'C0.-') >>> ax1.plot(hops, alphas, 'C1.-') >>> for ax_ in (ax0, ax1): ... ax_.grid() >>> plt.show()
Нижний график показывает вычисленный масштабный коэффициент \(\alpha\) для разных hops тогда как верхний отображает \(L^2\)-норма разницы между масштабированным окном Бартлетта и вычисленным окном. Поскольку для hops от 1 до 4, а также для 6 и 12 \(L^2\)-норма разности практически равна нулю, условие COLA выполняется для них.