Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un...

14
Procédure de développement d’un filtre FIR de type Windowed-Sync 1. Type de filtre Réponse impulsionnelle d’un filtre passe-bas idéal : π π n n f n h c LPi ) 2 sin( ] [ = Réponse impulsionnelle d’un filtre passe-haut idéal : π π n n f n h c HPi ) 2 sin( ] [ - = Les réponses impulsionnelles des filtres précédents peuvent être retrouvées en appliquant la transformée inverse de Fourier à la réponse en fréquence du filtre idéal. Les expressions ] [ n h LPi et ] [ n h HPi ci-dessus présentent des singularités à l’origine. On a en fait c LPi f n h 2 ] [ = et c HPi f n h 2 1 ] [ - = . 2. Un filtre idéal n’est pas réalisable : il est non causal, et de longueur infinie. On peut s ‘en approcher en tronquant la réponse impulsionnelle de part et d’autre, puis en la décalant de façon à obtenir un filtre causal. Pour un filtre de longueur M + 1 (où M est pair) : - - ± = 2 2 2 sin ] [ M n M n f n h c LPi π π . 3. Dimensionnement du filtre : c f est la fréquence d coupure normalisée (gain de 2 1 ). La longueur M conditionne la largeur de bande de transition. M est déterminé par l’expression : LB M 4 où LB est la largeur de la bande comprise entre les deux points d’inflexion de la courbe de réponse. 4. La troncature induit des ondulations dans les bandes passantes et de réjection. Il y est remédié en appliquant au filtre une fenêtre de Hamming ou de Blackman.

Transcript of Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un...

Page 1: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

Procédure de développement d’un filtre FIR de type Windowed-Sync

1. Type de filtre Réponse impulsionnelle d’un filtre passe-bas idéal :

ππ

n

nfnh c

LPi

)2sin(][ =

Réponse impulsionnelle d’un filtre passe-haut idéal :

ππ

n

nfnh c

HPi

)2sin(][ −=

Les réponses impulsionnelles des filtres précédents peuvent être retrouvées en appliquant la transformée inverse de Fourier à la réponse en fréquence du filtre idéal. Les expressions ][nhLPi et ][nhHPi ci-dessus présentent des singularités à l’origine. On

a en fait cLPi fnh 2][ = et cHPi fnh 21][ −= .

2. Un filtre idéal n’est pas réalisable : il est non causal, et de longueur infinie. On peut

s ‘en approcher en tronquant la réponse impulsionnelle de part et d’autre, puis en la décalant de façon à obtenir un filtre causal. Pour un filtre de longueur M + 1 (où M est pair) :

−±=

2

22sin

][M

n

Mnf

nhc

LPi

π

π.

3. Dimensionnement du filtre :

cf est la fréquence d coupure normalisée (gain de 2

1).

La longueur M conditionne la largeur de bande de transition. M est déterminé par l’expression :

LBM

4≈

où LB est la largeur de la bande comprise entre les deux points d’inflexion de la courbe de réponse.

4. La troncature induit des ondulations dans les bandes passantes et de réjection. Il y est remédié en appliquant au filtre une fenêtre de Hamming ou de Blackman.

Page 2: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

Hanning :

−=M

nnwH

π2cos46.054.0][

Blackman :

+

−=M

n

M

nnwH

ππ 4cos08.0

2cos5.042.0][

Le choix entre les deux fenêtres dépend de l’application : la fenêtre de Hamming permet une pente plus abrupte (env. + 20%) tandis que la fenêtre de Blackman offre des ondulations résiduelles plus faibles (-74dB au lieu de -53dB).

Exercice : Dimensionner un passe-haut de fréquence centrale fc = 10 kHz. La largeur de la bande de transition n’excèdera pas 40% de la bande totale. On échantillonne à 48 kHz. Solution : • Détermination de la longueur du filtre : M = 4/0.4 = 10. • Réponse impulsionnelle sous Matlab :

» n = [0:10]; » h = -sin(2*pi*10000/48000*(n-5))./(pi*(n-5)); Warning: Divide by zero. » h(6) = 1-2*(10000/48000); » f=[0:100:24000]; » H=freqz(h,1,f,48000); » subplot(211), plot(n,h), title('Réponse impulsion nelle') » subplot(212), plot(f,abs(H)), title('Réponse en f réquence')

0 1 2 3 4 5 6 7 8 9 10-0.4

-0.2

0

0.2

0.4

0.6Réponse impulsionnelle

0 0.5 1 1.5 2 2.5

x 104

0

0.5

1

1.5Réponse en fréquence

Page 3: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

• Fenêtrage : » wb = .42-.5*cos(2*pi*n/10)+.08*cos(4*pi*n/10); » hb = h.*wb; » Hb=freqz(hb,1,f,48000); » subplot(221), plot(n,hb), title('Réponse impulsio nnelle fenêtrée') » subplot(222), plot(n,wb), title('Fenêtre de Black man de 11 points') » subplot(223), plot(f,abs(Hb)), title('Réponse en fréquence après fenêtrage') » subplot(224), plot(f,20*log10(abs(Hb))), title('R éponse en fréquence (dB)')

• Les coefficients à utiliser pour l’implémentation sont ceux obtenus après fenêtrage, c-à-d,

les termes du vecteur hb.

0 5 10-0.4

-0.2

0

0.2

0.4

0.6Réponse impulsionnelle fenêtrée

0 5 100

0.2

0.4

0.6

0.8

1Fenêtre de Blackman de 11 points

0 1 2 3

x 104

0

0.2

0.4

0.6

0.8

1Réponse en fréquence après fenêtrage

0 1 2 3

x 104

-40

-30

-20

-10

0Réponse en fréquence (dB)

Page 4: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents
Page 5: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents
Page 6: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents
Page 7: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents
Page 8: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

Réalisation sur DSP page 132,60 ;************************************************** ************************* ; HP.ASM ; Example program to process data by an order 10 high-pass (fc = 10 kHz) FIR filter ; (11 coefficients). ; ; Ce fichier est obtenu en modifiant le fichier pass.asm ; ; ; ;************************************************** ************************* nolist include 'ioequ.asm' include 'intequ.asm' include 'ada_equ.asm' include 'vectors.asm' list LINEAR EQU $00FFFF ;************************************************** ************************* ;Buffers for talking to the CS4218 ;************************************************** *************************

org x:0 RX_BUFF_BASE equ * RX_data_1_2 ds 1 ; data time slot 1/2 for RX ISR (left audio) RX_data_3_4 ds 1 ; data time slot 3/4 for RX ISR (right audio) TX_BUFF_BASE equ * TX_data_1_2 ds 1 ; data time slot 1/2 for TX ISR (left audio) TX_data_3_4 ds 1 ; data time slot 3/4 for TX ISR (right audio) RX_PTR ds 1 ; pointer for RX buffer TX_PTR ds 1 ; pointer for TX buffer CTRL_WD_12 equ MIN_LEFT_ATTN+MIN_RIGHT_ATTN+LIN2+RIN2 CTRL_WD_34 equ MIN_LEFT_GAIN+MIN_RIGHT_GAIN

Page 9: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

;************************************************** ************************* ;Coéfficients du filtre passe-haut ;************************************************** ************************* org x:$100 ;organisation de la mémoire x: coefs dc 0.00000000000000 ;a0, càd l'échantillon h(1) de MATLAB dc 0.00277131412350973 dc 0.0150630529813713 dc -0.0405675714398365 dc -0.261107387726148 dc 0.583333333333333 ;Symétrie car Sinc-Fenêtré dc -0.261107387726148 dc -0.0405675714398365 dc 0.0150630529813713 dc 0.00277131412350973 dc 0.00000000000000 ;a10, càd l'échantillon h(11) de Matlab ;************************************************** ************************* ;Buffers pour les échantillons en entrée du filtre passe-haut ;************************************************** ************************* org y:$100 ;organisation de la mémoire y: ltdelay bsc 10,$0 ;buffer du canal gauche : xl(n-1), ..., xl(n-10) rtdelay bsc 10,$10 ;buffer du canal droit : xr(n-1), ..., xr(n-10) temp ds 1 ;************************************************** ************************* ;Main Program ;************************************************** ************************* org p:$400 START movep #$040006,x:M_PCTL ; PLL 7 X 12.288 = 86.016MHz movep #$012421,x:M_BCR ; AARx - 1 wait state ori #3,mr ; mask interrupts movec #0,sp ; clear hardware stack pointer move #0,omr ; operating mode 0 move #$40,r6 ; initialise stack pointer move #-1,m6 ; linear addressing jsr ada_init ; initialize codec

Page 10: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

loop jset #3,x:M_SSISR0,* ; wait for RX frame sync jclr #3,x:M_SSISR0,* ; wait for RX frame sync move x:RX_BUFF_BASE,a ; receive left. Accumulator A stores the left

;current sample xl[n] move x:RX_BUFF_BASE+1,b ; receive right. Accumulator B stores the right

;current sample xr[n]

jsr stereo move a,x:TX_BUFF_BASE ; transmit left. Accumulator A must store the left

;sample after filter processing move b,x:TX_BUFF_BASE+1 ; transmit right. Accumulator B must store the

;right sample after filter processing jmp loop ;************************************************** ************************* ;Sous-routines de filtrage passe-haut ;************************************************** ************************* stereo move #LINEAR,m0 ;l'adressage de r0 est linéaire move m0,m4 ;l'adressage de r4 est linéaire andi #$f3,mr ;set scaling mode : no shift move #ltdelay,r4 ;r4 pointe sur xl[n-1] jsr filtre ;le filtre traite l'échantillon gauche

move a,y:temp ;sauvegarde temporaire du résultat du filtrage de ;l'échantillon gauche

move b,a ;la sous-routine "filtre" utilise l'accu A en entrée => ;échant droit dans A

move #rtdelay,r4 ;r4 pointe sur xr(n-1) jsr filtre ;utilisation du même filtre pour l'échantillon droit move a,b ;l'échantillon droit est replacé dans l'accumulateur B move y:temp,a ;l'échantillon gauche est replacé dans l'accumulateur A rts filtre move #coefs,r0 ;r0 pointe sur le premier coefficient (a0) du filtre move a,y1 ;place xl[n] en entrée de l'ALU clr a x:(r0)+,x1 ;accu "a" à 0 pour MAC ,le coeff a0 est placé dans x1 et

Page 11: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

;r0 -> sur le coef suivant

do #10,end1 ;boucle sur les 10 coeff restants. move y1,y0 ;enregistre temporairement l'échantillon utilisé pour la

;mise à jour du buffer mac x1,y1,a x:(r0)+,x1 y:(r4),y1

;A=A+a_i*x[n-i] et on prépare le coeff et l'échantillon ;suivants

move y0,y:(r4)+ ;on met le buffer du canal traité à jour end1 mac x1,y1,a ;A=A+a10*x[n-10] jset #6,sr,overflow ;test si une opération de limitation s'est produite. Si oui,

;saute à "overflow" rts overflow jmp * rts include 'ada_init.asm' end

Page 12: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents
Page 13: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents
Page 14: Procédure de développement d’un filtre FIR de type ... · Procédure de développement d’un filtre FIR de type Windowed-Sync ... Les réponses impulsionnelles des filtres précédents

Audio Precision 02/16/07 11:16:20

ColorSweep Trace Line Style

1 1 Cyan Solid

-40

+0

-20dBu

20 20k50 100 500 1k 2k 5k

Hz