hilbert

hilbert — Une transformée de Hilbert.

Description

Une implémentation RII de la transformée de Hilbert.

Syntaxe

ar1, ar2 hilbert asig

Exécution

asig -- signal d'entrée.

ar1 -- sortie sinus de asig.

ar2 -- sortie cosinus de asig.

hilbert est un filtre RII basé sur l'implémentation d'un réseau déphaseur de 90 degrés à large bande. L'entrée de hilbert est un signal audio dont la fréquence peut aller de 15 Hz à 15 kHz. Les sorties de hilbert ont la même réponse en fréquence que l'entrée (même sonorité), mais les deux sorties ont un déphasage constant de 90 degrés, plus ou moins un petit delta d'erreur, sur toute la gamme de fréquence. Les sorties sont en quadrature de phase.

hilbert est utile dans l'implémentation de plusieurs techniques de traitement numérique du signal en quadrature de phase. ar1 correspond à la sortie cosinus de hilbert, tandis que ar2 correspond à la sortie sinus. Les deux sorties ont un déphasage constant sur tout l'intervalle audio correspondant à la relation de phase entre une onde cosinus et une onde sinus.

En interne, hilbert est basé sur deux filtres passe-tout du sixième ordre en parallèle. Chaque filtre passe-tout implémente un retard qui augmente avec la fréquence ; la différence entre les retards de phase des filtres passe-tout en parallèle est approximativement de 90 degrés en n'importe quel point.

Contrairement à une transformée de Hilbert à RIF, la sortie de hilbert n'a pas une réponse en phase linéaire. Cependant, la structure à RII utilisée dans hilbert est calculée de manière bien plus efficace, et la réponse en phase non-linéaire peut être utilisée pour créer des effets audio intéressants, comme dans le deuxième exemple ci-dessous.

Exemples

Le premier example implémente un décalage de fréquence, ou modulation d'amplitude à bande latérale unique. Le décalage de fréquence est semblable à la modulation en anneau, sauf que les bandes latérales supérieure et inférieure sont séparées sur des sorties différentes. En n'utilisant qu'une seule de ces sorties, le signal d'entrée peut être "désaccordé" car le décalage des composants du signal détruit leur relation harmonique ; par exemple, un signal d'harmoniques à 100, 200, 300, 400 et 500 Hz, décalé vers le haut de 50 Hz, aura ses composants placés à 150, 250, 350, 450 et 550 Hz.

Premier exemple de l'opcode hilbert. Il utilise les fichiers hilbert.csd et beats.wav.

Exemple 398. Exemple de l'opcode hilbert implmentant le décalage de fréquence.

Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation des options de la ligne de commande.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
-odac     ;;;realtime audio out
;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o hilbert.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

sr = 44100
ksmps = 32
nchnls = 2
0dbfs  = 1
  
instr 1
  idur = p3
  ; Initial amount of frequency shift.
  ; It can be positive or negative.
  ibegshift = p4 
  ; Final amount of frequency shift.
  ; It can be positive or negative.
  iendshift = p5 
  
  ; A simple envelope for determining the 
  ; amount of frequency shift.
  kfreq linseg ibegshift, idur, iendshift
 
  ; Use the sound of your choice.
  ain diskin2 "beats.wav", 1, 0, 1
 
  ; Phase quadrature output derived from input signal.
  areal, aimag hilbert ain
 
  ; Quadrature oscillator.
  asin oscili 1, kfreq, 1
  acos oscili 1, kfreq, 1, .25
 
  ; Use a trigonometric identity. 
  ; See the references for further details.
  amod1 = areal * acos
  amod2 = aimag * asin

  ; Both sum and difference frequencies can be 
  ; output at once.
  ; aupshift corresponds to the sum frequencies.
  aupshift = (amod1 - amod2) * 0.7
  ; adownshift corresponds to the difference frequencies. 
  adownshift = (amod1 + amod2) * 0.7

  ; Notice that the adding of the two together is
  ; identical to the output of ring modulation.

  outs aupshift, aupshift
endin


</CsInstruments>
<CsScore>

; Sine table for quadrature oscillator.
f 1 0 16384 10 1

; Starting with no shift, ending with all
; frequencies shifted up by 2000 Hz.
i 1 0 6 0 2000

; Starting with no shift, ending with all
; frequencies shifted down by 250 Hz.
i 1 7 6 0 -250
e


</CsScore>
</CsoundSynthesizer>


Le second exemple est une variation du premier, mais avec réinjection de la sortie dans l'entrée. Avec de très petits décalages (entre 0 et +-6 Hz), le résultat est un son qui a été décrit comme un « déphaseur en enseigne de salon de coiffure américain » ou comme un « déphaseur en gamme de Shepard ». Plusieurs creux apparaissent dans le spectre et glissent à vitesse constante dans la direction opposée au décalage, produisant un effet de filtrage rappelant le « glissando sans fin » de Risset.

Second exemple de l'opcode hilbert. Il utilise le fichier hilbert_barberpole.csd.

Exemple 399. Exemple de l'opcode hilbert sonnant comme une « enseigne de coiffeur ».

Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation des options de la ligne de commande.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
; Audio out   Audio in    No messages
-odac           -iadc     -d     ;;;RT audio I/O
; For Non-realtime ouput leave only the line below:
; -o hilbert_barberpole.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

; Initialize the global variables.
sr = 44100
; kr must equal sr for the barberpole effect to work.
kr = 44100
ksmps = 1
nchnls = 2

; Instrument #1
instr 1
  idur = p3
  ibegshift = p4
  iendshift = p5

  ; sawtooth wave, not bandlimited
  asaw   phasor 100
  ; add offset to center phasor amplitude between -.5 and .5
  asaw = asaw - .5
  ; sawtooth wave, with amplitude of 10000
  ain = asaw * 20000
  
  ; The envelope of the frequency shift.
  kfreq linseg ibegshift, idur, iendshift

  ; Phase quadrature output derived from input signal.
  areal, aimag hilbert ain

  ; The quadrature oscillator.
  asin oscili 1, kfreq, 1
  acos oscili 1, kfreq, 1, .25

  ; Based on trignometric identities.
  amod1 = areal * acos
  amod2 = aimag * asin

  ; Calculate the up-shift and down-shift.
  aupshift = (amod1 + amod2) * 0.7
  adownshift = (amod1 - amod2) * 0.7

  ; Mix in the original signal to achieve the barberpole effect.
  amix1 = aupshift + ain
  amix2 = aupshift + ain
  
  ; Make sure the output doesn't get louder than the original signal.
  aout1 balance amix1, ain
  aout2 balance amix2, ain

  outs aout1, aout2
endin


</CsInstruments>
<CsScore>

; Table 1: A sine wave for the quadrature oscillator.
f 1 0 16384 10 1

; The score.
; p4 = frequency shifter, starting frequency.
; p5 = frequency shifter, ending frequency.
i 1 0 6 -10 10
e


</CsScore>
</CsoundSynthesizer>


Historique Technique

L'utilisation de réseaux déphaseurs dans le décalage de fréquence fut initialisée par Harald Bode1. Bode et Bob Moog donnent une excellente description de l'implémentation et de l'utilisation du décalage de fréquence dans le domaine analogique dans 2 ; c'est une source excellente pour une première exploration des possibilités de la modulation à bande larérale unique. Bernie Hutchins donne plus d'applications du décalage de fréquence ainsi qu'une analyse technique détaillée 3. Un papier récent de Scott Wardle4 décrit une implémentation numérique du décalage de fréquence ainsi que quelques applications uniques.

Références

  1. H. Bode, "Solid State Audio Frequency Spectrum Shifter." AES Preprint No. 395 (1965).

  2. H. Bode and R.A. Moog, "A High-Accuracy Frequency Shfiter for Professional Audio Applications." Journal of the Audio Engineering Society, Juillet/Août 1972, vol. 20, no. 6, p. 453.

  3. B. Hutchins. Musical Engineer's Handbook (Ithaca, NY: Electronotes, 1975), ch. 6a.

  4. S. Wardle, "A Hilbert-Transformer Frequency Shifter for Audio". Accessible en ligne à http://www.iua.upf.es/dafx98/papers/.

Crédits

Auteur : Sean Costello
Seattle, Washington
1999

Nouveau dans la version 3.55 de Csound.

Les exemples ont été mis à jour en avril 2002. L'exemple barberpole a été corrigé par Sean Costello.