STFT и DWT (вейвлеты)


12

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

Цель состоит в том, чтобы найти аналогичную структуру с вейвлетами.


Дополнительный комментарий: такая фильтрация STFT - очень плохая идея. Это не очень хороший способ сделать большинство вещей, которые вы действительно хотите сделать. Чего вы на самом деле пытаетесь достичь?
Питер К.

Обратите внимание, что PyWavelets только для дискретного вейвлет-преобразования. Если вы хотите делать STFT-подобные вещи, вам было бы легче понять непрерывное вейвлет-преобразование, такое как постоянное Q-преобразование, которое представляет собой преобразование Габора, по сути то же самое, что комплексное непрерывное вейвлет-преобразование Морле , но оно предназначено для обратима: grrrr.org/research/software/nsgt
эндолиты

1
(этот вопрос возродился «Сообществом».) По моему мнению, вейвлеты перекрываются и добавляются очень похоже на STFT. так что я не совсем понимаю суть вопроса.
Роберт Бристоу-Джонсон

Нужно ли больше деталей?
Лоран Дюваль

Ответы:


4

Кратковременное преобразование Фурье, как правило, является избыточным преобразованием, обычно реализуемым с одной и той же подвыборкой на каждой частоте. Если окно выбрано правильно, оно завершено: вы можете инвертировать его и восстановить любой исходный сигнал.

Так как он избыточен и полон, он имеет много совершенных инверсий. Это может быть реализовано и понято с использованием более общих инструментов: (с избыточной выборкой) сложных банков фильтров. Учитывая тип и длину окна, а также перекрытие, вы получаете банк фильтров анализа, для которого вы можете вычислить, является ли он обратимым или нет. Если это так, вы можете вычислить натуральное обратное и оптимизированное обратное тоже. Перекрытие-сложение - это всего лишь один из множества потенциальных инверсий, возможно, самый распространенный, что часто ограничивает выбор окна.

Стандартные дискретные вейвлет-преобразования также являются банками фильтров, с той разницей, что субсэмплинг не одинаков в каждой полосе частот (или, точнее, в масштабе). Это превращается в неодинаковую длину для каждой шкалы. Тем не менее, существуют избыточные реализации вейвлетов, которые дают «прямоугольный массив» коэффициентов, с которыми вы можете работать. Наиболее известные схемы называются под разными именами: вейвлеты , не зависящие от сдвига или времени, вейвлеты без оживления, стационарное вейвлет-преобразование(SWT), а иногда и круговорот. Его стандартная реконструкция включает в себя этапы, аналогичные наложению-добавлению, за исключением того, что они более «встроены» из-за различных коэффициентов выборки по шкалам. Вы можете использовать их с любым дискретным вейвлетом из библиотеки или даже создав собственный вейвлет. Причина в том, что стандартные дискретные вейвлеты были разработаны с учетом не избыточности, что ограничивает выбор вейвлетов. При избыточности выбор вейвлета увеличивается, так как выполняемые ограничения менее строгие. «Абсолютный» аватар - это непрерывное вейвлет-преобразование, которое допускает «почти» каждый обратный синтез-вейвлет. Мое последнее предложение довольно отвратительно, надеюсь, вы понимаете смысл: когда квадратная матрица обратима, она имеет только одну обратную. Когда «прямоугольная» матрица является обратимой влево обобщенным образом,

Кажется, есть реализация Python стационарного вейвлет-преобразования . Вы можете найти несколько ссылок в 2.3.4. Перевод инвариантных вейвлетов главы из связанной статьи .

Как правило, он гораздо надежнее для обнаружения, удаления шума или восстановления в практических применениях (геофизика, неразрушающий контроль, ультразвук, вибрация).


«Избыточный», означающий «имеет на выходе больше информации, чем необходимо для воспроизведения ввода»?
эндолит

1
NM>N

3

Причина, по которой вам нужно добавить / сохранить перекрытие для фильтрации с кратковременным преобразованием Фурье, заключается в основном в том, что базисные функции, связанные с полученными вами коэффициентами, определены в определенном временном диапазоне (в отличие от одного момента времени). Преобразование Фурье, которое вы используете для вычисления коэффициентов расширения, также реализует свертку в круговой области, определяемой длиной вашего сигнального кадра. Это означает, что две конечные точки кадра действительно идентифицированы и замкнуты по кругу. Вот почему вы должны убедиться, что базисные функции редактируемых вами коэффициентов никогда не влияют на оба конца кадра, оборачиваясь вокруг.

Вейвлеты не являются ни собственными векторами преобразования времени, ни рассчитаны с использованием круговой свертки. Это означает, что вам не нужно добавлять или сохранять внахлест или любые другие методы, связанные с побочными эффектами круговой свертки. Вместо этого базисные векторы вейвлетов являются просто возможной основой для описания вашего сигнала. Следовательно, (полное, дискретное, возможно, ортогональное) вейвлет-преобразование является не чем иным, как базовым переходом от базиса во временной области к базису вейвлетной области. Изменения базы могут быть инвертированы (путем применения обратной матрицы изменения базиса, которая вас туда доставила), и вы можете переключиться обратно во временную область.

Параметры, которые вы указали в качестве размера окна, перекрытия, частоты дискретизации, не применимы к вейвлет-преобразованию. Единственное, что вам нужно, это материнский вейвлет. Если вы хотите сравнить результаты с вашим выводом STFT, вы можете выбрать любой из базисных векторов STFT (т.е. ваше окно, умноженное на сложную экспоненциальную несущую) в качестве прототипа вейвлета. Затем вы применяете быстрое вейвлет-преобразование, которое разлагает ваш сигнал на дерево отфильтрованных и подавленных сигналов верхних и нижних частот, которые в конечном итоге становятся вашими коэффициентами. Каждый коэффициент связан с базисным вектором вейвлета и его параметрами (масштаб, время) или (частота, время). Вы можете манипулировать коэффициентами, а затем применять обратное дискретное вейвлет-преобразование. Он возьмет ваши коэффициенты и проведет их через банк фильтров ресинтеза, чтобы снова выдать сигнал.

Эти процессы не тривиальны и, возможно, трудно переварить для новичка. Но вы должны быть в состоянии найти библиотеки / наборы инструментов для выбранной вами платформы, которые реализуют быстрое вейвлет-преобразование и его обратное. Однако, если вы хотите реализовать свою собственную вейвлет-основу, вам придется вывести коэффициенты фильтра для банков фильтров декомпозиции и синтеза. Это требует некоторой глубокой теории, и вам, вероятно, придется сначала изучить ее.

Существуют и другие разновидности вейвлет-преобразования, а именно непрерывное вейвлет-преобразование, которое работает с чрезмерно полным основанием. Он гораздо медленнее вычисляется и намного труднее инвертировать, так что в настоящее время это не вариант того, что вы хотите сделать.


1
Спасибо за Ваш ответ. Основная причина, по которой я пытаюсь создать структуру кода, заключается в том, что я всегда замечал (с детства до нескольких лет назад, когда я закончил работу над докторской диссертацией (конечно, не связанной с DSP, если да, то я бы не стал спрашивать) так что вопросы новичка здесь!)) это то, что манипулирование некоторыми реальными материалами (например, звуковым сигналом в DSP) очень помогает понять глубокую теорию. То , что я хотел бы код: Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. С большим количеством (сделайте что-нибудь с массивом), я уверен, я пойму немного больше, как работает вейвлет.
Basj

1
@Basj, тогда делай, как я сказал. Найдите библиотеку python, которая поддерживает как быстрое вейвлет-преобразование, так и его обратное, а затем поиграйтесь с созданным деревом коэффициентов. Удачи и приятного времяпровождения!
Jazzmaniac

«Не применимы ли все к вейвлет-преобразованию?» Они применимы к CWT, верно?
эндолит

1

Существует много способов определения вейвлет-основы. Обычно вейвлет выглядит примерно так:

wx0,k0(x)=Aexp(ik0x)e(k0(xx0))

x0k0eAk

(x0,k0)(x0,k0)

Поскольку размерность преобразованных данных превышает размерность сигнала, базис вейвлета не будет ортонормированным. Т.е. следующее будет ложным:

wk0,x0|wk0,x0=δ(x0,x0)δ(k0,k0)

Aw

x0,k0|wx0,k01k0wx0,k0|=identity

Другими словами, вы можете идеально восстановить сигнал, просто сложив составляющие его вейвлеты.

Ваша «модификация» может быть просто вставлена ​​в вышеуказанную сумму:

my_filter=x0,k0|wx0,k0f(x0,k0)wx0,k0|

Обновление 2013-11-19: добавление подробностей реализации ниже по запросу.

f(x)

cx0,k0=wx0,k0|f

k0cx0,k0x0ffw0,k0cx0,k0

  • ff^
  • k01/4
    • f^w^0,k0
    • [kl,kr)w^0,k0
    • Примените к этому обратное преобразование Фурье.
    • exp(ixkl+kr2)cx0,k0x0

k0x0w0,k0k0k0

cx0,k0k0

Усечение спектров иногда приводит к проблемам нормализации, в зависимости от того, как именно определяется ваше БПФ. Я не буду пытаться охватить все возможности здесь. Нормализация в основном простая проблема. ;-)

w^x0,k0(k)wx0,k0(x)

w^x0,k0=Aexp(i(kk0)x0)exp((Qlog(k/k0))2)

QAk0


1
Спасибо за то, что вспомнили эти важные моменты о вейвлет-теории, которые действительно необходимы, чтобы понять, как она работает. Но здесь вопрос будет больше о построении кода структуры, который будет работать, например, с аудиосигналом. Вопрос в том, как справиться с этими бесконечными суммами, как выбрать окна (или, скорее, материнский вейвлет ), как сделать это с помощью pyWavelets в Python (или другого эквивалентного языка, который я затем переведу на Python), как выберите параметры (как в моем примере для аудио: частота дискретизации = 44100, окно FFT = 4096, перекрытие = 4 и т. д.)
Basj

akk|kakk|=Id

K

akakf

1
Лучший способ увидеть, работает ли он или нет, - предоставить минимальный пример кода (например, с pyWavelet это должно быть возможно в несколько строк, я представляю) (я сделаю это хорошо, как только пойму, думаю, нужно еще несколько дней читать о вейвлетах!)
Basj
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.