Rapport TP DSP – ENSEIRB 2009/2010 Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 1 TP Développement de filtres numériques sur la carte DSK 5416
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 1
TP Développement de filtres
numériques sur la carte DSK 5416
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 2
I. Introduction
Le but de ce TP est de maitriser l’environnement sur DSP de Texas Instruments Code Composer Studio. Puis la méthodologie de développement d’algorithmes numériques sur plateforme embarquée. Certains concepts étudiés en cours (Utilisation de Look-Up Table, calculs en virgule fixe Qk….) seront approfondis.
II. Prise en main de l’environnement II.1. Architecture du système La figure ci-dessous présente le schéma de principe entre le flux données analogiques
entrant et le flux de données lui aussi analogiques sortant.
II.2. Techniques de débogage
La Watch Window (figure 1 ci-dessous) permet de visualiser des données en mémoire. Elle
permet d’afficher la valeur des variables du programme pendant son exécution ou bien même de
modifier leurs valeurs en cours d’exécution de manière à vérifier le bon fonctionnement du
programme dans divers cas.
PCM 3000
Codec
DSP
DRR
ABU
Mémoire RAM
SRC
Input
Data
Output
Data
DST
ABU
DXR PCM 3000
Codec
DMA
DMA
Processing
Stereo/Mono
Mono/Stereo BSP
BSP
Line in
Line out
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 3
Figure 1 Utilisation de la « Watch Window » pour le débogage
Les figures 2 et 3 représentent les visualisations temporelles du signal d’entrée « src » ainsi
que du signal inputData. Le contenu de src (de taille LEN=512) a une allure hérissée tandis que
l’autre signal est lisse. En effet, le signal src (Stéréo) contient plus d’informations que le signal
inputdata (Mono), car un signal stéréo contient les échantillons de la piste audio gauche (G) et de la
piste audio droite (D) entrelacés. Ceux-ci n’étant pas corrélés, on observe ce phénomène
d’hérissement. Le signal lisse est obtenu par un moyennage des deux canaux de gauche et de droite,
de taille bien égale à N=LEN/2=256 .
Figure 2 Visualisation temporelle du signal “src” (Stéréo)
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 4
Figure 3 Visualisation temporelle du signal “inputdata” (Mono)
Lorsque l’on place un breakpoint et que l’on utilise le mode Animate, le son en sortie semble
dégradé. Ce dernier effectue une pause à chaque breakpoint (donc dans chaque bloc), nous avons
ainsi une lecture saccadée des blocs. Ceci crée une impression de dégradation du son car un court
silence vient s’intercaler entre chaque bloc.
Lorsque l’on ne met pas de breakpoint, l’affichage du contenu des variables ou des graphe n’est pas
mis à jour. Ceci est lié au concept d’émulateur JTAG, qui est un protocole intégré au sein du
processeur à des fins de débogage. En effet, pendant l’émulation (contrôleur JTAG ou
BoundaryScan), l’unique moyen de regarder le contenu des variables ou de visualiser des graphiques
est d’interrompre l’exécution, et donc d’utiliser des breakpoints car sinon le DSP est déjà occupé à
traiter les données audio lui parvenant du codec et ne peut donc pas communiquer.
Nous avons ensuite mesuré le nombre de cycles nécessaires à l’exécution de la fonction
blockProcessing. Pour cela, nous avons utilisé l’outil clock du logiciel. Notons que le DSP est cadencé
à 160MHz, que le signal est lui échantillonné à 48KHz et que chaque bloc contient 256 échantillons.
Le pourcentage de temps CPU est défini comme le rapport entre le temps d’exécution de la fonction
blockProcessing et le temps entre deux appels de cette même fonction :
A l’aide de l’outil clock, nous avons trouvé et du calcul du nombre de cycles entre deux blocs
consécutifs:
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 5
En utilisant des breakpoints et la Watch Window, nous pouvons étudier l’évolution de la valeur du
pointeur src au cours des appels successifs à blockProcessing. On remarque alors que l’adresse
mémoire du pointeur varie entre deux valeurs constantes au cours des réalisations. Ce mécanisme
correspond bien au principe du buffer ping‐pong utilisé par le DMA qui écrit tantôt dans le buffer
ping, tantôt dans le buffer ping. Ce processus permet de remplir un buffer (ping) pendant que le CPU
traite les données de l’autre buffer (pong). Lorsque le buffer est plein, interversion des rôles.
III. Modulation par une sinusoïde
On désire implémenter la modulation suivante pour mode=1 :
𝒚 𝒏 = 𝒙 𝒏 ∗ 𝒄𝒐𝒔(𝟐𝝅𝒇𝒎𝒏/𝒇𝒆) Où 𝒇𝒆 est la fréquence d’échantillonnage en Hz (48 kHz par défaut) 𝒇𝒎 est la fréquence de modulation en HZ. 𝒏 est l’indice temporel discret correspondant au temps 𝑡 = 𝑛/𝒇𝒆 en secondes
Voici le bloc de code correspondant au traitement du signal d’entrée pour correspondre à cette
modulation :
Voici l’allure des spectres du signal d’entré (inputData) :
case 1:
/* Modulation par une sinusoide */
for (i=0; i<N; i++){
outputData[i] = (Int16)((float)inputData[i] * cos(6.2832
* n *fm / freq));
n++;
if (n>=freq) n=0;
}
break;
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 6
Figure 1 Spectre du signal d'entré (inputData)
Le pic est à 𝑓0
𝑓𝑒= 0.009 ou 𝑓0est la fréquence du signal et vaut 440 Hz.
Et voici le spectre du signal de sortie (outputData) :
Figure 2 Spectre du signal de sortie (outputData) aprés modulation
Les deux pics observés correspondent aux fréquences normalisées suivantes :
𝑓0+𝑓𝑚
𝑓𝑒= 0.03
𝑓𝑚 −𝑓0
𝑓𝑒= 0.011
Le spectre en fréquence normalisé a bien été transposé à 𝑓𝑚 /𝑓𝑒 et à −𝑓𝑚 /𝑓𝑒 . Voici l’explication mathématique qui explique les résultats :
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 7
Voici l’expression du signal d’entré :
𝑠 𝑛 = 𝐴 ∗ sin(2𝜋 ∗ 𝑓0 ∗ 𝑛/𝑓𝑒) D’où un spectre :
𝑆(𝑓) =𝐴
2∗ (𝛿 𝑓 −
𝑓0
𝑓𝑒 + 𝛿 𝑓 +
𝑓0
𝑓𝑒 )
Après modulation, on obtient temporellement :
𝑠𝑚 𝑡 = 𝐴 ∗ sin 2𝜋 ∗ 𝑓0 ∗ 𝑛/𝑓𝑒 ∗ sin(2𝜋 ∗ 𝑓𝑚 ∗𝑛
𝑓𝑒)
D’où un spectre en sortie :
𝑆𝑚 (𝑓) =𝐴
4∗ (𝛿 𝑓 −
𝑓0 + 𝑓𝑚𝑓𝑒
+ 𝛿 𝑓 − (𝑓0 − 𝑓𝑚
𝑓𝑒 + 𝛿 𝑓 +
𝑓0 + 𝑓𝑚𝑓𝑒
+ 𝛿 𝑓 + (𝑓0 − 𝑓𝑚
𝑓𝑒) )
Ainsi lorsqu’on observe le spectre sur 0: 1/2 , on observera que les deux premiéres composantes du spectre de sortie, c'est-à-dire :
𝑆𝑚 (𝑓) =𝐴
4∗ 𝛿 𝑓 −
𝑓0 + 𝑓𝑚𝑓𝑒
+ 𝛿 𝑓 + (𝑓0 − 𝑓𝑚
𝑓𝑒)
Après application numérique on trouve que 𝑓0+𝑓𝑚
𝑓𝑒= 0.03
𝑓0−𝑓𝑚
𝑓𝑒= 0.011. La figure
représente le signal de sortie dans le domaine fréquentielle représenté sur −1/2: 1/2
IV. Filtre d’écho
On désire à présent implémenter un filtre d’écho :
𝑦 𝑛 = 𝑥 𝑛 + 𝑔 ∗ 𝑥(𝑛 − 𝐷)
𝑆𝑚 (𝑓)
𝑓
𝑓𝑒
𝑓0
𝑓𝑒
−𝑓0
𝑓𝑒
𝑓0 + 𝑓𝑚𝑓𝑒
𝑓𝑚 − 𝑓0
𝑓𝑒
−(𝑓0 + 𝑓𝑚 )
𝑓𝑒
−(𝑓𝑚 − 𝑓0)
𝑓𝑒
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 8
Ou 𝐷 est la valeur du délai en nombre d’échantillons, et 𝑔 un gain réel.
Le lien entre le délai 𝑑 en sécondes et le délai 𝐷 en échantillons fait intervenir la fréquence d’échantillonnage du signal notée𝑓𝑒 . La relation est :
𝐷 = 𝑑 ∗ 𝑓𝑒 L’application numérique donne (avec 𝑑 = 0.350𝑠 et 𝑓𝑒 = 48 𝑘𝐻𝑧 ) :
𝐷 = 16800 é𝑐𝑎𝑛𝑡𝑖𝑙𝑙𝑜𝑛𝑠 Les informations contenues dans inputData ne suffisent pas pour calculer l’ensemble des valeurs d’outputData. En effet pour calculer un tel filtre il est nécessaire d’avoir un buffer de taille au moins égale à 16800 or le buffer que nous utilisons pour contenir les données de inputData est de taille 256. Néanmoins même si ce buffer était de taille suffisante, l’implémentation d’un tel filtre poserait des problèmes. En effet, lorsque les échantillons du tableau inputData ont été entièrement traités par le DSP, ce tableau disparaît pour accueillir les nouveaux échantillons apportés par le codec perdant ainsi les informations des anciens échantillons avant que ceux-ci n’aient pu être utilisés. Ce filtre nécessite donc pour être implémenté d’une part qu’un tableau supplémentaire de taille suffisante soit instancié en mémoire et d’autre part que ce tableau supplémentaire soit sans discontinuité (donc un buffer circulaire par exemple). Le buffer circulaire peut contenir 20000 échantillons à une 𝑓𝑒 = 48 kHz. Ainsi la durée maximum du signal est donné par :
𝑑𝑚𝑎𝑥 =𝑀𝐴𝑋𝐵𝑈𝐹𝑆𝐼𝑍𝐸
𝑓𝑒= 0.42 𝑠𝑒𝑐𝑜𝑛𝑑𝑒
Voici le schéma mémoire de l’algorithme :
M-1
M-2
M-3
D
0
X(0)
X(1)
X(2)
X(M-D)
X(M-1) G
Y(0)
idx
Idd
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 9
Le gain 𝑔 de notre filtre d’écho peut prendre des valeurs dans l’intervalle −2,2 , à l’aide d’un entier G sur 16 bits signés. Ainsi le format adéquat pour coder ce gain est le format Q14. Pour 𝑔 = 0.8, G vaut :
𝐺 = 𝑟𝑜𝑢𝑛𝑑 214 ∗ 𝑔 = 13 107 Voici l’algorithme que nous proposons pour calculer un échantillon du filtre d’écho : Voici ci-dessous les signaux d’entré inputData et de sortie outputData avec le traitement DSP visant à rajouter de l’echo.
Figure 3 visualisation de l’écho : signal inputData en haut, signal ouputData en bas
Sur cette figure, le graphique supérieur est notre signal d’entrée : il a une allure de porte afin
de bien visualiser l’écho mais aussi de s’assurer qu’il possède le bon délai et le bon gain. Le graphique
Int16 processingEcho(Int16 *buffer, Uint16 M, Uint16 *p_idx, Int16 x, Uint16
D, Int16 G){
Int16 y;
//Insere x dans le buffer circulaire
if (*p_idx>0)
(*p_idx)--;
else
{
(*p_idx)=M-1;
}
buffer[*p_idx]=x;
// Calcul de y
y = buffer[*p_idx] + (Int16)((Int32)G*buffer[(*p_idx + D)%M] >>14);
return y;
}
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 10
inférieur est notre signal de sortie. Pour cette expérimentation, nous avons demandé un écho de
délai D = 100 échantillons afin qu’il puisse correctement être visualisé dans notre fenêtre de tampon
256 échantillons. De plus, le gain G retenu est très élevé (12 000) afin d’obtenir une écho important
(donc visible). Grace aux curseurs (barres verticales vertes), nous remarquons que notre porte arrive
à l’échantillon 40 et que son écho arrive à l’échantillon 140. On retrouve bien notre écho de délai D.
V. Filtre Reverb
Voici le schéma mémoire de l’algorithme :
A part le fait qu’ici, ce n’est pas le signal d’entrée (x) qui est bufferisé mais le signal de sortie
(y), la différence par rapport au calcul du filtre d’écho est que dans le cas présent, l’ajout de la valeur
courante de y doit être réalisé après le calcul de la sortie.
Voici le code qui calcul le filtre de reverb :
Int16 processingEcho(Int16 *buffer, Uint16 M, Uint16 *p_idx, Int16 x,
Uint16 D, Int16 G){
Int16 y;
//Insere x dans le buffer circulaire
if (*p_idx>0)
(*p_idx)--;
else
.....
.....
y(n-1-D)
.....
.....
y(n-2)
y(n-1)
y(n-N)
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 11
{
(*p_idx)=M-1;
}
buffer[*p_idx]=x;
// Calcul de y
y = buffer[*p_idx] + (Int16)((Int32)G*buffer[(*p_idx + D)%M] >>14);
return y;
} Voici la représentation temporelle d’un filtre d’écho récursif (reverb) :
𝑦 𝑛 = 𝑥 𝑛 + 𝑔 ∗ 𝑦 𝑛 − 𝑑 Lorsqu’on calcule la transformé en Z, on obtient :
𝑌 𝑧 = 𝑋 𝑧 + 𝑔 ∗ 𝑧−𝐷 ∗ 𝑌 𝑧 Soit la réponse impulsionnelle du filtre :
𝐻 𝑧 =𝑌(𝑧)
𝑋(𝑧)=
1
1 − 𝑔 ∗ 𝑧−𝐷
𝐻(𝑓) =1
1 − 𝑔 ∗ 𝑒−
𝑗2𝜋𝑓𝐷𝑓𝑒
La résonance est atteinte lorsque :
1 − 𝑔 ∗ 𝑒−
𝑗2𝜋𝑓𝐷𝑓𝑒 = 0
↔ 𝑓 = 𝑓𝑒
2𝜋𝐷∗ cos−1
𝑔² + 1
2 ∗ 𝑔
Il existe deux valeurs de 𝑔 pour que −1 ≤ 𝑔²+1
2∗𝑔 ≤ 1
- 𝑔 = 1 -> Résonances tout les 2𝑛𝑓𝑒
𝐷
- 𝑔 = −1 -> Résonances tout les (2𝑛+1)𝑓𝑒
𝐷
Rapport TP DSP – ENSEIRB 2009/2010
Lalaoui Jamal – Renaudin Maxime – Stein Jonathan Page 12
VI. Filtre RIF
Les coefficients des filtre passe-bas (cas 4) et passe-haut (cas 5) sont générés grâce au logiciel Matlab. Une fonction permet de les exporter en langage C et ainsi les utiliser dans la fonction fir. Cette fonction crée les filtres RIF.
Conclusion
Un Digital Signal Processor ou DSP en anglais, soit « processeur de signal numérique », est un
microprocesseur optimisé pour les calculs complexes en un coup d’horloge mais aussi pour accéder
très facilement à un grand nombre d'entrées-sorties numériques ou analogiques. Son application
principale est le traitement du signal numérique (filtrage, extraction de signaux, etc.).
Les DSP sont utilisés dans la plupart des applications du traitement numérique du signal en temps
réel. On les trouve dans les modems (modem RTC, modem ADSL), les téléphones mobiles, les
appareils multimédia (lecteur MP3), les récepteurs GPS... Ils sont également utilisés dans des
systèmes vidéo, les chaînes de traitement de son, partout où l'on reçoit un signal complexe que l'on
doit modifier à l'aide du filtrage.
Ce TP nous a permis de découvrir l’environnement de développement Code Composer Studio
mais aussi de mieux comprendre le fonctionnement du DSP afin d’approfondir nos connaissances
théoriques vues en cours. Ainsi nous avons étudié différents filtres tels que écho, reverb, modulation
et RIF couramment utilisés dans les applications citées précédemment.
case 4:
/* Filtre RIF passe-bas */ fir(inputData, coefs, outputData, &dbptr, filterLength, N);
break;
case 5:
/* Filtre RIF passe-haut */ fir(inputData, coefs_high, outputData, &dbptr, filterLength, N);
break;