Lalgorithme 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, , en 1958Gerald Goertzel, An Algorithm for the Evaluation of Finite Trigonometric Series, The American Mathematical Monthly, Vol. 65, No. 1 (janvier 1958), . 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 Pseudo-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++ // Fonction pour calculer l'amplitude fréquentielle avec l'algorithme de Goertzel 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; scalingFactor = signalLength / 2.0;

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

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

for (int i=0 ; i<signalLength ; i++)

// Blacman window // Q0 = (0.426591 - .496561*cos(2*M_PI*i/signalLength) +.076848*cos(4*M_PI*i/signalLength))*signal[i]+(coefficient * Q1) - Q2; // Normal acquisition Q0 = signal[i]+(coefficient * Q1) - Q2; Q2 = Q1; Q1 = Q0;

real = (Q1 - (Q2 * cosine)) / scalingFactor; imag = (Q2 * sine) / scalingFactor; //real=cosine*Q1-Q2; //imag=sine*Q1; return sqrt(real * real + imag * imag); }

Voir aussi DTMF

Notes et références

Catégorie:Théorie de Fourier Catégorie:Algorithme numérique Goertzel