Преобразование Гильберта для вычисления огибающей сигнала?

27

Я слышал, что преобразование Гильберта можно использовать для расчета огибающей сигнала. Как это работает? И чем этот «конверт Гильберта» отличается от конверта, получаемого простым выпрямлением сигнала?

Я заинтересован, в частности, в том, чтобы найти способ расчета огибающей для использования в сжатии динамического диапазона (т. Е. «Уменьшить громкость» громких частей аудиосигнала автоматически).

дБ»
источник
у вас есть рабочий код сейчас? или с гильбертом трансформ или другим методом?
Basj

Ответы:

18

Преобразование Гильберта используется для вычисления «аналитического» сигнала. Смотрите, например, http://en.wikipedia.org/wiki/Analytic_signal . Если ваш сигнал является синусоидальной волной или модулированной синусоидальной волной, величина аналитического сигнала действительно будет выглядеть как огибающая. Однако вычисление преобразования Гильберта не тривиально. Технически это требует не причинного КИХ-фильтра значительной длины, поэтому он потребует достаточного количества MIPS, памяти и задержки.

Для широкополосного сигнала это действительно зависит от того, как вы определяете «огибающую» для вашего конкретного приложения. Для вашего применения сжатия динамического диапазона вам нужна метрика, которая хорошо коррелирует с восприятием громкости во времени. Преобразование Гильберта не является подходящим инструментом для этого.

Лучшим вариантом было бы применить A-взвешенный фильтр ( http://en.wikipedia.org/wiki/A-weighting ), а затем использовать RMS-детектор с потерями или RMS с потерями. Это будет довольно хорошо коррелировать с воспринимаемой громкостью с течением времени и будет относительно дешевым.

Hilmar
источник
Оба не являются причинно-следственными, но метод FFT (отбрасывать половину спектра и IFFT) обычно быстрее, чем FIR-фильтр?
эндолит
Кроме того, как метод БПФ для вычисления преобразования Гильберта требует отсутствия причинности? Вероятно, просто нужно довольно большое окно, чтобы получить полезные формы конверта.
mavavilj
4

Вы можете использовать преобразование Гильберта для вычисления огибающей следующим образом. (Я напишу это как код MATLAB):

envelope = abs(hilbert(yourTimeDomainSignal));

У меня нет времени, чтобы написать математику прямо сейчас (я попробую позже), но очень просто, скажем, ваш сигнал - синусоида. Гильбертово преобразование синуса - это -козина. (Другими словами, преобразование Гильберта всегда будет давать вам сдвиг вашего сигнала на фазу -90 градусов - другими словами, его квадратуру).

Если вы добавите свой сигнал (синусоидальную волну) к jвременам своего наклонного сигнала (-козиновой волны), вы получите:

sin(wt) - j.*cos(wt)

Который также, случается, e ^ (j * (wt - pi / 2)).

Таким образом, когда вы берете абсолютное значение, вы получаете 1, что является вашим конвертом. (Для этого случая).

ошалевший
источник
К сожалению! Забыл отрицательный знак - спасибо Дилип, исправил сейчас.
Спейси
2

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

Ключевое уравнение:

E(t)^2 = S(t)^2 + Q(S(t))^2

Where Q represents a π/2 phase shift (also known as quadrature signal).

Самым простым способом, который мне известен, является получение Q, состоящий в том, чтобы разложить S (t) на группу синусоидальных компонентов, используя FFT, повернуть каждый компонент на четверть оборота против часовой стрелки (помните, что каждый компонент будет комплексным числом, поэтому конкретный компонент x + iy -> -y + ix) и затем рекомбинировать.

Этот подход работает довольно хорошо, хотя требует некоторой настройки (я еще недостаточно хорошо понимаю математику, чтобы объяснить это лучше)

Здесь есть пара ключевых терминов, а именно «преобразование Гильберта» и «аналитический сигнал».

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

Один документ описывает (сложный) аналитический сигнал исходного реального сигнала f (t) как:

Analytic(f(t)) = f(t) + i.H(f(t))

where H(f(t)) represents the 'π/2 phase shift' of f(t)

в этом случае огибающая амплитуды просто | Analytic (f (t)) |, что возвращает нас к исходному уравнению Пифагора

NB: Недавно я столкнулся с более продвинутой техникой, включающей сдвиг частоты и фильтр нижних частот. Теория состоит в том, что мы можем построить аналитический сигнал различными способами; мы разлагаем f (t) на положительные и отрицательные синусоидальные частотные компоненты, а затем просто удаляем отрицательные компоненты и удваиваем положительные компоненты. и возможно сделать это «удаление отрицательной частотной составляющей» путем сочетания сдвига частоты и фильтрации нижних частот. это можно сделать очень быстро, используя цифровые фильтры. Я еще не исследовал этот подход, так что это столько, сколько я могу сказать на данный момент.

Число Пи
источник
1
Это все разные способы вычисления одного и того же (величины аналитического сигнала через преобразование Гильберта). «Продвинутый» метод заключается в том, чтобы просто выполнить БПФ, обнулить отрицательные частоты, а затем сделать обратное БПФ. Реальная часть - это исходный сигнал, а мнимая часть - его преобразование Гильберта. Дьявол кроется в деталях, таких как кадрирование, создание окон, наложение и линейная или круговая обработка.
Хильмар
2
Уныло видеть, что какой-то человек посчитал целесообразным вознаградить время и энергию, которые я дал этому сообществу (через вышеупомянутый пост), отрицательным голосом. Пост, который содержит хорошую достоверную информацию, которая будет кому-то полезна.
P i
2
@Hilmar, есть лучший способ «убрать отрицательные частоты» для достижения преобразования Гильберта. Как я уже сказал, это не связано с БПФ. В свете вышесказанного, я не чувствую особого энтузиазма, чтобы детализировать это прямо сейчас.
P i
Ценим ваш подробный ответ о преобразовании Гильберта; хотел заверить, что это хорошо принято, а значит не унывать. Пожалуйста, не обращайте внимания на отрицательный голос, кто бы ни
0

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

Но очень легко понять способ сделать это с цифровой обработкой было бы разработать адаптивный оценщик дисперсии, как взять временное окно достаточного количества выборок, чтобы представить 5 или 10 мсек, и применить коэффициент забывания alpha ^ n (alpha <1), так каждый новый образец учитывается больше, чем предыдущий. затем, основываясь на этой оценке дисперсии, вы разрабатываете в соответствии с вашим желанием функцию, которая отображает дисперсию в усиление, которое вы применяете к каждому аудиосэмплу. это может быть граница жесткого решения, тогда как если дисперсия превышает некоторый порог, вы уменьшаете усиление на некоторый коэффициент.

Или это может быть более мягкая граница принятия решения, когда вы создаете нелинейное преобразование из дисперсии в усиление и применяете преобразование к каждой выборке на основе последней оценки дисперсии.

Это более эвристические методы, но, по крайней мере, это спасает вас от всей тяжелой математики.

кость
источник