Page Personnelle de Vincent Kerhoas
Vincent Kerhoas
Enseignant du Supérieur
Professeur Agrégé
Page Personnelle de Vincent Kerhoas

Mise en oeuvre d’un filtre FIR

Back                  << Index >>

Théorie des Filtres FIR : Filtrage Numérique FIR


ALGORITHME


Branchements

Pour caractériser un filtre, il sera nécessaire d’envoyer en entrée un signal comportant toutes les fréquences ( bruit blanc ), et de tracer le spectre du signal en sortie.


Réalisation d’un Filtre FIR

Pour commencer, nous allons mettre en oeuvre un filtre FIR avec des coefficients fixes, déterminés par un script python.

Simulation ( Python )

Q1. A l’aide du script ci dessous, générer les coefficients d’un filtre FIR de taille 64, de fréquence de coupure 4500Hz, et de fréquence d’échantillonnage 44100 HZ.

REMARQUE : les coefficients sont mis en forme dans le fichier FIR.txt.

gene_coeffs_FIR.py

Mise en Oeuvre

Vieillissement des Echantillons

La réalisation d’un filtrage FIR consiste à effectuer un produit scalaire entre un vecteur de coefficients h et un vecteur d’échantillons x afin de calculer un échantillon de sortie y.
Le vecteur x doit être mis à jour tous les Te afin d’accueillir un nouvel échantillon d’entrée.

Calcul des échantillons de sortie

Copier les coefficients générés par le script python ci-dessus dans le projet STM32 (fichier _FIR_coeff.h), et effectuer la modification suivante :
REMARQUE : les coefficients de filtre utilisés dans cette première application sont au format __float.

main.c

Test du Filtre et mesure du temps de calcul

Pour caractériser le filtre ( Analyse spectrale ) , mettre en entrée un bruit blanc (bruit contenant toutes les fréquences à amplitude égale) :

Faire lire le fichier suivant à VLC ( vérifier que le paramètre AUDIO –> AUDIO DEVICE correspond bien à la carte son ).

Bruit Blanc

Enregistrer la sortie de la carte avec audacity :

[AUDACITY] Après enregistrement, sélectionner la partie à analyser, et faire ANALYSE –> TRACER LE SPECTRE

Q2. Relever le spectre des échantillons de bruit blanc filtré, et noter le temps pour réaliser le filtrage.

Q3. Implémenter un filtre de type Passe Haut, et mettre en évidence la fréquence de Shannon avec l’analyse spectrale.


Amélioration du Temps de Calcul

Adressage Circulaire

Certains architectures de processeurs proposent des registres afin de gérer des buffers circulaires (pour pointer l’échantillon le plus vieux et le plus jeune).
Cela permet d’éviter une boucle pour faire vieillir le vecteur x.
Le microcontrôleur STM32F746 ne propose pas de gestion de l’adressage circulaire dans son architecture, aussi la manipulation d’un index pour désigner l’échantillon le plus vieux prend au moins autant de temps que de faire vieillir le vecteur x.

L’architecture du STM32 ne propose pas de registres spécifiques permettant de gérer efficacement l’adressage circulaire.
Le temps de calcul ne sera donc pas amélioré avec cette méthode.

Capacité SIMD (Single Instruction Multiple Data)

Dans le cas d’un calcul avec des échantillons et des coefficients entiers 16 bits (q15), il est possible de récupérer en mémoire 32 bits correspondants à deux échantillons, et de traiter alors ces deux échantillons simultanément.
Cela permet de diviser par deux le nombre d’itérations de boucle si l’on traite 2 échantillons simultanément (pour le moment ce n’est pas le cas).

Extrait de arm_fir_fast_q15.c:

Utilisation des fonctions CMSIS DSP

Effectuer la modification du code ci-dessous. Attention, FILTER_COEFFS est un tableau de coefficients de filtre entiers (q15).

Q4. Vérifier le bon fonctionnement du filtre avec une analyse spectrale et noter le temps de calcul.
Quel peut être l’ordre maximal de filtre que l’on peut atteindre ?

Utilisation du DMA

Rappel : Le pipeline dans un processeur

Problème du Rebouclage

Le rebouclage dans un programme ( lié à un for/while ou test ) est source de perte de temps ; en effet cela casse le pipeline.
Un traitement par blocs permet de calculer plusieurs échantillons de sortie lors d’une itération de boucle :

( cf arm_fir_fast_q15.c )

La mise en oeuvre de ce traitement nécessite l’utilisation d’un DMA (Direct Memory Access), qui fait le lien entre le périphérique I2S et la mémoire, afin que le processeur puisse procéder à des calculs simultanément.
Cela implique une certaine latence entre les échantillons d’entrée et ceux de sortie.

En régime permanent :

Remplacer le fichier main.c par main_dma.c ( dans STM32CUBEIDE, faire clic droit sur main.c -> Properties : C/C++Build : cocher ‘Exclude ressource from build’, et décocher cette option pour le fichier main_dma.c )

Attention, FILTER_COEFFS est un tableau de coefficients de filtre au format float.

Q5. Mesurer le temps de calcul permettant désormais de calculer PING_PONG_BUFFER_SIZE échantillons de sortie dans la fonction process_buffer.

Q6. Définir un filtre passe bande d’ordre 256 permettant de valider le fonctionnement du DMA.


Calcul des coefficients du Filtre dans la STM32

REMARQUE : Reprendre le fichier main.c et non main_dma.c pour la suite.

Le Keyboard Tracking consiste à adapter la fréquence de coupure du filtre en fonction de la note.

Cela implique de calculer les coefficients du filtre dans le microcontrôleur.

Q7. Compléter la fonction FIR_calc_coeff_f32 ( dans le fichier FIR_filter.c ) afin de calculer les coefficients d’un filtre FIR passe bas en fonction d’une fréquence de coupure souhaitée.

Q8. Réaliser un synthétiseur à synthèse soustractive avec ce filtre FIR, le paramètre k doit être réglable avec un potentiomètre du clavier maître.


Back                  << Index >>