Bonjour,
Dans les formules que je vous ai parachutées,
x est le vecteur
réel des amplitudes (sonores) du signal échantillonné en fonction du temps.
Le codage va dépendre de l'outil d'acquisition utilisé. Le plus courant est un codage en entiers signés (complément à deux) représentant un signal sonore fluctuant autour de zéro. Cela peut être vérifié en en calculant l'histogramme.
Les formules pourraient être traduites en un code Delphi comme ci-dessous (mais syntaxe pas testée !), dans lequel les tableaux sont pré-initialisés dans le code appelant.
J'ai renommé I et Q en Re et Im pour être plus clair.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| uses
System.Generics.Collections;
procedure SlowFT(x: TArray<smallint>; //signal réel (par ex. 4096 entiers 16 bits)
var Re,Im, //parties réelles et imaginaires de la TF
freq, //fréquences du signal
ps: Tarray<Single>); //spectre du signal
var om: extended;
begin
var N := Length(x);
for var k := 0 to N-1 do begin
Re[k] := 0; Im[k] := 0;
for var i := 0 to N-1 do begin
om := 2*pi*k*i/N;
Re[k] := Re[k] + x[i]*cos(om);
Im[k] := Im[k] + x[i]*sin(om);
end;
Re[k] := Re[k]/N; Im[k] := Im[k]/N;
ps[k] := Re[k]*Re[k] + Im[k]*Im[k];
freq[k] := k/N ;
if (k > N/2) then freq[k] := 1 - freq[k]; //par convention
end;
end; |
Notez qu'à cause de la symétrie des sinus et cosinus autour de N/2, il suffit de considérer seulement la partie du spectre (fréquences positives) allant de 0 à N/2 (mais en en doublant la valeur).
Pour ce qui concerne votre souci de temps réel, je ne crois pas qu'il y ait problème: les fréquences acoustiques sont très inférieures aux vitesses d'horloge des ordinateurs actuels.
La FFT est nécessaire dans des cas plus exigeants comme le traitement d'images pour lequel les débits sont bien plus importants.
Et un code analoque au code ci-dessus peut être largement optimisé, par exemple si N est constant au cours de vos expériences, vous pouvez précalculer (sous forme de tableaux) les sinus et cosinus qui sont des coefficients ne dépendant pas du signal d'entrée.
alx.
Partager