STFT может быть успешно использован для звуковых данных (например, со звуковым файлом .wav) для внесения некоторых изменений в частотную область (например, удаление шума).
С N=441000
(т.е. 10 секунд при частоте дискретизации fs=44100
), windowsize=4096
, overlap=4
, производит аппроксимационно STFT в 430x4096
массив (первый координат: временные рамки, вторая координата: по частоте). В этом массиве можно вносить изменения, а реконструкцию можно выполнять с помощью overlap-add (*).
Как это можно сделать с помощью вейвлетов ? (DWT), то есть получить подобный массив формы a x b
, с a
временными рамками и b
частотными бинами, внести некоторые изменения в этот массив и, в конце концов, восстановить сигнал? Как ? Что такое вейвлет эквивалент перекрытия-сложения ? Какие функции Python будут задействованы здесь (я не нашел простого примера модификации звука с pyWavelets
...)?
(*): Вот структура STFT, которую можно использовать:
signal = stft.Stft(x, 4096, 4) # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)
for i in xrange(signal.shape[0]): # Process each STFT frame
modified_signal[i, :] = signal[i, :] * ..... # here do something in order to
# modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4) # y is the output
Цель состоит в том, чтобы найти аналогичную структуру с вейвлетами.
Ответы:
Кратковременное преобразование Фурье, как правило, является избыточным преобразованием, обычно реализуемым с одной и той же подвыборкой на каждой частоте. Если окно выбрано правильно, оно завершено: вы можете инвертировать его и восстановить любой исходный сигнал.
Так как он избыточен и полон, он имеет много совершенных инверсий. Это может быть реализовано и понято с использованием более общих инструментов: (с избыточной выборкой) сложных банков фильтров. Учитывая тип и длину окна, а также перекрытие, вы получаете банк фильтров анализа, для которого вы можете вычислить, является ли он обратимым или нет. Если это так, вы можете вычислить натуральное обратное и оптимизированное обратное тоже. Перекрытие-сложение - это всего лишь один из множества потенциальных инверсий, возможно, самый распространенный, что часто ограничивает выбор окна.
Стандартные дискретные вейвлет-преобразования также являются банками фильтров, с той разницей, что субсэмплинг не одинаков в каждой полосе частот (или, точнее, в масштабе). Это превращается в неодинаковую длину для каждой шкалы. Тем не менее, существуют избыточные реализации вейвлетов, которые дают «прямоугольный массив» коэффициентов, с которыми вы можете работать. Наиболее известные схемы называются под разными именами: вейвлеты , не зависящие от сдвига или времени, вейвлеты без оживления, стационарное вейвлет-преобразование(SWT), а иногда и круговорот. Его стандартная реконструкция включает в себя этапы, аналогичные наложению-добавлению, за исключением того, что они более «встроены» из-за различных коэффициентов выборки по шкалам. Вы можете использовать их с любым дискретным вейвлетом из библиотеки или даже создав собственный вейвлет. Причина в том, что стандартные дискретные вейвлеты были разработаны с учетом не избыточности, что ограничивает выбор вейвлетов. При избыточности выбор вейвлета увеличивается, так как выполняемые ограничения менее строгие. «Абсолютный» аватар - это непрерывное вейвлет-преобразование, которое допускает «почти» каждый обратный синтез-вейвлет. Мое последнее предложение довольно отвратительно, надеюсь, вы понимаете смысл: когда квадратная матрица обратима, она имеет только одну обратную. Когда «прямоугольная» матрица является обратимой влево обобщенным образом,
Кажется, есть реализация Python стационарного вейвлет-преобразования . Вы можете найти несколько ссылок в 2.3.4. Перевод инвариантных вейвлетов главы из связанной статьи .
Как правило, он гораздо надежнее для обнаружения, удаления шума или восстановления в практических применениях (геофизика, неразрушающий контроль, ультразвук, вибрация).
источник
Причина, по которой вам нужно добавить / сохранить перекрытие для фильтрации с кратковременным преобразованием Фурье, заключается в основном в том, что базисные функции, связанные с полученными вами коэффициентами, определены в определенном временном диапазоне (в отличие от одного момента времени). Преобразование Фурье, которое вы используете для вычисления коэффициентов расширения, также реализует свертку в круговой области, определяемой длиной вашего сигнального кадра. Это означает, что две конечные точки кадра действительно идентифицированы и замкнуты по кругу. Вот почему вы должны убедиться, что базисные функции редактируемых вами коэффициентов никогда не влияют на оба конца кадра, оборачиваясь вокруг.
Вейвлеты не являются ни собственными векторами преобразования времени, ни рассчитаны с использованием круговой свертки. Это означает, что вам не нужно добавлять или сохранять внахлест или любые другие методы, связанные с побочными эффектами круговой свертки. Вместо этого базисные векторы вейвлетов являются просто возможной основой для описания вашего сигнала. Следовательно, (полное, дискретное, возможно, ортогональное) вейвлет-преобразование является не чем иным, как базовым переходом от базиса во временной области к базису вейвлетной области. Изменения базы могут быть инвертированы (путем применения обратной матрицы изменения базиса, которая вас туда доставила), и вы можете переключиться обратно во временную область.
Параметры, которые вы указали в качестве размера окна, перекрытия, частоты дискретизации, не применимы к вейвлет-преобразованию. Единственное, что вам нужно, это материнский вейвлет. Если вы хотите сравнить результаты с вашим выводом STFT, вы можете выбрать любой из базисных векторов STFT (т.е. ваше окно, умноженное на сложную экспоненциальную несущую) в качестве прототипа вейвлета. Затем вы применяете быстрое вейвлет-преобразование, которое разлагает ваш сигнал на дерево отфильтрованных и подавленных сигналов верхних и нижних частот, которые в конечном итоге становятся вашими коэффициентами. Каждый коэффициент связан с базисным вектором вейвлета и его параметрами (масштаб, время) или (частота, время). Вы можете манипулировать коэффициентами, а затем применять обратное дискретное вейвлет-преобразование. Он возьмет ваши коэффициенты и проведет их через банк фильтров ресинтеза, чтобы снова выдать сигнал.
Эти процессы не тривиальны и, возможно, трудно переварить для новичка. Но вы должны быть в состоянии найти библиотеки / наборы инструментов для выбранной вами платформы, которые реализуют быстрое вейвлет-преобразование и его обратное. Однако, если вы хотите реализовать свою собственную вейвлет-основу, вам придется вывести коэффициенты фильтра для банков фильтров декомпозиции и синтеза. Это требует некоторой глубокой теории, и вам, вероятно, придется сначала изучить ее.
Существуют и другие разновидности вейвлет-преобразования, а именно непрерывное вейвлет-преобразование, которое работает с чрезмерно полным основанием. Он гораздо медленнее вычисляется и намного труднее инвертировать, так что в настоящее время это не вариант того, что вы хотите сделать.
источник
Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output
. С большим количеством (сделайте что-нибудь с массивом), я уверен, я пойму немного больше, как работает вейвлет.Существует много способов определения вейвлет-основы. Обычно вейвлет выглядит примерно так:
Поскольку размерность преобразованных данных превышает размерность сигнала, базис вейвлета не будет ортонормированным. Т.е. следующее будет ложным:
Другими словами, вы можете идеально восстановить сигнал, просто сложив составляющие его вейвлеты.
Ваша «модификация» может быть просто вставлена в вышеуказанную сумму:
Обновление 2013-11-19: добавление подробностей реализации ниже по запросу.
Усечение спектров иногда приводит к проблемам нормализации, в зависимости от того, как именно определяется ваше БПФ. Я не буду пытаться охватить все возможности здесь. Нормализация в основном простая проблема. ;-)
источник