Существует ряд задач, в которых долговременный сигнал разбивается на сегменты, каждый из которых обрабатывается отдельно.
В частности, этот подход используется для анализа сигнала с использованием оконного преобразования Фурье или наоборот во время синтеза; а также в спектральной обработке, такой как удаление шума, изменение темпа, нелинейная фильтрация, сжатие аудиоданных и другие.
Сам процесс разбиения математически представляется умножением на некоторый вес ( окно ) функция со смещением.
Для самого простого окна – прямоугольного – это может выглядеть так:
Исходный сигнал:
Разделы:
Восстановить исходный сигнал можно, просто суммировав их.
Подробнее
Однако по ряду причин прямоугольная функция не является лучшей оконной функцией.
При спектральном анализе посредством (обычно быстрого) дискретного преобразования Фурье анализируемый блок данных как бы «зацикливается», что приводит к разрыву по краям и искажению спектра:
Для обратного синтеза он также не подходит — так как любое изменение также приведет к разрывам — например, если мы попытаемся обратить одну из частей:
Для устранения этих недостатков используется перекрытие – когда каждое следующее окно захватывает часть данных из предыдущего; и окно веса, соответственно, плавно опускается к краям.
перекрытие 50%
Чаще всего для этого используется окно Ханны (также известный как приподнятый косинус) с перекрытием 50 %:Ввиду симметричности косинусов при сложении они суммируются до единицы:
Теперь при обратном синтезе мы не получим разрывов — но только при условии, что значения на границах окна продолжат стремиться к нулю.
Например, при переворачивании одной из деталей плавность не нарушится:
Обработка двойного окна
Давайте подробнее рассмотрим алгоритм обработки сигналов с помощью быстрого преобразования Фурье (БПФ):- разделение сигнала на сегменты с наложением окна;
- прямое БПФ;
- обработка спектра;
- обратное БПФ;
- повторное наложение окна (поскольку после обратного БПФ границы не обязательно будут встречаться с нулем без разрыва);
- суммирование полученных отрезков.
При использовании окна Ханны перекрытия в 50% уже недостаточно, так как будут возникать сбои:
Поскольку двойное наложение эквивалентно возведению в квадрат, очевидным решением будет использование корня окна Ханна для компенсации возведения в квадрат:
Однако в этом случае окно уже не было гладким по краям — появился разрыв в первой производной.
Примечание Интересно, что в данном случае мы получили половину периода синусоиды.
Можно пойти другим путем - использовать перекрытие 75%, и тогда окна тоже будут суммироваться в константу - только не в
, И в
:
В данном случае нам просто повезло.
Если разложить квадрат на сумму, то можно увидеть, что он представляет собой композицию двух окон Ханны, но в разных масштабах, что позволяет выполнить нужные нам требования:
Этот трюк не будет работать с другими функциями окна; кроме того, не все стандартные оконные функции могут обеспечить суммирование до константы даже при перекрытии 50%.
Идея
Окно Ханна можно рассматривать не как самостоятельную функцию, а как разность двух кусочно-непрерывных функций (подробно рассмотренных в разделе отдельная статья ) со смещением.
Например, используя следующую функцию
можно записать
Рассмотрев составляющие суммы двух таких окон, становится более понятной их способность суммироваться в константу:
На сегменте
мы получили взаимную компенсацию при добавлении функций
И
, поскольку
Вы можете выбрать другое смещение, нажав b О большее перекрытие, например:
А потом, при сдвиге по шагам
, они также будут суммированы в константу:
Видно, что если переставить компоненты оконной функции, то получатся те же окна Ханны.
Таким образом, используя разные ограничивающие функции, можно создавать окна необходимой формы.
Окончательная формула
Теперь осталось только установить масштаб так, чтобы области определения и значения не зависели от степени перекрытия.
Определив окно на интервале
мы получаем
Где
— кусочно-непрерывная функция вида
А
— некоторая интерполирующая функция между точками
И
.
Параметр
определяет уровень перекрытия — делитель, определяющий шаг, на который должно сдвигаться каждое следующее окно,
, и должно быть больше единицы,
.
Процент перекрытия
можно рассчитать по формуле
и соответственно наоборот
Примечание
При работе с реальными данными может возникнуть необходимость пересчета уровня перекрытия в зависимости от конкретного размера БПФ.
Например, при БПФ 2048 точек и уровне перекрытия 3 получим шаг 2048/3=682,666., что на практике, конечно, неосуществимо.
Итак, давайте округлим его до целого числа и
Пересчитаем как 2048/683=2,998535871156662…
Или можно поступить наоборот — использовать размер окна, заведомо кратный 3 (скажем, 999), а остаток заполнить нулями (25-й) до необходимого размера для БПФ.
Окончательный вид окна будет зависеть как от выбора уровня перекрытия, так и от выбора ограничивающей функции.
Несколько интересных примеров Здесь мы рассмотрим несколько готовых решений, ради которых все и затевалось.
Для простоты будем просто рассматривать интерполирующую функцию
, без какой-либо другой привязки.
Полиномиальные окна
Они наименее затратны в вычислительном отношении.
С использованием ранее полученный формула
получаем полином с заданным числом нулей от старших производных, обеспечивающий необходимую гладкость окна по краям.
первые 10 полиномов
При перекрытии 75% окна с разными значениями n будут выглядеть так:
А в случае с извлечением корня это работает следующим образом (при перекрытии 75%):
или вот так (с перекрытием 50%):
Максимально гладкое окно
Функцияинтересен тем, что он бесконечно дифференцируем и все его производные на краях равны 0 (что можно доказать, рассматривая его производные на основе правил дифференцирования — в каждом слагаемом будет множитель, обнуляющий его).
Это позволяет строить на его основе окна, все производные которых не имеют разрывов:
Окно просмотра юбки
Необходимость в таком типе окна обусловлена тем, что разрешающая способность БПФ увеличивается, но снижается влияние эффекта «частотно-временной неопределенности» на высоких частотах за счет увеличения их концентрации в центре.
Сначала определяем желаемый тип оконной функции — например, так:
Здесь первое слагаемое определяет вид самой функции, второе обеспечивает пересечение с осью абсцисс, третье (парабола) сбрасывает производную по краям для плавного соединения; и параметр
определяет «остроту» вершины.
В таком виде он пока не пригоден для использования — сначала из него нужно получить функцию ограничения путем интегрирования и масштабирования:
Для удобства настройки можно привязать параметр
до уровня пола
- например, так, чтобы 4-я производная в центре окна была равна 0 - и тогда
будет рассматриваться как
:
Здесь для наглядности все окна показаны в одном масштабе.
Смотровое окно «Игла»
Это более «агрессивная» версия предыдущего окна.
В качестве основы была выбрана гипербола, из которой путем последовательных преобразований
и используя те же действия в виде интегрирования и масштабирования мы получили формулу
Здесь также можно привязать параметр
до уровня пола.
Прямое решение уравнения 4-й производной дает слишком громоздкий результат, поэтому просто сделаем это по образу и подобию из решения для предыдущего окна, определив
Как
, тем самым обеспечивая роль параметра
как «тонкая настройка».
В
окна будут выглядеть так:
Асимметричное окно
Оконная функция не обязательно должна быть симметричной.Допустим, нам нужно окно с резкой атакой и плавным затуханием.
Получить его можно по уже знакомой схеме – сначала определить искомый вид функции, а затем путем интегрирования получить функцию ограничения.
Здесь задача несколько усложняется из-за того, что из-за асимметрии центр уже не будет проходить через начало координат, поэтому добавляется дополнительный этап расчета.
Это также приводит к тому, что формулы становятся довольно громоздкими.
Для примера рассмотрим самый простой вариант — параболу, умноженную на окно полиномиального веса:
Здесь степень х в весовом окне (а именно 10) определяет «остроту» атаки.
Мы использовали конкретное значение, а не символьный параметр, чтобы упростить формулы для наглядности — при желании его можно будет пересчитать позже.
После интеграции простого масштабирования уже недостаточно — нужно еще и выровнять края:
Для этого мы сначала сдвинем функцию вверх, чтобы выровнять левый край, а затем масштабируем ее до двух по правому краю и вычтем одну.
Тогда мы получим следующую формулу:
Чтобы итоговое окно имело желаемый вид, необходимо также обеспечить достаточно большой уровень перекрытия:
Заключение
Подобным образом можно конструировать окна из любых других колоколообразных функций — например, гауссиан; а также можно модифицировать уже обсуждавшиеся, чтобы обеспечить большую плавность или изменить форму кривой.Спектральный состав таких оконных функций остается за пределами рассмотрения; Этому необходимо посвятить отдельные исследования.
Чуть более расширенную версию статьи (с возможностью динамического изменения параметров в рассматриваемых окнах и скрытыми формулами) можно скачать в виде документа Wolfram Mathematica. Здесь .
Теги: #Звук #математика #bpf #обработка сигналов #Wolfram Mathematica #DSP #оконные функции #fft #весовые функции
-
Ноутбуки И Эффект Pvp!
19 Oct, 24 -
Пояснения К «Карма» И «Хабрасила»
19 Oct, 24 -
Приглашение Попробовать Google App Engine
19 Oct, 24 -
Я Что-То Не Понимаю? Порно ;)
19 Oct, 24 -
Тревога!
19 Oct, 24