La mesure du SINAD s’effectue normalement sur la sortie haut parleur d’un récepteur FM. Cette mesure nécessite un banc de mesure radio, ou un générateur RF et un banc de mesure audio. A défaut de banc de mesure audio on peut utiliser un logiciel d’analyse audio en conjonction avec une carte son calibrée.
Ce type de mesure caractérise les performances de bruit et de distorsion d’un récepteur FM.
Lorsqu’on souhaite mesurer les performances de modulation d’un émetteur FM et non d’un récepteur, un relais radio amateur par exemple, il est souhaitable d’utiliser un banc de mesure radio ou un analyseur de spectre doté de la fonction mesure de SINAD. Utiliser un récepteur FM pourrait ne pas être suffisant pour une bonne précision de la mesure, car son SINAD pourrait être inférieur à celui de l’émetteur.
Dans les deux cas, banc de mesure radio ou analyseur de spectre évolué, ce genre de matériel, même d’occasion, sera rarement accessible pour un amateur.
J’ai donc eu l’idée d’utiliser un récepteur SDR en conjonction avec le logiciel GNURadio. Le récepteur SDR utilisé ici est un Airspy HF+dont la résolution est largement suffisante pour ce type de mesure, car il utilise un convertisseur 18 bits, dont 16 bits sont retransmis sur la liaison USB.
Voici le flow chart GNURADIO permettant de calculer le SINAD après une démodulation FM Narrow, (Cliquer pour agrandir) :

Le principe est simple, la réalisation un peu moins car elle nécessite un bloc en python pour le calcul du SINAD.
Les différentes étapes :
Le bloc osmocom à gauche configure et récupère les données du récepteur SDR Airpy HF+. Ici la fréquence d’échantillonnage la plus basse de 192 kHz est utilisée pour le flux sortant IQ, avec une porteuse réglée sur 145.240 MHz.
Ce flux en modulation IQ est filtré par un filtre passe bas dont la fréquence de coupure est réglée à 5.5 kHz, ce qui donne une bande passante de 11 kHz, correspondante à la bande passante RF nécessaire pour une modulation FM Narrow avec un espacement de canaux de 12.5 kHz, ce qui est la norme actuelle pour les communications phonie en VHF radioamateur (norme de modulation 11K0F3E).
En modulation 11K0F3E, la déviation FM maximum est de +/- 2.5 kHz, on a selon la règle de Carson un facteur de modulation Beta de 0.83 pour une bande passante RF de 11 kHz, ce qui donne une bande passante audio de 3 kHz.
Quelques rappels de base sur la modulation FM :
Le signal filtré est ensuite envoyé sur un bloc de démodulation FM Narrow intégré à GNURADIO après être passé par un squelch pour éviter le bruit de démodulation FM en l’absence de signal.
Ce bloc récupère le flux IQ et génère une démodulation FM avec une déviation max de 2.5 kHz. Il opère également une désaccentuation avec une constante de temps de 75 uS pour compenser la préaccentuation intégré dans les émetteurs FM. Le signal est ensuite décimé à 48 kHz en sortie pour être directement compatible avec une sortie sur carte son.
Pour une déviation de +/- 2.5 kHz, le signal de sortie sera donc modulé à 100 %, soit 0 dBfs, ce qui donne – 3 dB RMS pour un signal sinusoïdal pure.
Il pourra être judicieux de mesurer le SINAD à une modulation de 50% par exemple, afin d’éviter des saturations qui pourraient se produire dans l’émetteur, ce qui pourrait donner une valeur de SINAD plus basse que la réalité. Il faudra donc injecter un signal Sinus à – 6dBFs dans l’émetteur, ou si l’entrée est analogique, à une amplitude correspondante à une modulation de 50%.
La sortie du bloc de démodulation FM est ensuite envoyée dans un bloc Python, pour effectuer le calcul du SINAD.
Le calcul du SINAD :
Le bloc Python utilise la librairie Numpy pour faciliter les calculs de FFT.
Le signal arrive dans le bloc en 32 bits flottant. Pour rappel, en traitement DSP, par convention, un signal à 0 dBFs en virgule flottante est codé par des valeurs maxi variant entre -1 et 1.
En regardant le signal audio sur l’oscilloscope GNURADIO, on peut donc se faire facilement une idée du niveau de modulation en réception. Pour une modulation à 50%, le signal variera entre -0.5 et 0.5.
Pour mesurer le SINAD, il faut disposer d’un signal RF modulé par un signal audio sinusoïdal pure, par exemple un signal de 1 kHz. J’ai uilisé pour ces tests un émetteur portable Icom ID-51 dont le 1750 Hz interne a été activé.
Ici le signal audio démodulé en provenance du ID-51, un sinus de 1750 Hz à -6 dBFs ou 50% de modulation.

C’est ce signal que le bloc Python doit traiter.
Etant donné que le SINAD est le rapport de la puissance du signal + bruit + distorsions sur le bruit + distorsions, il faut isoler le signal de la distorsion et du bruit.
On peut réaliser cela avec une analyse FFT (Fast Fourrier Transformation) qui est une version accélérée de la DFT (Discrète Fourrier Transformation).
L’analyse FFT consiste à décomposer le signal selon le théorème de Fourrier, c’est à dire en la somme d’un succession de sinusoïde d’amplitude plus ou moins grandes.

Quelques explications ici :
J’ai utilisé une FFT sur des blocs de 4096 échantillons, ce qui donne 2048 bins utilisable sur des échantillons réels. Un bin correspond à un « compartiment » dans lequel est calculée la puissance spectrale d’une petite bande de fréquence dont la largeur dépend du nombre de bins et de la fréquence d’échantillonnage.
Largeur d’un bin :

N est le nombre d’échantillons, Fs la fréquence d’échantillonnage.
Pour N = 4096, le nombre de bins est égal à (N / 2) + 1, soit 2049. Pour une fréquence d’échantillonnage de 48 kHz, chaque bin a une largeur de 11.72 Hz. C’est la résolution d’analyse spectrale.
Le premier bin est la composante continue, le dernier correspond à la moitié de la fréquence d’échantillonnage Fs/2.
Voici le code python :

En premier lieu une fenêtre de Hamming est appliqué sur les 4096 échantillons pour éviter les fuites spectrales lorsque le signal n’est pas périodique dans la fenêtre d’analyse.
window = np.hamming(np.size(data)) data = data * window
En effet lorsque qu’on applique une FFT à un signal de durée finie (fenêtré), cela revient à supposer que le signal est périodique. Si le signal n’est pas parfaitement périodique dans la fenêtre choisie, des discontinuités apparaissent aux extrémités. Ces discontinuités introduisent des hautes fréquences parasites dans le spectre. La fenêtre de Hamming multiplie le signal temporel par une fonction qui réduit progressivement l’amplitude du signal à ses extrémités. Cela atténue les discontinuités et, par conséquent, diminue la fuite spectrale.
Puis la FFT est calculée :
psd = np.fft.fft(data)
Il reste à séparer le bruit et la distorsion du le signal utile. On connait la fréquence du signal utilisé pour la mesure, 1750 Hz. On souhaite l’isoler avec une largeur de bande de 20 Hz (refWidht) pour une bonne réjection du bruit.
Le signal utile se situera entre les index bin1 et bin2 :
bin1 = int((self.fRef - self.refWidth / 2) / self.Fs * n)bin2 = int((self.fRef + self.refWidth / 2) / self.Fs * n)
On détermine ensuite les limites de bande passante audio, dans lesquels faire la mesure du SINAD, entre 300 Hz et 3 kHz :
bin300hz = int(300 / self.Fs * n)
bin3000hz = int(3000 / self.Fs * n)
A partir de là on crée deux subdivisions de la FFT sur les plages de fréquences correspondantes au signal plus le bruit, puis au bruit :
signal = psd[bin300hz:bin3000hz]
noise = np.concatenate((psd[bin300hz:bin1], psd[(bin2 + 1):bin3000hz]))
Il ne reste plus qu’à calculer les puissances sur chaque portion FFT :
Ps = np.sum(np.abs(signal) ** 2)
Pn = np.sum(np.abs(noise) ** 2)
Puis calculer le SINAD en dB :
sinad = max(10 * np.log10(Ps / Pn), 0) if Ps > 0 else 0
return sinad
On obtient le SINAD pour l’amplitude de modulation du signal (agrandir en cliquant) :

Ici pour cet émetteur Icom ID-51, en VHF, le SINAD est de 43 dB pour un signal de 1750 Hz à – 9 dB RMS (ou – 6 dBFs, ou modulation 50%).
A partir de cette valeur de SINAD de 43 dB on peut extrapoler le SINAD pour une modulation à 100%, en ajoutant 6 dB, soit 49 dB. Valeur qui reste théorique parce que des distorsions peuvent éventuellement apparaître à 100% de modulation.
NB : Pour mesurer le SINAD avec un signal de 400 Hz ou 1 kHz, il faudra changer la valeur « Sinadfreq » dans le bloc Python « SINAD ».
Voici le Flow Graph GNU Radio correspondant, avec le code python intégré.
La version 2 avec une fenêtre glissante pour la mesure FFT :
Laisser un commentaire