Algorithme de Goertzel

L'algorithme de Goertzel est un algorithme utilisé en traitement du signal pour détecter la présence d'une fréquence dans une séquence d'échantillons. Il fut publié par le physicien américain, Gerald Goertzel (en), en 1958[1]. Il s'agit d'une méthode efficace pour évaluer un terme particulier de la transformée de Fourier discrète; elle ne nécessite qu'une multiplication et deux additions par échantillon.

Pseudo-code[2]

N = taille_du_bloc ; 
samples[N]; // échantillons 
FI = fréquence_à_détecter; 
FS = fréquence_échantillonnage; 
k = (int)(0.5 + (N*FI/FS)); 
ω = 2 * π * k / N; 
cosine = cos(ω); 
sine = sin(ω); 
coeff = 2 * cos(ω); 
scale = N / 2; 

Q0 = Q1 = Q2 = 0; 

pour i de 0 à N-1 
  Q0 = samples[i] + (coeff * Q1) - Q2;
  Q2 = Q1; 
  Q1 = Q0; 
end 

real = (Q0 - (Q1 * cosine)) / scale; 
imag = (- Q1 * sine) / scale; 
puissance = sqrt(real * real + imag * imag); 

Code C++

#define PI 3.14159265358979323846 
#define buffer_size 4410 // 100ms à FS = 44100
double samples[buffer_size]; 
double FS = 44100.0; //fréquence d'échantillonnage 
double FDETECT = 1000.0; // fréquence à détecter 

int K; 
double coefficient; 
double W; 
double sine; 
double cosine; 
double Q0, Q1, Q2; 
double real; 
double imag; 
double magnitude; 
double scalingFactor; 
int i; 

K = (int) (0.5 + ((buffer_size * FDETECT) / FS));
W = (2.0 * PI * K) / buffer_size; 
cosine = cos(W); 
sine = sin(W); 
coefficient = 2 * cos(W); 
scalingFactor = buffer_size / 2.0; 

Q0 = 0; 
Q1 = 0; 
Q2 = 0; 
	
for (i=0 ; i<buffer_size ; i++) 
 {
  Q0 = samples[i] + (coefficient * Q1) - Q2;
  Q2 = Q1;
  Q1 = Q0;
 }
real = (Q0 - (Q1 * cosine)) / scalingFactor; 
imag = (- Q1 * sine) / scalingFactor;	
magnitude = sqrt(real * real + imag * imag);

Voir aussi

Notes et références

  1. Gerald Goertzel, An Algorithm for the Evaluation of Finite Trigonometric Series, The American Mathematical Monthly, Vol. 65, No. 1 (janvier 1958), pp. 34-35
  2. Kenvin Banks, « "The Goertzel algorithm" »,
  • Portail des mathématiques
  • Portail de l'informatique théorique
Cet article est issu de Wikipedia. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.