2014-09-03 1 views
0

Je suis en train de mettre en œuvre des simples filtres IIR (forme directe I) en C.Comment implémenter les filtres RII dans C?

Pour passe-haut (10 Hz à 256 échantillons/seconde) Je fais ceci:

int Diff = Sample - Previous_Sample; 

HP_Output = ((HP_Output + Diff) * 4)/5; 

Pour faible passer (10 Hz @ à 32 échantillons/seconde) Je fais ceci:

int Diff = Sample - LP_Output ; 

LP_Output = ((LP_Output + Diff) * 2)/3; 

maintenant, je me demandais: sont les deux implémentations mathématiquement correcte?

Et si je veux changer la fréquence d'échantillonnage d'entrée (ou fréquence de filtre), comment puis-je calculer les nouveaux facteurs?

+0

Ce qui manque entièrement à votre code, c'est * time *. Le taux d'échantillonnage est très important. Un filtre pratique utilise de nombreux échantillons, pas un seul. Utilisez Google pour trouver des réponses, la meilleure requête est "iir calculateur de coefficient". –

+0

@HansPassant J'appelle la fonction pour chaque échantillon (à 256 échantillons par seconde) – Muis

+1

Pas ce que je voulais dire, il faut stocker de vieux échantillons. Enregistré à T-1, T-2, T-3, etc. Vous avez besoin d'un tableau. Ce sera très évident une fois que vous avez lu les google hits, vous devrez passer du temps. –

Répondre

0

La sortie passe-haut est correcte pour une implémentation de filtre de premier ordre. De high-pass filter realization on wikipedia, et compte tenu d'un taux d'échantillonnage fs et la fréquence de coupure du filtre fc, le facteur requis alpha peut être obtenu à partir de la relation:
enter image description here

qui donne:
enter image description here

Dans l'extrait fourni, ce résultats dans alpha ~ 4/5.

Pour le filtre passe-bas du premier ordre, votre code ne sort essentiellement que les échantillons d'entrée mis à l'échelle (depuis LP_Output + Diff == LP_Output + Sample - LP_Output == Sample). Au lieu de cela, je pense:

LP_Output = LP_Output + Diff * 2/3; 

Maintenant, le facteur alpha peut être obtenu à partir de la même dérivations sur la base low-pass filter realization on wikipedia être:
enter image description here

Encore une fois, dans l'extrait fourni, cela se traduit par alpha ~ 2/3. Enfin, comme Hans l'a indiqué dans les commentaires, pour les implémentations de filtres d'ordre supérieur, vous devriez jeter un coup d'œil aux outils de conception de filtre IIR pour dériver des coefficients.

+0

Je ne comprends pas vraiment votre suggestion de changer 'LP_Output = ((LP_Output + Diff) * 2)/3' à 'LP_Output = LP_Output + Diff * 2/3', parce qu'il ne semble pas avoir d'effet sur le résultat? Les deux lignes de codes produisent la même valeur? – Muis

+0

'LP_Output + Diff * 2/3' est équivalent à' LP_Output + (Diff * 2/3) '.Par exemple, si le 'LP_Output' actuel est 42, et la nouvelle entrée' Sample' est 6, votre code aurait donné 'Diff == 6-42 == -36', puis mis à jour' LP_Output == ((42 + -36) * 2)/3 == ((6) * 2)/3 == 4'. Ma version met à jour 'LP_Output' à' LP_Output == 42 + -36 * 2/3 == 42 + (-24) == 18. – SleuthEye

Questions connexes