discriminateur_fm

Discrimination polaire pour la démodulation FM.

Espace de nom : tsd::telecom

Prototype

sptr<FiltreGen<cfloat, float>> discriminateur_fm()

Retourne

Filtre cfloat (signal bande de base, complexe) vers float (fréquence instantanée, sous forme de pulsation normalisée (entre \(-\pi\) et \(\pi\))).

Description

Implémente un discriminateur polaire (calcul de la fréquence instantanée pour un signal en bande de base), qui peut servir de brique pour la démodulation FM : \[ y(t) = \frac{d\arg x}{dt}(t) \]

L'implémentation est basée sur https://www.embedded.com/dsp-tricks-frequency-demodulation-algorithms/, qui permet un calcul efficace, sans arctangente : \[ y(t) = \frac{\mathcal{Re}(x(t)) \frac{d\mathcal{Im}(x(t))}{dt} - \mathcal{Im}(x(t)) \frac{d\mathcal{Re}(x(t))}{dt}}{\left|x(t)\right|^2} \]

Les dérivées étant approximées à l'ordre 1 : \[ \frac{dx}{dt}(k) \sim \frac{x_{k+1}-x_{k-1}}{2} \]

Avertissement
Du fait de l'aproximation utilisée pour le calcul de la dérivée, ce bloc génére un retard de 1 échantillon.


Exemple


  // Signal test
  soit x = siggauss(1000) / 10;

  // Modulation FM
  soit y = polar(cumsum(x));

  // Démod
  soit discri = discriminateur_fm();
  soit z = discri->step(y);

  Figures f;
  f.subplot().plot(x, "", "Signal test");
  f.subplot().plot(y, "", "Signal modulé FM");
  f.subplot().plot(z, "", "Sortie discriminateur");