150 likes | 329 Views
Calcul numérique de la transformée de Fourier Applications: Détecteur de tonalité numérique (TP2) Détection DTMF (TP3) Démodulation FSK (TP4) Mise en pratique de la FFT (TP5). Transformée de Fourier (rappels). Signal Spectre x(t) X(f)
E N D
Calcul numérique de la transformée de Fourier Applications: Détecteur de tonalité numérique (TP2) Détection DTMF (TP3) Démodulation FSK (TP4) Mise en pratique de la FFT (TP5)
Transformée de Fourier (rappels) • Signal Spectre • x(t) X(f) • Temps Fréquences
Calcul approché pour un signal échantillonné x(nTe) • Approximations: • nombre fini d’échantillons : N • -fréquence d’échantillonnage : Te • -Durée du signal : T0 = (N-1).Te
Re(X(kf0)) x(nTe) fréquence Fe/N Fe Im(X(kf0)) temps Te NTe fréquence Fe Fe/N Transformée de Fourier discrète La TFD calcule N valeurs espacées de f0=Fe/N
Calcul de la TFD On calcule séparément la partie réelle et la partie imaginaire
Spectre d’amplitude Fréquences f = k.Fe/N avec k entier de 0 à N-1 Module Amplitude des raies spectrales:
Transformée de Fourier rapide FFT Algorithme de calcul rapide de la TFD N doit être une puissance entière de 2 : N = 2M N = … 16, 32, 64, 128, 256, 512, 1024, 2048…. M = … 4, 5, 6, 7, 8, 9, 10, 11… Ne retourne en général que les N/2 premières valeurs de X(k) lorsque x(n) est une suite de nombre réels. Résolution : f0 = Fe/2M Hz
Détecteur de tonalité - But: Détecter la présence d’une composante de fréquence F connue dans un signal. • Utilisation • Commuter une relais de communication (1750Hz) • Décodeur DTMF, démodulation FSK, Télétypes.. • Méthode utilisée • Le calcul de la transformée de Fourier discrète • pour k = F/f0 permet de déterminer l’amplitude de la composante fréquentielle recherchée.
Virgule flottante dans le DSP 320F28335 Indiquer au compilateur et au linker d’utiliser la virgule flottante(FPU) - Option de compilation: -V28 -- float_support=fpu32 (ou cochez la case fpu32) - Librairie pour l’édition de liens: rts2800_fpu32.lib
Mise en œuvre de la FFT dans le DSP 320F28335 (TP5) Texas Instrument fournit une collection de fonctions optimisées pour le calcul de la FFT en virgule flottante: - C28x_FPU_Lib_Beta1.lib Installation: - Télécharger et installer sprc624 - Répertoire \tidcs\c28\C28x_FPU_Lib\beta1\lib\ Vous y trouverez: - FPU.h - C28x_FPU_Lib_Beta1.lib - des explications: C28x_FPU_Library_Beta1.pdf
Déclarations dans le fichier FPU.h void RFFT_f32 (RFFT_F32_STRUCT *) void RFFT_f32_mag (RFFT_F32_STRUCT *) typedef struct { float32 *InBuf; float32 *OutBuf; float32 *CosSinBuf; float32 *MagBuf; float32 *PhaseBuf; Uint16 FFTSize; Uint16 FFTStages; } RFFT_F32_STRUCT;
Exemple • #include FPU.h • #define FFT_SIZE 128 // Nombre de points 32, 64, 128, 256,… • #define FFT_STAGES 7 // log2(FFT_SIZE) • // !!!!! La section « INBUF » doit être définie et alignée dans le fichier .cmd. • #pragma DATA_SECTION(Inbuf, "INBUF"); • float32 InBuffer[FFT_SIZE]; // pour stocker les échantillons… • float32 OutBuffer[FFT_SIZE]; // pour récupérer les résultats (Re et Im) • float32 MagBuffer[FFT_SIZE/2]; // pour récupérer les amplitudes • float32 TwiddleBuffer[FFT_SIZE]; //les coefficients sin.. et cos.. • RFFT_F32_STRUCT fft; //la structure • main() • { fft.InBuf = InBuffer; //initialisation • fft.OutBuf = OutBuffer; • fft.MagBuf = MagBuffer; • fft.CosSinBuf = TwiddleBuffer; • fft.FFTSize = FFT_SIZE; • fft.FFTStages = FFT_STAGES; • //……remplir InBuffer[] avec les échantillons (par interruption, DMA,…) • RFFT_f32_sincostable(&fft) // fin initialisation • RFFT_f32(&fft); //Calcul de la FFT (les Re et Im) • RFFT_f32_mag(&fft); //Calcul des amplitudes • //… Utiliser les résultats… • }
Alignement de la section « INBUF » - Ligne à ajouter au fichier .cmd INBUF ALIGN( 256 ) : { } > RAML6 PAGE 1 - Cette ligne sera utilisée par l’éditeur de liens (linker) Zone mémoire à utiliser 2 fois la taille de la FFT (ici FFT 128 points) Nom de la section
Performances RFFT_f32 RFFT_f32_mag