Algorithme de Goertzel

Un article de Wikipédia, l'encyclopédie libre.

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][modifier | modifier le code]


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++[modifier | modifier le code]


// Fonction pour calculer l'amplitude fréquentielle avec l'algorithme de Goertzel
// Tableau de signal éléments échantillonnés à sampleFrequency
double goertzelAmplitude(const double *signal, int signalLength, double frequency, int sampleFrequency)
{
    double W;
    double sine;
    double cosine;
    double Q0, Q1, Q2;
    double real;
    double imag;
    double scalingFactor;

    double K = (int) (((signalLength * frequency) / sampleFrequency));
    W = (2.0 * M_PI * frequency) / sampleFrequency;
    cosine = cos(W);
    sine = sin(W);
    double coefficient = 2 * cosine;
    scalingFactor = signalLength / 2.0;

    Q0 = 0;
    Q1 = 0;
    Q2 = 0;

    for (int i=0 ; i<signalLength ; i++)
    {
        Q0 = signal[i] + (coefficient * Q1) - Q2;
        Q2 = Q1;
        Q1 = Q0;
    }
    real = (Q1 - (Q2 * cosine)) / scalingFactor;
    imag = (Q2 * sine) / scalingFactor;
    return sqrt(real * real + imag * imag);
}

Voir aussi[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. Gerald Goertzel, An Algorithm for the Evaluation of Finite Trigonometric Series, The American Mathematical Monthly, Vol. 65, No. 1 (janvier 1958), p. 34-35
  2. Kenvin Banks, « "The Goertzel algorithm" »,