Professional Documents
Culture Documents
Chapter 14
Finite Impulse Response (FIR)
Filter Implementation
Outline
Digital Filters and FIR filters
Implementation of FIR Filters on C54x
Implementation of FIR Filters on C55x
Comparison of C54x and C55x
ESIEE, Slide 2
Copyrigh
ESIEE, Slide 3
Copyrigh
Digital Filters
Sampling
frequency
fS
x(t)
Analog
antialiasing
filter
A
D
C
xn
ESIEE, Slide 4
yn
xn
Digital Filter
Digital Filter
D
A
C
Analog
y(t)
smoothing
filter
yn
Copyrigh
1 R
2 R
Linearity
1x1( n ) 2 x2 ( n ) 1 y1( n ) 2 y2 ( n )
Time Invariance
x ( n ) y ( n ) x ( n n0 ) y ( n n0 )
ESIEE, Slide 5
Copyrigh
Impulse Response
n 0 un 0
Impulse sequence un
u0 1
n 0 u 0
n
un
n=0
ESIEE, Slide 6
Digital Filter
hn
Copyrigh
n=-1 0
n=-1 0
n=-1 0
n=-1 0
x-1un+1
xn
xu
k nk
x0un
x1un-1
x2un-2
ESIEE, Slide 7
Copyrigh
yn
x output(u
yn
ESIEE, Slide 8
n k
xh
k n k
xk hnk hk xnk
Copyrigh
xn e
j 0 nTe
y n x n H (0 )
H (0 )
H (0 ) H (0 ) e
ESIEE, Slide 9
hk e
j 0 kTe
j arg( H ( 0 ))
A(0 )e
j ( 0 )
Copyrigh
H ( ) H ( ) e
1
hn
2f e
j arg( H ( ))
f e
jnTe
H
(
)
e
d
ESIEE, Slide 10
Amplitude
f e
( ) arg H
Phase
A( )e
j ( )
( )
( )
Group
delay
Copyrigh
X ( )
xne
jnTe
Y ( )
yne
jnTe
Y ( ) H ( ) X ( )
ESIEE, Slide 11
Copyrigh
Z Transfer Function
H(z)
H ( )
hne
hn z
jnTe
H ( z ) z e jTe
Y( z) X ( z)H( z)
ESIEE, Slide 12
Copyrigh
yn
xk hn k hk xnk
Y ( ) H ( ) X ( )
Y( z) X ( z)H( z)
ESIEE, Slide 13
Copyrigh
N(z)
H(z)
D( z )
bi z
i0
P
1 ak z
k 1
i0
k 1
yn bi xni ak yn k
ESIEE, Slide 14
Copyrigh
H ( z ) bi z
i0
FIR
hn z
n 0, Q 1 hn 0
n 0, Q 1 hn bn
IIR
N(z)
With D( z ) constant.
H(z)
D( z )
ESIEE, Slide 15
Copyrigh
i 0
i 0
yn hi xn i bi xn i , bi hi .
i0
k 1
yn bi xni ak yn k
ESIEE, Slide 16
Copyrigh
Or:
hn
ESIEE, Slide 17
Copyrigh
Real Part
0
-0.5
-1
-1
ESIEE, Slide 18
-0.5
0.5
Copyrigh
N ( z ) b0 b1 z
b [b0
b3 z
b2 ] [1 1 1 1].
ESIEE, Slide 19
b2
b2 z
b1
[Hf,f]=freqz(b,a,256,1);
HfA=abs(Hf);
Hfphi=angle(Hf);
Copyrigh
3.5
0.5
2.5
-0.5
2
-1
1.5
-1.5
1
-2
-2.5
ESIEE, Slide 20
0.5
0.05
0.1
0.15
0.2
0.3
0.35
0.25
Frequency, FS=1
0.4
0.45
0.5
0.05
0.1
0.15
0.2
0.3
0.35
0.25
Frequency, FS=1
0.4
0.45
0.5
Copyrigh
x=cos(2*pi*[0:99]*0.25)+2*cos(2*pi*[0:99]*0.1);
y=filter(b,a,x);
x is the sum of
2 frequencies :
0.25 and 0.1.
-1
-2
-2
-4
-3
ESIEE, Slide 21
20
40
Time
60
Output y
80
100
-6
The filter
cancels the
frequency 0.25.
0
20
40
Time
60
80
100
ESIEE, Slide 22
Copyrigh
f in Hz
1200
ESIEE, Slide 23
2600
Copyrigh
ESIEE, Slide 24
Least square
method
120
100
Window
method
80
60
40
20
Mini Max
window
-20
ESIEE, Slide 25
500
1000
1500
2000
2500
3000
3500
4000
4500
5000
Copyrigh
0.4
0.35
hn
0.3
0.25
0.2
0.15
0.1
0.05
0
-0.05
-0.1
ESIEE, Slide 26
10
15
20
25
Copyrigh
2 possible cases:
ESIEE, Slide 27
h(n)=h(N-1-n)
h(n)=-h(N-1-n)
Copyrigh
Asymmetrical case:
( f ) kf
2
ESIEE, Slide 28
Copyrigh
Quantization of coefficients
ESIEE, Slide 29
Bi = log2(hmax)
Coefficients in Qk with k = 16-Bi
Copyrigh
Matlab Example
ESIEE, Slide 30
Bre=round(Bre*2^15);
fp=fopen('coef.asm','wt')
for i=1:22
fprintf(fp,' .word %d \n',Ba(i))
end
fclose(fp)
Copyrigh
Matlab Example
ESIEE, Slide 31
File coef.asm
Can be edited
to be used
with CCS.
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
.word
39
-92
-242
25
668
579
-978
-2229
86
6374
12127
12127
6374
86
-2229
-978
579
668
25
-242
-92
39
Copyrigh
Common case:
ESIEE, Slide 32
Copyrigh
Transversal structures
Trellis structure
ESIEE, Slide 33
Linear buffers
Circular buffers
xn-1
xn
b0
b1
xn-2
b2
xn-N+1
b3
bN-1
yn
bN-1
bN-2
Transposed structure
b3
b2
b1
b0
yn
xn
ESIEE, Slide 34
Copyrigh
Basic operations:
ESIEE, Slide 35
Output y(n)
Copyrigh
ESIEE, Slide 36
Copyrigh
ESIEE, Slide 37
Output y(n)
N-1 Shifts in the delay line.
Copyrigh
ESIEE, Slide 38
Output y(n)
Copyrigh
MACD Instruction
MACD:
ESIEE, Slide 39
src=src+Smem*pmad;
T=Smem;
(Smem+1)=Smem
i+N-1
b(0)
Data Memory
Addresses
Content
k=Smem
x(n)
k+1
x(n-1)
k+2
x(n-2)
k+N-1
x(n-N+1)
dummy place
for copy of
k+N
ESIEE, Slide 40
x(n-N+1)
Copyrigh
Initialization of Registers
Initialization of ACCU
ESIEE, Slide 41
2 words, 2cycles.
RPT #n
RPTZ src, #n
ESIEE, Slide 42
adr_debut_dat,N+1
adr_debut_dat+N-1
AR1 and FRCT
#adr_fin_dat, AR1
FRCT
A, #N-1
*AR1-, adr_coef, A
ESIEE, Slide 43
adr_coef
ESIEE, Slide 44
.global
adr_coef
.sect ".coef"
.word 0X400, 0X400
.word 0X400,0X400,0X400,0X400,0X400
.word 0X400,0X400,0X400,0X400,0X400
.word 0X400,0X400,0X400,0X400,0X400
.word 0X400,0X400,0X400,0X400,0X400
.word 0X400,0X400,0X400,0X400,0X400
.word 0X400,0X400,0X400,0X400,0X400
Copyrigh
ESIEE, Slide 45
Copyrigh
N
adr_fin_dat
.mmregs
.global
.global
.global
.set
.bss
.set
.text
* Initialization of
LD
SSBX
* Initialization of
STM
STM
STM
ESIEE, Slide 46
adr_debut_dat
adr_fin_dat
adr_coef
32
adr_debut_dat,N+1
adr_debut_dat+N-1
DP and FRCT
#0, DP
FRCT
AR0, AR1, AR2
#(adr_debut_dat),AR2
#(adr_debut_dat-1),AR1
#N, AR0
Copyrigh
debut:
* set AR1 at adr_fin_dat
MAR
*AR1+0
* Read x(n) at DRR
LDM
DRR0, A
STL
A,*AR2
* Endless filter loop
RPTZ
A, #N-1
MACD
*AR1-, adr_coef, A
* Write y(n) in DXR
* by saving the high part of ACCU in DXR
STH
A,DXR0
* Go back to the beginning of the loop
B
debut
ESIEE, Slide 47
See files
firmacd.asm
and
fircoef.asm
for the test in
directory
tutorial.
Copyrigh
ESIEE, Slide 48
Results
ESIEE, Slide 49
Copyrigh
ESIEE, Slide 50
Copyrigh
Second Test
ESIEE, Slide 51
Copyrigh
Second test
ESIEE, Slide 52
Copyrigh
ESIEE, Slide 53
ESIEE, Slide 54
Time n
Time n+1
Time n+2
Time n+3
x(n-1)
x(n)
x(n-2)
x(n-1)
x(n)
x(n+1)
x(n+2)
x(n)
x(n+1)
x(n+2)
x(n+3)
x(n+1)
Copyrigh
2 circular buffers
1 for data
1 for coefficients
Data
Memory
adr_deb_data
Coefficient
memory
adr_deb_coef
b(N-1)
b(N-2)
pnt_coef
pnt_data
adr_fin_coef
ESIEE, Slide 55
adr_fin_coef
b(0)
Copyrigh
ESIEE, Slide 56
end
output y(n) from ACCU
increment pnt_data of 1
Copyrigh
MACXmem,Ymem,src[,dest]
ESIEE, Slide 57
dst=src+Xmem*Ymem
T=Xmem
With Xmem, Ymem use only AR2 to AR5
Can be executed in 1 cycle time.
BK register:
ESIEE, Slide 58
Copyrigh
Examples:
ESIEE, Slide 59
ARi
BK
xxxxxxxxxxx00010
N=30=1 1 1 1 0
ARi
End_address =
xxxxxxxxxxx11111
ESIEE, Slide 60
Copyrigh
ESIEE, Slide 61
Move Instructions
Program
Data
MVPD, MVDP
READA, WRITEA
Data
Data
MVKD, MVDK, MVDD
ESIEE, Slide 62
MMR
Data
MVMD, MVDM
MMR
MMR
MVMM
Copyrigh
N
adr_debut_dat
adr_debut_coef
adr_fin_dat
adr_fin_coef
.mmregs
.global
.global
.global
.global
.global
adr_debut_dat
adr_fin_dat
adr_debut_coef
adr_fin_coef
adr_coef
.set
.usect
.usect
.set
.set
32
"buf_data", N
"buf_coef", N
adr_debut_dat+N-1
adr_debut_coef+N-1
.text
* Initialization of BK,AR0,FRCT
STM
#N, BK
STM
#-1, AR0
SSBX
FRCT
* Initialization of AR2, AR3
STM
#(adr_debut_dat),AR2
STM
#(adr_fin_coef),AR3
ESIEE, Slide 63
Copyrigh
* Endless loop
debut:
* Read x(n) at DRR
LDM
DRR0, A
STL
A, *AR2
* Calculation of y(n)
RPTZ
A, #N-1
MAC
*AR2+0%, *AR3+0%, A
* Write y(n) in DXR
* by saving high part of ACCU
STH
A, DXR0
* Go back to the beginning of the loop
MAR
*AR2+
B
debut
ESIEE, Slide 64
See files
fircirc.asm
and
fircoef.asm
for the test.
Copyrigh
ESIEE, Slide 65
buf_dataalign(64)>DATA
page1
Copyrigh
N 1
1
2
N 1
ESIEE, Slide 66
x n
N 1
N odd
Copyrigh
FIRSXmem,Ymem,pmad
Xmem, Ymem corresponds to:
x(n-i), x(n-N+1+i)
pmad PAR
while RC 0
ESIEE, Slide 67
Copyrigh
3 arrays:
adr_debut_coef
PAR
Program
Memory
Data
Memory
b(0)
x(n-2)
b(1)
b(2)
x(n)
x(n-1)
x(n-3)
adr_debut_dat0
AR2
adr_debut_dat1
AR3
x(n-5)
x(n-4)
Example for N = 6
2 circular
buffers
ESIEE, Slide 68
Copyrigh
BK = N/2
At the beginning AR2 and AR3 point to:
x(n)
x(n-1)
x(n-N/2-1)
ESIEE, Slide 69
x(n-N+3)
x(n-N/2)
x(n-N+1)
x(n-N+2)
x(n-N/2-1)
x(n-N+3)
x(n-N/2)
x(n-N+1)
x(n-N+2)
Copyrigh
ESIEE, Slide 70
Copyrigh
N
Nsur2
adr_debut_coef
adr_debut_dat
adr_debut_dat1
.mmregs
.global
.global
.global
.set
.set
.set
.usect
.usect
adr_debut_coef
adr_debut_dat0
adr_debut_dat1
32
16
adr_coef
"buf_data0", N
"buf_data1", N
.text
* Initialization of BK, AR0,FRCT
STM
#Nsur2, BK
STM
#-2, AR0
SSBX
FRCT
* Initialization of AR2, AR3
STM
#(adr_debut_dat0),AR2
STM
#(adr_debut_dat1),AR3
ESIEE, Slide 71
Copyrigh
See files
firsym.asm
and
fircoef.asm
for the test.
Copyrigh
Tutorial
ESIEE, Slide 73
Copyrigh
Implementation of symmetrical or a
symmetrical FIR filters
ESIEE, Slide 74
Copyrigh
t
MAC
MAC
AC
A0
AC1
ESIEE, Slide 75
Copyrigh
yn
Use of block
filtering in order to
calculate 2 output
samples at a time.
b 0 x n + b 1 x n-1 + b 2 x n-2 + b 3 x n-3
C54x
ESIEE, Slide 76
t
MAC
MAC
AC
A0
AC1
Copyrigh
Block Filter
yn m bi xn mi
i 0
ESIEE, Slide 77
m 0, M 1 .
Copyrigh
Coeffcients
b0
AR2
b1
AR3
b2
b3
Input data
xn
xn-1
xn-2
xn-3
xn-4
xn-5
yn = b0xn+b1xn-1+b2xn-2+b3xn-3
yn-1 = b0xn-1+b1xn-2+b2xn-3+b3xn-4
yn-2 = b0xn-2+b1xn-3+b2xn-4+b3xn-5
ESIEE, Slide 78
Copyrigh
Double loop:
On coefficients and on m
ESIEE, Slide 79
yn
AR2
AR3
CDP
B
C
D
MAC
MAC
AC0
AC1
Coeffcients
b0
AR2
b1
AR3
b2
b3
Input data
xn
xn-1
xn-2
xn-3
xn-4
xn-5
Copyrigh
Initialization of Pointers
ESIEE, Slide 81
Copyrigh
CDP
ESIEE, Slide 82
Coeffcients
b0
b1
b2
AR2
b3
AR3
AR2
AR3
Input data
xn
xn-1
xn-2
xn-3
xn-4
xn-5
Reinitialization of
pointers for next
output sample:
ASUB
ASUB
MOV
#2,AR2
#2,AR3
#a0,CDP
Copyrigh
BKzz
Xeven : BSAxx
b1
b2
ARn/CDP
b3
ESIEE, Slide 83
Copyrigh
Calculated Address
Buffer Length
ESIEE, Slide 84
Xeven[22:16]
+
Xeven[22:16]
BSAxx[15:0]
ARn/CDP
BSAxx + ARn/CDP
BKzz[15:0]
Copyrigh
Xeven
Buffer
Start
Address
XAR0[22:16]
BSA01
Block size
Register
BK03
XAR2[22:16]
BSA01
XAR4[22:16]
BSA01
BK03
XAR6[22:16]
BSA01
XCDP[22:16]
BSAC
BKC
Copyrigh
ST2_55
9 8 7 6 5 4 3 2 1 0
other bits or rsvd
0 = linear mode
(default)
A
R
7
L
C
A
R
6
L
C
A
R
5
L
C
A
R
4
L
C
A
R
3
L
C
A
R
2
L
C
A
R
1
L
C
A
R
0
L
C
1 = circular mode
BSET AR5LC
BCLR AR3LC
ESIEE, Slide 86
C
D
P
L
C
.sect data
.int 7,1,9,6,2
.sect code
__________________
AMOV #x,XAR4
__________________
MOV #x,BSA45
__________________
MOV #5,BK47
__________________
MOV #0,AR4
__________________
BSET AR4LC
MOV
MOV
MOV
MOV
ESIEE, Slide 87
#3,T0
*(AR4+T0),AC0
*+AR4(#4h),AC1
*AR4(T0),AC2
;init data
;init XAR
;init start addr
;init length
;init AR4 to top
;set AR4 to circ
;index
;AC0 =_7__, AR4 =_3__
;AC1 =_9__, AR4 =_2__
;AC2 =_7__, AR4 =_2__
x
7
1
9
6
2
0
1
2
3
4
Results are
cumulative
Copyrigh
s1: AMOV
AMOV
AMOV
MOV
MOV
MOV
BSET
ESIEE, Slide 88
#x,XAR2
#a0,XCDP
#(x+1),XAR3
#a0,BSC
#0,CDP
#4,BKC
CDPLC
Copyrigh
MOV pair(hi(AC0)),dbl(*AR4+)
ESIEE, Slide 89
e1:
ESIEE, Slide 90
AMOV
AMOV
AMOV
AMOV
MOV
MOV
MOV
BSET
#x,XAR2
#a0,XCDP
#(x+1),XAR3
#y,XAR4
#a0,BSAC
#0,CDP
#4,BKC
CDPLC
MOV
MOV
RPT
MAC
::MAC
ASUB
ASUB
MOV
#0,AC0
#0,AC1
#3
*AR2+,*CDP+,AC0
*AR3+,*CDP+,AC1
#2,AR2
#2,AR3
pair(hi(AC0)),dbl(*AR4+)
Copyrigh
ESIEE, Slide 91
AMOV
#x,XAR2
AMOV
#a0,XCDP
AMOV
#(x+1),XAR3
AMOV
#y,XAR4
MOV
#a0,BSAC
MOV
#0,CDP
MOV
#4,BKC
BSET
CDPLC
MOV
#((samps-taps)/2),BRC0
RPTBLOCAL e1
MOV
#0,AC0
MOV
#0,AC1
RPT
#3
MAC
*AR2+,*CDP+,AC0
:: MAC
*AR3+,*CDP+,AC1
ASUB
#2,AR2
ASUB
#2,AR3
e1:
MOV
pair(hi(AC0)),dbl(*AR4+)
ESIEE, Slide 92
Copyrigh
MOV #outer_cnt,BRC0
MOV #inner_cnt,BRC1
RPTBLOCAL outer
. . .
RPTBLOCAL inner
. . .
inner: last_inner
. . .
outer: last outer
ESIEE, Slide 93
Copyrigh
64Kx8
ROM
FF_0000h EPtable{16}
1_0000h
code
4000h
FF_FF00h
vectors
6000h
SARAM0 8Kx8
a{16}
DARAM2 8Kx8
x{200}
DARAM3 8Kx8
SP/SSP
5_0000h
AC0
16Kx8
CE0
ESIEE, Slide 94
Copyrigh
ESIEE, Slide 95
call fir
Copyrigh
Mem
STK
SP
ESIEE, Slide 96
Copyrigh
ESIEE, Slide 97
Data Types
Byte: 8 bits
Word: 16 bits
Long: 32 bits
16 bit: no problem
32 bits use: use the even-align flag:
ESIEE, Slide 98
.usect vars,Nwords,,1
Copyrigh
Solution: Declarations
x0
stklen
a0
y0
BOS
BOSS
.sect "indata"
.copy in7.dat
.def start
.cpl_off
.arms_off
.c54cm_off
.set 100
.usect "coeffs",16,1,1
.usect "results",200,1,1
.usect "STK", stklen,1,1
.usect "SSTK",stklen,1,1
.sect "init"
table
ESIEE, Slide 99
.int
.int
.int
.int
7FCh,
800h,
803h,
7FFh,
7FDh,
801h,
802h,
7FEh,
7FEh,
802h,
801h,
7FDh,
7FFh
803h
800h
7FCh
Copyrigh
Solution: Code
sect "code"
.DP a0
.
start:
here:
FRCT
M40
SXMD
CALL fir
nop
B
here
;copy coeffs
;turn
;turn
;turn
on
on
on
mult. shift
40 bit math
sign exten.
;perform fir
;stop
Copyrigh
AMOV #table,XAR2
;load pointers
AMOV #a0,XAR3
RPT #7
MOV dbl(*AR2+),dbl(*AR3+)
;move from table to a
RET
Copyrigh
end
RPTBlocal end
MPYM *AR2+,*CDP ,AC0 ;AC0 1st product
MPYM *AR3+,*CDP+,AC1 ;AC1 gets 2nd prd
RPT #14
MAC *AR2+,*CDP+,AC0
;form results
:: MAC *AR3+,*CDP+,AC1
MOV pair(hi(AC0)),dbl(*AR4+)
;store AC0/AC1
ASUB #14,AR2
;wrap data pointers
ASUB #14,AR3
;next calculation
RET
Copyrigh
Coeff
s
Coeff
s
b0 b1 b2 b3 b4 b5 b6 b7
Antisymmetrical
b0 b1 b2 b3
b4 b5 b6 b7
These filters may be folded and performed with N adds and N/2 MACs
Filters need to be designed as even length
N
1
2
Copyrigh
Copyrigh
Copyrigh