Implémentation de l'algorithme de Goertzel en C
Je suis la mise en œuvre de BFSK à saut de fréquence, le système de communication sur un processeur DSP. Il a été suggéré par certains membres du forum à l'utilisation de l'algorithme de Goertzel pour la démodulation de fréquence de saut à des fréquences spécifiques. J'ai essayé la mise en œuvre de l'algorithme de goertzel en C. le code est le suivant:
float goertzel(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, float* data)
{
int k,i;
float floatnumSamples;
float omega,sine,cosine,coeff,q0,q1,q2,result,real,imag;
floatnumSamples = (float) numSamples;
k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
omega = (2.0 * M_PI * k) / floatnumSamples;
sine = sin(omega);
cosine = cos(omega);
coeff = 2.0 * cosine;
q0=0;
q1=0;
q2=0;
for(i=0; i<numSamples; i++)
{
q0 = coeff * q1 - q2 + data[i];
q2 = q1;
q1 = q0;
}
real = (q1 - q2 * cosine);
imag = (q2 * sine);
result = sqrtf(real*real + imag*imag);
return result;
}
Lorsque j'utilise la fonction pour calculer le résultat à des fréquences spécifiques pour un jeu de données, je ne suis pas d'obtenir des résultats corrects. Cependant, si j'utilise le même ensemble de données et de calculer les goertzel résultat à l'aide de MATLAB goertzel() de la fonction, puis-je obtenir des résultats parfaitement. Je suis en œuvre de l'algorithme à l'aide de C, avec l'aide de quelques tutoriels en ligne que j'ai trouvé sur internet. Je veux juste la voir vous les gars si la fonction est la mise en œuvre de l'algorithme de goertzel correctement.
source d'informationauteur anshu
Vous devez vous connecter pour publier un commentaire.
Si vous dites que le Matlab mise en œuvre est bien parce que ses résultats correspondent à la suite pour que la fréquence d'une DFT ou FFT de vos données, alors il est probablement parce que le Matlab mise en œuvre d'une normalisation des résultats par un facteur d'échelle, comme on le fait avec la FFT.
Modifier votre code pour prendre en compte cela et voir si cela améliore vos résultats. Notez que j'ai aussi changé la fonction et de résultat noms pour refléter le fait que votre goertzel est le calcul de l'ampleur, de ne pas le terminer complexe de suite, pour plus de clarté:
Souvent, vous pouvez simplement utiliser le carré de l'amplitude dans vos calculs,
par exemple pour la détection de tonalité.
D'excellents exemples de Goertzels sont dans le PBX Asterisk DSP code
Asterisk le code DSP (dsp.c)
et dans le spandsp bibliothèque SPANDSP DSP de la Bibliothèque
Envisager deux échantillon d'entrée de vagues formes:
1) une onde sinusoïdale dont l'amplitude A et de fréquence W
2) une onde cosinus avec la même amplitude et de fréquence A et W
Algorithme de Goertzel devrait donner les mêmes résultats pour les deux mentionné d'entrée de vagues formes, mais le code fourni des résultats dans les différentes valeurs de retour. Je pense que le code devrait être modifié comme suit: