Aide pour coder filtre numérique IIR passe band.

Un problème bien formulé est à moitié résolu.

Postby 0zmax » Mon Nov 19, 2012 12:00 am

Bonjour à tous.

Je ne sais pas si il y a des spécialistes de la programmation de filtre numérique IIR sur DSP dans ce forum mais bon je tente quand même ma chance.

Donc voilà, j'essaye de coder un filtre passe bande en utilisant la méthode de Robert Bristow-Johnson. http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt

Japplique la méthode à la lettre mais une fois que je test le code sur la carte DSP (qui est celui d'Elektor). J'ai une oscillation à la sortie de 24kHz sans même injecter un signal à l'entré ... Cela fait des semaines que je bloque. Est ce que quelqu'un serai t il me venir en aide. Ou sinon, connaissez quelqu'un qui pourrai ?

Je vous laisse une partie du programme :

;Filtre IIR passe bande
;Frequence central : 1kHz
;Bande passante : 1kHz
;Equation RBJ : y(n) = b0*x(n) + b1*x(n-1) + b2*x(n-2) - a1*y(n-1) - a2*y(n-2)


coefb0:equ 0.16759
coefb1:equ 0
coefb2:equ-0.16759
coefa1:equ-0.65913
coefa2:equ 0.16481
;Pour éviter tout depassement de capacité de l'ALU, tous les coeff ont été divisé par deux.
;Ce qui nécessite un recalage à gauche du résultat final en fin de loop.


AudioLoop

jclr#RightRx,x:LRFlag,*
bclr#RightRx,x:LRFlag
move x:RxBuffBase,x0 ; sortie DAC left

jmpAudioLoop'
0zmax
 
Posts: 23
Joined: Mon Jan 20, 2014 8:05 am

Postby 0zmax » Mon Nov 19, 2012 12:00 am

Bon ok ... l'éditeur de texte du forum d'elektor déconne trop Je n'arrive pas le mettre en entier... Le programme est un pièce jointe.
Attachments
Code-tst-BPF.rtf
(1.77 KiB) Downloaded 30 times
0zmax
 
Posts: 23
Joined: Mon Jan 20, 2014 8:05 am

Postby iso14000 » Mon Nov 19, 2012 12:00 am

je n'y connais pas grand chose.
Mais pour commencer est ce que si tu fais un simple loopback ça fonctionne?

genre

toto
RxBuffBase =>TxBuffBase
jmp toto


si ça marche tu peux essayer un filtre non récursif pour vérifier que tout fonctionne , en particulier la MAC

peut être as tu tout simplement un truc oscillant par nature (et par mégarde)

en outre si je ne m'abuse il vaut mieux gérer les overflows au cas par cas après chaque multiplication/accumulation

A++
tant qu'un auteur sera aussi un modérateur ici (et donc plaignant et juge) je serais un Troll assumé
iso14000
 
Posts: 3083
Joined: Fri Jan 03, 2014 1:55 pm

Postby obdh » Mon Nov 19, 2012 12:00 am

Je n'ai pas vraiment le temps de regarder en détail, mais on peut faire des oscillateurs avec ces structures de filtre, tout dépend du calcul des coefficients. J'ai fait récemment une application avec du filtrage numérique dans un PIC32 en virgule fixe, et il est très facile de faire des erreurs. Le debug avec des patterns de test et buffer de trace est important. Une simulation sur pc est utile : idéalement Matlab, éventuellement avec un tableur dans le cas d'un calcul en virgule flottante. En virgule fixe, et avec un compilateur classique (non dsp), il faut se débrouiller. Ce n'est pas très difficile, mais il faut avoir les idées claires sur les formats en entrée, en sortie, les décalages qu'il faut opérer pour interpréter correctement les données. Sinon, gare aux débordements et aux changements intempestifs de signe. J'avais passé quelques heures pour corriger les différentes erreurs. Programmer un filtre transparent (avec les coefficients alors triviaux) est un bon moyen de traquer certains problèmes.
J'avais trouvé un soft bien pratique pour calculer les coefficients : ASN Filter Designer Lite. Il est bridé sur la fréquence d'échantillonnage, mais comme fréquences de coupure et d'échantillonnage sont directement liées, il suffit de tout diviser pour calculer sans limitation.
obdh
 
Posts: 487
Joined: Fri Jan 17, 2014 4:39 pm

Postby 0zmax » Mon Nov 19, 2012 12:00 am

Alors pour le loopback, j'avais déjà effectué fait des testes et cela fonctionnait sans souci. J'ai déjà testé un filtre passe bas et il n y avais pas d'autre problème.

Les problème sont arrivé avec le filtre passe bande.

En cherchant sur la toile, j'ai lu que le problème d'oscillation était connu et que cela état due à un overflow (oscillation) et qu'il était possible d'y remédier par " algorithme saturation arithmétique". Mais je n'ai pas bien réussi à comprendre ...
0zmax
 
Posts: 23
Joined: Mon Jan 20, 2014 8:05 am

Postby obdh » Mon Nov 19, 2012 12:00 am

Sur les dsp, je crois qu'il est possible de sélectionner un mode de saturation dans lequel on n'a pas de changement de signe, qui est beaucoup plus grave qu'une saturation normale. Mais la saturation ne devrait pas arriver, il faut vérifier les coefficients (attention au format, particulièrement en virgule fixe), les niveaux d'entrée et les résultats des différents calculs. La saturation peut intervenir à un calcul intermédiaire et passer inaperçue ensuite.
obdh
 
Posts: 487
Joined: Fri Jan 17, 2014 4:39 pm

Postby 0zmax » Tue Nov 20, 2012 12:00 am

Pour la valeur des coefficients, j'ai été prudent en les divisant tous par 2. Je finis ensuite la boucle AudioLoop en recalant à gauche le résultat final. Cela dit pour info, les maximas de l'ALU de mon DSP doit être compris entre 1 et -1 . Au delà et en dessous il y a overflow.

Sinon j'ai noté un truc bizarre en simulation. Pour faire simple, j'ai pris une capture d'écran. En haut dans la valeur des registres que j'ai moi même initié x0 = 12456h. A la fin de la boucle le résultat final des calcules se trouvent en a =61a0c9b0174h. Ensuite la boucle revient à son point de départ et le registre b sauvegarde la valeur précédente de sortie ( Y(n-1)). Et la, bizarre, les résultats entre a et b ne sont pas égaux ??

En principe a doit être égal à b car ce dernier est l'image de la sortie Y(n) retardé de -1 donc Y(n-1). Il y a eu troncature.

Info :
a et b sont des registres de 56 bit max (dont 48 bit utilisé dans mon cas)
TxBuffBase registre 24 bit max
Attachments
Screen-capture-of-Symphony.png
0zmax
 
Posts: 23
Joined: Mon Jan 20, 2014 8:05 am

Postby iso14000 » Tue Nov 20, 2012 12:00 am

et si tu faisais un truc moi complexe pour commencer?

un filtre récursif qui converge à tous les coups par exemple?

y(n)=0.5y(n-1)-0.25y(n-2) par exemple?

A++
tant qu'un auteur sera aussi un modérateur ici (et donc plaignant et juge) je serais un Troll assumé
iso14000
 
Posts: 3083
Joined: Fri Jan 03, 2014 1:55 pm


Return to Mon circuit ne marche pas (encore)

Who is online

Users browsing this forum: No registered users and 2 guests