Hier noch nen Goertzel in K&R C:
Der macht Goertzel auf der Frequenz 9/64 (wenn die Abtastfrequenz 1
ist). Der Algorithmus nimmt 64 Abtastwerte, liefert also den gleichen
Wert wie eine FFT der Länge 64 am 9. bin. Die Rechnung ist im relevanten
Teil rein integer, die Umrechnung zum Schluss braucht allerdings float
(aber ohne Sinus/cosinus Berechnung, das sind Konstanten). Der
Algorithmus ist auch relativ einfach auf andere Frequenzen umrüstbar,
siehe die Kommentare. Die Funktion 'winkel' ist 'atan2', also die
Umrechnung von Imaginärteil/Realteil in den Winkel.
Nicht ganz schön und elegant, z.B. das Umkopieren der q0/q1 und die
Rechnung am Schluß, aber geht.
/* ************************************************** */
uint16_t goertzel_9_64(int16_t r[],int32_t re[],int32_t im[])
/* ************************************************** */
{
// macht goertzel auf der Frequenz 9/64
// 2*cos(9/64*2*pi) = 1.26878
// 2202/8192= 0.26879
int32_t q0,q1,q2;
int16_t k;
q1=0l;
q2=0l;
for(k=0;k<64;k++){
q0=q1+((q1*2202)>>13)-q2+r[k];
q2=q1;
q1=q0;
}
q0=q1+((q1*2202)>>13)-q2;
q2=q1;
q1=q0;
im[0]=(int32_t)(q2 *sin(2*M_PI*9/64.0));
re[0]=(int32_t)(q1-q2*cos(2*M_PI*9/64.0));
return (winkel(im[0],re[0]));
}