Transformation de Hilbert pour calculer l'enveloppe du signal?


27

J'ai entendu dire que la transformée de Hilbert peut être utilisée pour calculer l'enveloppe d'un signal. Comment cela marche-t-il? Et en quoi cette "enveloppe Hilbert" est-elle différente de l'enveloppe que l'on obtient en rectifiant simplement un signal?

Je m'intéresse spécifiquement à trouver un moyen de calculer une enveloppe à utiliser dans la compression de la plage dynamique (c'est-à-dire, "réduire automatiquement le volume" des parties fortes d'un signal audio).


avez-vous du code de travail maintenant? soit avec Hilbert transsform ou une autre méthode?
Basj

Réponses:


18

La transformée de Hilbert est utilisée pour calculer le signal "analytique". Voir par exemple http://en.wikipedia.org/wiki/Analytic_signal . Si votre signal est une onde sinusoïdale ou une onde sinusoïdale modulée, l'amplitude du signal analytique ressemblera en effet à l'enveloppe. Cependant, le calcul de la transformée de Hilbert n'est pas trivial. Techniquement, il nécessite un filtre FIR non causal de longueur considérable, il nécessitera donc une bonne quantité de MIPS, de mémoire et de latence.

Pour un signal large bande, cela dépend vraiment de la façon dont vous définissez «enveloppe» pour votre application spécifique. Pour votre application de compression de plage dynamique, vous voulez une métrique bien corrélée avec la perception de l'intensité sonore dans le temps. La transformation de Hilbert n'est pas le bon outil pour cela.

Une meilleure option consisterait à appliquer un filtre pondéré A ( http://en.wikipedia.org/wiki/A- weighting ), puis à effectuer un détecteur de crête avec perte ou RMS avec perte. Cela corrélera assez bien avec l'intensité sonore perçue au fil du temps et est relativement peu coûteux à faire.


Les deux ne sont pas causales, mais la méthode FFT (jeter la moitié du spectre et IFFT) est-elle généralement plus rapide que le filtre FIR?
endolith

De plus, comment la méthode FFT pour calculer la transformée de Hilbert nécessite-t-elle une non-causalité? Il suffit probablement d'une fenêtre assez grande pour obtenir des formes d'enveloppe utiles.
mavavilj

4

Vous pouvez utiliser la transformation Hilbert pour calculer une enveloppe de la manière suivante. (Je vais l'écrire sous forme de code MATLAB):

envelope = abs(hilbert(yourTimeDomainSignal));

Je n'ai pas le temps d'écrire les mathématiques pour le moment (j'essaierai plus tard), mais très simplement, disons que votre signal est une onde sinusoïdale. La transformée de Hilbert d'un sinus est une -cosine. (En d'autres termes, la transformée de Hilbert vous donnera toujours votre signal décalé de -90 degrés - sa quadrature en d'autres termes).

Si vous ajoutez votre signal (l'onde sinusoïdale) aux jtemps de votre signal hilberté (onde -cosine), vous obtenez:

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

Qui se trouve également être e ^ (j * (wt - pi / 2)).

Ainsi, lorsque vous en prenez la valeur absolue, vous obtenez 1, qui est votre enveloppe. (Pour ce cas).


Oops! J'ai oublié le signe négatif - merci Dilip, corrigé maintenant.
Spacey

2

Je connais au moins deux façons distinctes de récupérer l'enveloppe d'amplitude d'un signal.

L'équation clé est:

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

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

La manière la plus simple que je connaisse est d'obtenir Q serait de décomposer S (t) en un tas de composants sinusoïdaux en utilisant la FFT, de faire tourner chaque composant d'un quart de tour dans le sens inverse des aiguilles d'une montre (rappelez-vous que chaque composant va être un nombre complexe donc un composant particulier x + iy -> -y + ix) puis recombiner.

Cette approche fonctionne assez bien, bien qu'elle nécessite un peu de réglage (je ne comprends pas encore assez bien les mathématiques pour mieux expliquer cela)

Il y a quelques termes clés ici, à savoir «transformée de Hilbert» et «signal analytique»

J'évite d'utiliser ces termes parce que je suis presque sûr d'avoir été témoin d'une ambiguïté considérable dans leur utilisation.

Un document décrit le signal analytique (complexe) d'un signal réel d'origine f (t) comme:

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

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

auquel cas l'enveloppe d'amplitude est simplement | Analytique (f (t)) |, ce qui nous ramène à l'équation de Pythagore originale

NB: J'ai récemment découvert une technique plus avancée impliquant le décalage de fréquence et un filtre numérique passe-bas. La théorie est que nous pouvons construire le signal analytique par différents moyens; nous décomposons f (t) en composantes de fréquence sinusoïdale positives et négatives, puis retirons simplement les composantes négatives et doublons les composantes positives. et il est possible de faire cette «suppression de composante de fréquence négative» par une combinaison de décalage de fréquence et de filtrage passe-bas. cela peut être fait extrêmement rapidement en utilisant des filtres numériques. Je n'ai pas encore exploré cette approche, c'est tout ce que je peux dire pour le moment.


1
Ce ne sont que des façons différentes de calculer la même chose (amplitude du signal analytique via une transformée de Hilbert). La technique "avancée" consiste simplement à effectuer une FFT, à mettre à zéro les fréquences négatives, puis à effectuer une FFT inverse. La partie réelle est le signal d'origine et la partie imaginaire la transformée de Hilbert. Le diable est dans les détails comme le cadrage, le fenêtrage, le chevauchement et le traitement linéaire vs circulaire.
Hilmar

2
Il est décourageant de voir qu'une personne a jugé bon de récompenser le temps et l'énergie que j'ai donné à cette communauté (via le post ci-dessus) avec un downvote. Un poste qui contient de bonnes informations solides qui seront utiles à quelqu'un.
P i

2
@ Hilmar, Il existe un meilleur moyen de «supprimer les fréquences négatives» afin de réaliser la transformée de Hilbert. Comme je l'ai dit, une manière qui n'implique pas la FFT. À la lumière de ce qui précède, je ne me sens pas particulièrement enthousiaste à le détailler en ce moment.
P i

Appréciez votre réponse détaillée sur la transformation de Hilbert; Je voulais m'assurer que cela était bien reçu, donc ne pas être découragé. Veuillez ignorer le downvote de quiconque.

0

vous recherchez donc un contrôle automatique de gain (AGC). Je ne sais pas si vous devez le faire en traitant numériquement, mais il existe de très bons circuits intégrés qui peuvent très bien effectuer cette tâche, généralement l'AGC est intégré avec beaucoup d'autres fonctionnalités, mais certains circutis peuvent être créés avec des transistors JFET et quelques diodes.

Mais une façon très facilement compréhensible de le faire avec le traitement numérique serait de concevoir un estimateur de variance adaptative, comme prendre une fenêtre temporelle d'échantillons suffisants pour représenter 5 ou 10 ms, et appliquer un facteur d'oubli alpha ^ n (alpha <1) afin chaque nouvel échantillon qui vient est pris en compte plus que les échantillons précédents. puis, en fonction de cette estimation de variance, vous concevez selon votre désir, une fonction qui mappe la variance à un gain que vous appliquez à chaque échantillon audio. cela pourrait être une limite de décision difficile, alors que si la variance dépasse un certain seuil, vous diminuez le gain d'un facteur.

Ou pourrait être une limite de décision plus souple, où vous créez une transformation non linéaire de la variance au gain, et appliquez la transformation à chaque échantillon en fonction de la dernière estimation de la variance.

Ce sont des méthodes plus heuristiques, mais au moins, cela vous évite tous les calculs lourds.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.