Algorithme de Goertzel

Supernaz Messages postés 9 Date d'inscription mardi 29 mars 2005 Statut Membre Dernière intervention 14 janvier 2008 - 29 mars 2005 à 14:15
cs_otan Messages postés 1 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 10 mars 2006 - 10 mars 2006 à 21:09
bonjour,



je souhaiterais pouvoir extraire une frequence a partir d'une sinusoide
echantillonnée contenue dans un vecteur. Aparament, l'algorithme de
Goertzel, derivée de la FFT (transformée de Fourier rapide), presente
quelques avantages en ce qui concerne mon probleme.



Or, je ne trouve rien d'interessant sur le net concernant cet
algorithme. Si quelqu'un peux me venir en aide, ou me donner quelques
URL, ce serait avec joie.



ma methode serait de ce type (programmation objet en C++):



float Calculs::calculerFrequence(vector *sinusoide, float echantillonnage)

{

....

return frequence;

}



merci pour vos reponses

4 réponses

ricky78 Messages postés 126 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 11 juillet 2006
29 mars 2005 à 14:53
Fe : frequence d'echantillonnage
Fs : frequence recherchée
N : nombre d'échantillon ( au moins 150)

k : rang normalisé de la frequence recherchée k = Fs * N / Fe

alphak : coeff à calculer avec alphak = 2 * COS (2 * PI * k / N)

calcul des coeff

q(0) = 0
q(1) =0q(n) x(n) + alphak * q(n-1) - q(n-2) pour n 2 à n = N

calcul du module pour le F recherchée

|X(k)|^2 = q(N-1)^2 + q(N-2)^2 - alphak * q(N-2) * q(N-1)

cordialement

TOCHE
0
Supernaz Messages postés 9 Date d'inscription mardi 29 mars 2005 Statut Membre Dernière intervention 14 janvier 2008
29 mars 2005 à 15:47
wowowo!!



merci pour ces info mais je comprend pas tout ....



par exemple
k = Fs * N / Fe, mais je ne connais pas Fs, c'est justement ce que je veux chercher.




et q(0), q(1), x(n), qu'est-ce au juste?



pour preciser peu etre un peu les choses, mon projet est basée sur une
eolienne, qui tourne et qui delivre une sinusoide (echantillonnée,
valeurs contenues dans un tableau). a partir de ca et d'une frequence
d'echantillonage, je voudrais recuperer la frequence delivrée par cette
eolienne.



voila, merci bien
0
ricky78 Messages postés 126 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 11 juillet 2006
29 mars 2005 à 16:17
Fe c'est la frequence d'échantillonnage de la sinusoide de l'eolienne
Fs est la frequence recherchée, tu fais donc une boucle de la frequence min de l'eolienne a sa frequence max de rotation et pour CHAQUE point de frequence tu calcul le k, le coefficient alphak, le echantillon q(n) et enfin le module.

Le module max correspondra à la frequence de rotation de l'eolienne.

les q(n) correspondent à des étapes de calcul et le x(n) à l'echantillon de ton tableau.

si tu a un tableau du genre

0 10
1 15
2 6
3 -1
4 -9

...

tu commence avec x(0) = 10q(n) x(n) + ak * q(n-1) - q(n-2) pour n 2 à n = N

exemple avec ak = 1
soit q(0) 10 + ak* 0 - 0 10q(1) x(1) + ak * q(0) - 0 soit q(1) 15 + ak * 10 - 0 = 25q(2) x(2) + ak * 25 - 10 soit q(2) 6 + ak*25 - 10 = 21

.....

des que tu as tout les qn, tu calcul le module pour chaque frequence, le module max est la frequence de ton tableau

la presicion dépend du nombre de calcul de frequence cherchée

TOCHE
0
cs_otan Messages postés 1 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 10 mars 2006
10 mars 2006 à 21:09
salut
Je cherche un code C qui detecte un signal DTMF composé de 2 fréquences et le retourne sous forme ASCII
Merci
0
Rejoignez-nous