Modulation FSK Implementation
Ce laboratoire propose d’implémenter une modulation FSK (Frequency Shift Keying) sur un processeur DSP Blackfin533. L’objectif est d’écrire un programme capable de générer un signal sinusoïdal modulé en fréquence selon une séquence binaire.
D'après le document Modulation FSK Implementation
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source
Programming, Digital Signal Processing · PDF · 4 pages
Afficher l'aperçu du document
Ce laboratoire propose d’implémenter une modulation FSK (Frequency Shift Keying) sur un processeur DSP Blackfin533. L’objectif est d’écrire un programme capable de générer un signal sinusoïdal modulé en fréquence selon une séquence binaire. Le travail s’appuie sur la gestion de mémoires dédiées, la lecture circulaire d’une table de sinus, et le contrôle du pas de lecture pour produire deux fréquences distinctes. Ce TP nécessite des connaissances en programmation assembleur DSP, en traitement du signal et en architecture mémoire.
Objectifs
- Définir et organiser les données nécessaires à la modulation FSK dans la mémoire du DSP.
- Configurer la lecture circulaire d’une table de sinus pour générer un signal sinusoïdal.
- Contrôler dynamiquement le pas de lecture de la table pour moduler la fréquence selon un symbole binaire.
- Remplir un buffer de sortie avec le signal modulé FSK.
Prérequis et configuration
- DSP Blackfin533 ou équivalent.
- Connaissances en programmation assembleur pour DSP.
- Fichiers de données : "sinus.dat" (table de sinus 16 bits format 1.15) et "bits.dat" (liste des symboles binaires).
- Définitions des constantes SAMPLE_COUNT = 1728 et SINUS_LENGTH = 4608.
- Accès à la mémoire programme et mémoire données du DSP.
Définition des données
Dans cette étape, il s’agit de déclarer dans la mémoire données les variables nécessaires au fonctionnement du modulateur FSK. Le signal sinusoïdal de référence contient 4608 échantillons, codés sur 16 bits en format 1.15. Chaque symbole binaire dure 1728 échantillons, correspondant aux signaux des fréquences f0 et f1.
Le code suivant doit être commenté et compris :
.section L1_data_a;
.byte2 _Modulator_FSK_Bit0_Step;
.byte2 _Modulator_FSK_Bit1_Step;
.byte2 _FSK_Output_Buffer[SAMPLE_COUNT];
.byte2 _Sinus[SINUS_LENGTH] = "sinus.dat";
.byte _FSK_TBit_Value = "bits.dat";
.section L1_data_a;: définit la section mémoire locale « L1 data » dans le banc « a » pour stocker les variables..byte2 _Modulator_FSK_Bit0_Step;: déclaration du pas de lecture pour la fréquence f0, codé sur 2 octets..byte2 _Modulator_FSK_Bit1_Step;: déclaration du pas de lecture pour la fréquence f1, codé sur 2 octets..byte2 _FSK_Output_Buffer[SAMPLE_COUNT];: buffer de sortie du signal FSK, taille 1728, chaque élément codé sur 2 octets..byte2 _Sinus[SINUS_LENGTH] = "sinus.dat";: table du signal sinusoïdal de référence, chargée depuis le fichier "sinus.dat"..byte _FSK_TBit_Value = "bits.dat";: liste des symboles binaires à envoyer, chaque symbole codé sur 1 octet, chargée depuis "bits.dat".
Initialisation
Cette étape configure la lecture circulaire de la table de sinus et prépare les registres pour la modulation FSK.
Configurer la lecture circulaire de la LUT contenant les échantillons du signal de référence :
I0.L = _Sinus;
I0.H = _Sinus;
B0 = I0;
L0 = 2 * SINUS_LENGTH;
Explication :
I0est le pointeur d’indirection vers la table de sinus.B0est un registre base utilisé pour la lecture circulaire.L0définit la longueur du buffer en octets (2 octets par échantillon).
Initialiser le pointeur vers la liste des symboles binaires et charger le symbole courant dans R0 :
P0.L = _FSK_TBit_Value;
P0.H = _FSK_TBit_Value;
R0 = B[P0](Z);
Ensuite, charger les pas de lecture correspondant aux deux fréquences f0 et f1 :
P0.L = _Modulator_FSK_Bit0_Step;
P0.H = _Modulator_FSK_Bit0_Step;
R1 = W[P0];
P0.L = _Modulator_FSK_Bit1_Step;
P0.H = _Modulator_FSK_Bit1_Step;
R2 = W[P0];
Définir la valeur du registre M (pas de lecture) selon le symbole binaire courant :
CC = R0 == 0;
IF !CC M0 = R2;
M0 = R1;
Le registre M0 contient le pas de lecture qui détermine la fréquence de sortie. Si le symbole est 0, on utilise le pas pour f0, sinon celui pour f1.
Remplissage du buffer de sortie FSK
Cette étape génère le signal modulé en remplissant le buffer de sortie avec les valeurs sinusoïdales lues selon le pas choisi.
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;
Explications :
P1pointe vers le buffer de sortie.P0contient le nombre d’échantillons à générer (1728).- La boucle lit un échantillon sinusoïdal à l’adresse pointée par
I0, le stocke dans le buffer, puis incrémenteI0du pasM0pour changer la fréquence.
Résultats attendus
Le buffer de sortie _FSK_Output_Buffer doit contenir un signal sinusoïdal modulé en fréquence selon la séquence binaire contenue dans _FSK_TBit_Value. Chaque symbole binaire génère un segment de 1728 échantillons à la fréquence correspondante (f0 ou f1). La lecture circulaire de la table sinus garantit un signal continu et sans rupture.
Pièges courants
- Ne pas configurer correctement la lecture circulaire de la LUT peut entraîner des erreurs d’adressage et des valeurs erronées.
- Confondre les pas de lecture pour f0 et f1, ou ne pas mettre à jour le registre M0 selon le symbole binaire, empêchera la modulation correcte.
- Oublier d’incrémenter le pointeur
I0par le pasM0dans la boucle de génération du signal. - Ne pas respecter la taille des buffers (1728 échantillons par symbole) peut causer des débordements ou des coupures du signal.
- Le format 1.15 des échantillons doit être respecté pour éviter des erreurs d’interprétation du signal sinusoïdal.
Commentaires
Aucun commentaire pour le moment. Posez la première question.