Algoritmo de Goertzel
O algoritmo Goertzel é um algoritmo usado no processamento de sinais para detectar a presença de uma frequência em uma sequência de amostras . Foi publicado pelo físico americano Gerald Goertzel (in) , em 1958 . Este é um método eficiente para avaliar um termo específico da transformada discreta de Fourier ; requer apenas uma multiplicação e duas adições por amostra.
Pseudo-código
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);
Código C ++
#define PI 3.14159265358979323846
#define buffer_size 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);
Veja também
Notas e referências
-
Gerald Goertzel, An Algorithm for the Evaluation of Finite Trigonometric Series , The American Mathematical Monthly , Vol. 65, No. 1 (janeiro de 1958), pp. 34-35
-
Kenvin Banks, " " O algoritmo Goertzel " " ,2002