Modulation FSK Implementation

Programming, Digital Signal Processing · lab

Voir tous les documents en électronique et automatique

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;