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
Transformée de Fourier discrète La TFD calcule N valeurs espacées de f0=Fe/N temps x(nTe) Re(X(kf0)) Im(X(kf0)) fréquence Fe/N Fe Te NTe
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 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 - 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