Exercice.3 : Modulation FSK
On se propose d’écrire un programme pour un processeur de type DSP (Blackfin533) afin
d’implémenter une modulation FSK (Frequency Shift Keying). La figure 1 illustre
l’architecture globale du module embarqué incluant la table du signal sinusoïdal, la liste
des symboles binaires et la modulation FSK.
Figure 1: Architecture du module embarqué.
Le système est implémenté dans les deux mémoires du processeur selon la répartition
suivante:
Mémoire données (Data memory) : qui contient les données suivantes :
-
-
-
la table du signal sinus (signal référence) dont chaque échantillon est codé
sur 16 bits en format 1.15.
le buffer dans lequel on mettra les valeurs de sorties du modulateur FSK.
Chaque valeur de sortie y(n) sera codée sur 16bits en format 1.15.
la table des symboles binaires à envoyer. Pour simplifier l’implémentation,
chaque symbole binaire a(k) occupera un octet dans la mémoire (a(k) sera
00000000 pour le niveau logique ‘0’ et 00000001 pour le niveau logique ‘1’.
Mémoire programme (Code memory) : qui contient le code associé à la
modulation FSK. Ce code permet de générer le signal sinusoïdal y(n) ayant deux
fréquences possibles « f0 » ou « f1 » selon l’état du symbole binaire a(k) « 0 » ou « 1 ».
Les fréquences sont générées selon la façon avec laquelle la table LUT est lue.
Chaque pas de lecture définit une fréquence à la sortie.
La figure 2 illustre le principe de la modulation FSK. Deux pas de lecture (Step0 et
Publicité
Step1) sont possibles lors de la lecture de la table du signal de référence selon l’état
binaire du symbole à envoyer (« 0 » ou « 1 »). L’accumulateur permet de calculer la phase
instantanée qui permettra de générer soit la fréquence f0 ou bien f1. En d’autres termes,
l’accumulateur donnera l’adresse de la case à lire de la LUT (Look Up Table qui contient
les échantillons du signal sinusoïdal).
FSK output buffer16 bitsLUT(Signal sinusoidal)Modulation FSKCode memory16 bitsDSPData memorysortiey(n)x(n)Symboles binaire1 bita(k)
Figure 2: Architecture du modulateur FSK.
La figure 3 illustre l’architecture du codeur PCM. Deux opérations d’intégrations sont
effectuées et qui sont suivies par la fonction signe (+1 ou -1). La fonction signe est
appliquée au signal à la sortie de la deuxième intégration. Le système est asservi par
une boucle de retour.
Figure 3: Architecture du codeur PCM.
Les trois parties de l’exercice sont indépendantes.
Partie I : Définition des données
Dans cette partie on s’intéresse à la déclaration dans la mémoire des données (Data
memory) des variables nécessaires au fonctionnement du programme. Le signal
sinusoïdal de référence est de taille 4608 échantillons. Durant les temps des symboles
binaires « 1 » et « 0 », le nombre d’échantillons nécessaire pour constituer les signaux f1
et f0 est de 1728. On définit alors :
#define SAMPLE_COUNT
#define SINUS_LENGTH
1728
4608
1. Commenter chaque ligne du code suivant:
.section L1_data_a;
Publicité
Increment de phase (Step 1)AccumulateurTable Signal de référence Sinusoïdalx(n)Increment de phase (Step 0)MultiplexeurSymbole binaire a(k)Signal FSK y(n)Z-1++++Z-1Signe+++-+++-y(n)z(n)Intégration 1Intégration 2
Définition de la section mémoire dans laquelle seront stockées les variables
locales du programme. Dans ce cas, le Banc « a » de la mémoire « L1 data » est
utilisé.
.byte2 _Modulator_FSK_Bit0_Step;
Déclaration du pas de la lecture de la table du signal de référence pour générer le
signal de fréquence f0. Cette valeur est codée sur 2 Octets.
.byte2 _Modulator_FSK_Bit1_Step;
Déclaration du pas de la lecture de la table du signal de référence pour générer le
signal de fréquence f1. Cette valeur est codée sur 2 Octets.
.byte2 _FSK_Output_Buffer[SAMPLE_COUNT];
Déclaration du tableau contenant le signal de sortie z(n) ayant comme taille 1728.
Chaque élément est codé sur 2 Octets.
.byte2 _Sinus[SINUS_LENGTH] ="sinus.dat" ;
Déclaration et chargement de la table contenant le signal de référence x(n) de
taille 4608. Chaque élément est codé sur 2 Octets.
.byte _FSK_TBit_Value ="bits.dat";
Déclaration et chargement de la liste des symboles binaires a(k) à envoyer. Le
format de chaque symbole est de 1 octet.
Partie II : Initialisation
2. On désire configurer la lecture de la LUT contenant les échantillons du signal
référence (_Sinus) en lecture circulaire (circular buffering). Écrivez les lignes de codes
permettant ceci. La valeur du pas de lecture contenue dans le registre M sera fixée dans
la partie suivante.
I0.L = _Sinus;
Publicité
I0.H = _Sinus;
B0 = I0;
L0 = 2 * SINUS_LENGTH;
On désire fixer la valeur du pas de lecture selon la valeur du bit a(k) contenue dans
_FSK_TBit_Value et codée sur un octet comme expliqué auparavant.
Initialiser le pointeur P0 à l’adresse de la variable _FSK_TBit_Value et R0
3. a.
à son contenu. L’extension vers les 32 bits est considérée en zero extended.
P0.L = _FSK_TBit_Value;
P0.H = _FSK_TBit_Value;
R0 = B[P0](Z);
3. a.
Mettre dans R1 le contenu de la variable _Modulator_FSK_Bit0_Step.
P0.L = _Modulator_FSK_Bit0_Step;
P0.H = _Modulator_FSK_Bit0_Step;
R1 = W[P0];
3. b.
Mettre
R2
_Modulator_FSK_Bit1_Step.
dans
le
contenu
de
la
Publicité
variable
P0.L = _Modulator_FSK_Bit1_Step;
P0.H = _Modulator_FSK_Bit1_Step;
R2 = W[P0];
3. c.
Écrire le code qui permet de définir la valeur du registre M selon la
valeur de la variable _FSK_TBit_Value contenue dans R0.
CC = R0 == 0;
IF !CC M0 = R2;
M0 = R1;
4. Écrire le code permettant de remplir le FSK output buffer afin de constituer un des
signaux f1 ou f0.
P1.L = _FSK_Output_Buffer;
P1.H = _FSK_Output_Buffer;
P0 = SAMPLE_COUNT;
LSETUP (__START_FSK, __FIN_FSK) LC0 = P0;
__START_FSK:
R0.L = W[I0];
W[P1++] = R0.L;
__FIN_FSK: I0 +=M0;