Hilbert transformar para calcular envelope de sinal?

27

Ouvi dizer que a transformação Hilbert pode ser usada para calcular o envelope de um sinal. Como é que isso funciona? E como esse "envelope Hilbert" é diferente do envelope obtido simplesmente retificando um sinal?

Estou interessado especificamente em encontrar uma maneira de calcular um envelope para uso em compressão de faixa dinâmica (ou seja, "diminuir o volume" das partes altas de um sinal de áudio automaticamente).

dB '
fonte
você tem algum código de trabalho agora? com a transformação de Hilbert ou outro método?
Basj

Respostas:

18

A transformação Hilbert é usada para calcular o sinal "analítico". Veja, por exemplo, http://en.wikipedia.org/wiki/Analytic_signal . Se o seu sinal for uma onda senoidal ou uma onda senoidal modulada, a magnitude do sinal analítico parecerá realmente com o envelope. No entanto, o cálculo da transformação de Hilbert não é trivial. Tecnicamente, ele requer um filtro FIR não causal de comprimento considerável, exigindo uma quantidade razoável de MIPS, memória e latência.

Para um sinal de banda larga, isso realmente depende de como você define "envelope" para sua aplicação específica. Para sua aplicação de compressão de faixa dinâmica, você deseja uma métrica bem correlacionada com a percepção de volume ao longo do tempo. A Hilbert Transform não é a ferramenta certa para isso.

Uma opção melhor seria aplicar um filtro de ponderação A ( http://en.wikipedia.org/wiki/A-weighting ) e, em seguida, fazer um pico com perda ou um detector RMS com perda. Isso irá se correlacionar razoavelmente bem com o volume percebido ao longo do tempo e é relativamente barato.

Hilmar
fonte
Ambos são não-causais, mas o método FFT (descarte metade do espectro e IFFT) geralmente é mais rápido que o filtro FIR?
endolith
Além disso, como o método FFT para calcular a transformação Hilbert exige não causalidade? Provavelmente, é necessário apenas uma janela bastante grande para obter formas úteis de envelope.
mavavilj
4

Você pode usar a conversão Hilbert para calcular um envelope da seguinte maneira. (Vou escrevê-lo como código MATLAB):

envelope = abs(hilbert(yourTimeDomainSignal));

Não tenho tempo para escrever as contas agora (tentarei mais tarde), mas, muito simplesmente, diga que seu sinal é uma onda senoidal. A transformação de Hilbert de um seno é uma -cosina. (Em outras palavras, a transformação de hilbert sempre fornecerá seu sinal alterado na fase de -90 graus - sua quadratura em outras palavras).

Se você adicionar seu sinal (a onda senoidal) às jvezes o sinal hilberted (onda -cosina), você obtém:

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

O que também passa a ser e ^ (j * (wt - pi / 2)).

Assim, quando você obtém o valor absoluto disso, obtém 1, que é o seu envelope. (Para este caso).

Spacey
fonte
Opa! Esqueceu o sinal negativo - obrigado Dilip, corrigido agora.
Spacey
2

Estou ciente de pelo menos duas maneiras distintas de recuperar o envelope de amplitude de um sinal.

A equação chave é:

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

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

A maneira mais simples de saber é obter Q seria decompor S (t) em um monte de componentes sinusoidais usando a FFT, girar cada componente um quarto de volta no sentido anti-horário (lembre-se de que cada componente será um número complexo, portanto um componente específico x + iy -> -y + ix) e depois recombine.

Essa abordagem funciona muito bem, embora exija um pouco de ajuste (ainda não entendo a matemática o suficiente para explicar isso de uma maneira melhor)

Existem alguns termos-chave aqui, a saber, 'transformação de Hilbert' e 'sinal analítico'

Evito usar esses termos porque tenho certeza de que testemunhei uma ambiguidade considerável em seu uso.

Um documento descreve o sinal analítico (complexo) de um sinal real original f (t) como:

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

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

nesse caso, o envelope de amplitude é simplesmente | Analítico (f (t)) |, o que nos leva de volta à equação pitagórica original

NB: Recentemente, deparei com uma técnica mais avançada que envolve a mudança de frequência e um filtro digital passa-baixo. A teoria é que podemos construir o sinal analítico por diferentes meios; decompomos f (t) em componentes de frequência sinusoidal positivos e negativos e, em seguida, simplesmente removemos os componentes negativos e duplicamos os componentes positivos. e é possível fazer essa 'remoção de componente de frequência negativa' por uma combinação de mudança de frequência e filtragem passa-baixo. isso pode ser feito extremamente rápido usando filtros digitais. Ainda não explorei essa abordagem, portanto é o máximo que posso dizer no momento.

P i
fonte
11
Todas essas são maneiras diferentes de calcular a mesma coisa (magnitude do sinal analítico através de uma transformação de Hilbert). A técnica "avançada" é simplesmente fazer uma FFT, zerar as frequências negativas e depois fazer uma FFT inversa. A parte real é o sinal original e a parte imaginária que Hilbert transforma. O diabo está nos detalhes como enquadramento, janelas, sobreposição e processamento linear versus circular.
Hilmar
2
É desanimador ver que alguns indivíduos consideraram adequado recompensar o tempo e a energia que dediquei a esta comunidade (através do post acima) com um voto negativo. Uma postagem que contém boas informações sólidas que serão benéficas para alguém.
1
2
@ Hilmar, Existe uma maneira melhor de 'remover as frequências negativas' para alcançar a Transformação de Hilbert. Como eu disse, uma maneira que não envolve FFT. À luz do exposto, não me sinto particularmente entusiasmado em detalhar isso agora.
1
Aprecie sua resposta detalhada sobre a transformação Hilbert; Queria garantir que isso seja bem recebido e, portanto, não desanime. Por favor, ignore o voto negativo por quem quer que seja.
0

Então, basicamente, você está procurando um Controle Automático de Ganho (AGC). Não tenho certeza se você deve fazê-lo processando digitalmente, mas existem muito bons circuitos integrados por aí que podem executar essa tarefa muito bem; geralmente o AGC é integrado a muitos outros recursos, mas alguns circutis podem ser criados com transistores JFET e alguns diodos.

Mas uma maneira muito fácil de entender isso com o processamento digital seria projetar um estimador de variância adaptável, como tirar uma janela de tempo de amostras suficientes para representar 5 ou 10 ms e aplicar um fator de esquecimento alfa ^ n (alfa <1), para cada nova amostra que chega é levada em consideração mais do que as amostras anteriores. então, com base nessa estimativa de variação, você projeta de acordo com seu desejo, uma função que mapeia a variação para um ganho que você aplica a cada amostra de áudio. isso pode ser um limite de decisão difícil, enquanto que se a variação ultrapassar algum limite, você diminuirá o ganho por algum fator.

Ou pode ser um limite de decisão mais flexível, onde você cria uma transformação não linear de variação para ganho e aplica a transformação a todas as amostras com base na última estimativa de variação.

Esses são métodos mais heurísticos, mas pelo menos evitam toda a matemática pesada.

osso
fonte