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).
Réponses:
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.
la source
Vous pouvez utiliser la transformation Hilbert pour calculer une enveloppe de la manière suivante. (Je vais l'écrire sous forme de code MATLAB):
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
j
temps de votre signal hilberté (onde -cosine), vous obtenez: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).
la source
Je connais au moins deux façons distinctes de récupérer l'enveloppe d'amplitude d'un signal.
L'équation clé est:
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:
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.
la source
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.
la source