武汉理工基于fir的高通滤波器DSP综合报告 本文关键词:滤波器,高通,武汉理工,报告,综合
武汉理工基于fir的高通滤波器DSP综合报告 本文简介:摘要DSP技术一般指将DSP处理器用于完成数字信号处理的方法与技术。目前的DSP芯片以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热点技术。主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。其中利用DSP来实现数字滤波器就是很重要的一种应用,本文深入研究
武汉理工基于fir的高通滤波器DSP综合报告 本文内容:
摘
要
DSP
技术一般指将
DSP
处理器用于完成数字信号处理的方法与技术。目前的
DSP
芯片
以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热
点技术。主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。其中
利用
DSP
来实现数字滤波器就是很重要的一种应用,本文深入研究
DSP
芯片的滤波器系统
软件实现方法,用窗口设计法实现
FIR
滤波器,实验结果表明滤波结果效果良好,达到了
预期的性能指标。
一、实验目的一、实验目的
1.
掌握
FIR
数字滤波器的原理。
2
2..
掌握
FIR
数字滤波器的
DSP
实现方法。
二、实验原理二、实验原理
数字滤波器一直以来就是数字信号处理器最广为人知的应用。数字滤波器有别于模拟
滤波器的优点是:1)可重复设计,不需更改任何硬件电路的设计,就可以将一个低通滤
波器重新设计成一个高通滤波器。2)执行阶段可以直接更新滤波器的系数,形成适应性
滤波器。滤波器分成两种形态:有限长度脉冲响应(FIR)滤波器。FIR
指的是单一采样
响应的期间是有限长的,IIR
指的是单一采样响应的期间是无限长的。FIR
滤波器的特性
可以用一个差分方程来描述:
).2()2()
1()
1
()()0()(?????nxhnxhnxhny
其中是滤波器的系数。
.,,210
aaa
常用的滤波器有:低通、高通、带通及带阻滤波器。滤波器特性可以由很多的参数来决定,
这些参数包括带通涟波、带阻涟波、带通截止频率及带阻截止频率。在设计
FIR
滤波器
时,必须根据这些参数来确定
FIR
滤波器的系数及阶数。这个过程可以通过几种方法来完成。一是通过
Matlab
软件来
完成,二是通过专门的数字滤波器设计的软件包来完成。这一过程本实验不详述,本实验
假定该过程已经完成,并得到了滤波器的阶数及系数。
本设计是基于
FIR
算法的
dsp
高通滤波器的设计,采用DSP
芯片。其中采样频率为
64000HZ,高通滤波器的边界频率为
2000HZ,阶数为
101
阶。
三、算法设计
1.采用
MATLAB
设计
FIR
数字滤波器
采用
MATLAB
设计
FIR
数字滤波器的方法有多种,本实验采用
fir1
函数,使用方法简介如下:
设计高通滤波器,格式为:b=fir1(N,Wn,
‘high’)
其中
N+1
为滤波器阶数,b
为返回的长度为
N+1
的系数向量。Wn
为归一化边界频率,0
DARAM
.text:
{}
DARAM
.stack:
{}
DARAM
.sysstack:
{}
DARAM
.cinit:
{}
DARAM2
.pinit:
{}
DARAM2
.bss:
{}
DARAM2
.const:
{}
DARAM2
}
/*firhigh.cmd/
;
fir.asm
该程序用于实现
FIR
滤波器,可被
C
语言程序调用
;
int
fir(int,int,unsigned
int,int)
;
参数
0:
AR0
–
输入信号缓冲区指针
;
参数
1:
AR1
-
FIR
滤波器系数向量指针
;
参数
2:
T0
-
FIR
滤波器的阶数
L
;
参数
3:
T1
-
输入信号当前值在循环缓冲区的序数
;
返回值:
T0
-
输出信号当前值
.global
_fir
.def
_fir
_fir
pshm
ST1_55
;现场
ST1,ST2
和
ST3
入栈
pshm
ST2_55
pshm
ST3_55
or
#0x340,mmap(ST1_55)
;设置
FRCT,SXMD,SATD
bset
SMUL
;置位
SMUL
mov
mmap(AR0),BSA01
;AR0=输入信号循环缓冲区的起始地址
mov
mmap(AR1),BSA23
;AR1=滤波器系数循环缓冲区的起始地址
mov
mmap(T0),BK03
;设置循环缓冲区大小
or
#0x5,mmap(ST2_55)
;AR0
和
AR2
为循环缓冲区指针
mov
T1,AR0
;
AR0
从
index
偏移量开始
mov
#0,AR2
;
AR2
从
0
偏移量开始
sub
#2,T0
;T0=L-2
mov
T0,CSR
;设置外部循环次数为
L-1
mpymAR0+,*AR2+,AC0
;执行第一次运算
||
rpt
CSR
;启动循环
macmAR0+,*AR2+,AC0
mov
hi(AC0),T0
;
用
Q15
格式存放结果
popm
ST3_55
;
恢复
ST1,ST2
和
ST3
popm
ST2_55
popm
ST1_55
ret
.end
/*
main.c/
#include
“math.h“#define
Fs
64000
/*
采样频率/
#define
T
1/Fs
/*
采样时间/
#define
f1
500
/*
正弦信号
1
频率/
#define
f2
2500
/*
正弦信号
2
频率/
#define
f3
3300
/*
正弦信号
3
频率/
#define
PI
3.1415926
#define
w1
(2*PI*f1*T)
/*
正弦信号
1
数字频率=2*pi*f1/Fs/
#define
w2
(2*PI*f2*T)
/*
正弦信号
2
数字频率=2*pi*f2/Fs/
#define
w3
(2*PI*f3*T)
/*
正弦信号
3
数字频率=2*pi*f3/Fs/
#define
a1
0.333
/*
正弦信号
1
幅度/
#define
a2
0.30
/*
正弦信号
2
幅度/
#define
a3
0.30
/*
正弦信号
3
幅度/
extern
int
fir(int,int,unsigned
int,int
);
/*
Low-pass
FIR
filter
coefficients/
int
coeff[101]={
6,3,0,-4,-8,-13,-19,-25,-31,-38,-44,-49,-52,-53,-51,-45,-34,-20,0,24,53,85,120,155,189,221,247,266,274,270,251,216,163,91,0,-110,-238,-381,-538,-705,-879,-1055,-1229,-1397,-1554,-1695,-1817,-1915,-1988,-2033,30713,-2033,-1988,-1915,-1817,-1695,-1554,-1397,-1229,-1055,-879,-705,-538,-381,-238,-110,0,91,163,216,251,270,274,266,247,221,189,155,120,85,53,24,0,-20,-34,-45,-51,-53,-52,-49,-44,-38,-31,-25,-19,-13,-8,-4,0,3,6
};
int
in[101];
/*
input
buffer/
int
out[101];
/*
Output
buffer/
main()
{
unsigned
int
L=101;
unsigned
int
i;
float
signal;
unsigned
int
n=0;
int
index=0;
for(i=0;i2
以后,y[k]能用
y[k-1]和
y[k-2]算出,这是一个递归的差分方程。式中
,2cos2cos(2*/)
s
ATnff???
1B
?
?
sinsin(2*/)
s
CTnff???
fs
为采样频率,f
为正弦波频率。A
为正弦波幅度。可见用数字频率振荡器产生正弦波的实质就
是用程序实现上述的递归差分方程。
如要产生振荡器的频率为
2kHz
正弦波,设采样速率为
40k,通过定时器设置,每隔
25us
中断一
次,即产生一个
y[n]。则递归差分方程系数为:
2cos2cos(2**/)
s
ATff????2cos(2**2000/40000)2*0.95105652???
B=-1
sinsin(2**/)sin(2**2000/40000)0.30901699
s
CTff???????
为了便于定点
DSP
处理,将所有系数除以
2,然后用
16
位定点格式表示为:
A=79bcH,B=C000H,C=13c7H,这便是产生
2kHz
正弦信号的三个系数。
主程序初始化时先计算出
y[1]和
y[2],然后开放定时器中断,以后每次进入定时器中断服务程序
时,利用前面计算出的
y[1]和
y[2]计算出新的
y。
初始化
y[1]和
y[2]
SSBX
FRCT
;置
FRCT=1,准备进行小数乘法运算
ST
#0x79BC,AA
;将常数装入变量
AA
ST
#0xC000H,BB
;将常数装入变量
BB
ST
#0x13C7H,CC;将常数装入变量
CC
PSHD
CC
;将
CC
压入堆栈
POPD
Y2
;
初始化
Y2=CC
LD
AA,T
;
将
AA
装到
T
寄存器
MPY
Y2,A
;Y2
乘以系数
A,结果放入
A
寄存器
STH
A,Y1
;将
A
寄存器的高
16
位存入变量
Y1
;中断服务程序段:
LD
BB,T
;将系数
B
装入
T
寄存器
MPY
Y2,A
;Y2
乘系数
B,结果放入
A
寄存器
LTD
Y1
;将
Y1
装入
T
寄存器,同时复制到
Y2
MAC
AA,A
;完成新正弦数据计算,A
寄存器
;中为
Y1*AA+Y2*BB
STH
A,1,Y1
;将新数据存入
Y1,因所有系数都
;除过
2,在保存结果时转移一位,
;恢复数据正常大小
STH
A,1,Y0
;将新正弦数据存入
Y0
VC5402
的片内定时器利用
CLKOUT
时钟计数,用三个寄存器(TIM、PRD、TCR)来控制定时器。到
定时器实际上可以有
20
个比特的周期寄存器。它对
CLKOUT
信号计数,先将
PSC
减
1,直到
PSC
为
0,然后用
TDDR
重新装入
PSC,同时将
TIM
减
1,直到
TIM
减为
0。这时
CPU
发出
TINT
中断,同时在
TOUT
引脚输出一个脉冲信号,脉冲宽度为
CLKOUT
一致。然后用
PRD
重新装入
TIM,重复下去直到系
统或定时器复位。因而定时器中断的频率由下面的公式决定:
TINT
的频率=,其中
tc表示
CLKOUT
的周期。设置
PRD
寄存器值为
??
??11
1
????PRDTDDRtc
12499,TINT
中断频率为
40kHz。
定时器初始化程序段为:
STM
#10H,TCR
;停止定时器
STM
#2499H,PRD;设置PRD
寄存器值为2499,
;TINT
中断频率为Foutclk
=(2499+1)=
100MHz/2500
=
40
kHz
STM
#20H,TCR
;重新装入TIM
和PSC,然后;
;启动定时器,在开放中断屏蔽寄存器IMR后,就可以产生频率为2000Hz的正弦波。
三、实验内容与步骤三、实验内容与步骤
1.使用
C54x
汇编语言实现数字振荡器,并通过
CCS
提供的显示窗口观察输出信号波形以及频谱。
2.根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明,
3.
启动
CCS,新建工程文件,如文件名为sinewave.pjt。并建立如下文件:
汇编源程序exer3.asm
.title
“for
test
INT
service
program
.(25
us)
“.mmregs
.global
_c_int00,_tint,vector
OFF_INTIMER
.set
04Ch
;
vector
of
INTtimer
at
VECTOR+OFF_INTIMER
INIT_A
.set
079bch
;
A/2=0.9510498
INIT_B
.set
0c000h
;
B/2=-0.5
INIT_C
.set
013c7h
;
C/2=0.1545105
.bss
y0,1
.bss
y1,1
.bss
y2,1
.bss
temp,1
.bss
AA,1
.bss
BB,1
.bss
CC,1
.text
_c_int00:
ld
#0,dp
ssbx
intm
;
disable
all
interrupt
!
st
#1fffh,sp
ld
#vector,a
;
get
vector
table
address
!
and
#0FF80h,a
andm
#007Fh,pmst
or
pmst,a
stlm
a,pmst
;
设置IPTR
stm
#10h,TCR
;
init
TIMER
stm
#2499,PRD
;
f=100M/(2499+1)=40kHz
stm
#20h,TCR
;
reset
TIMER
ldm
IMR,a
;
read
back
IMR
or
#08h,a
;
enable
TIMER
interrupt
stlm
a,IMR
;
set
IMR
ld
#temp,dp
;
set
DP
ssbx
FRCT
;
prepare
for
fraction
mpy
st
#INIT_A,AA
;
init
AA,BB,CC
st
#INIT_B,BB
;
st
#INIT_C,CC
;
pshd
CC
popd
y2
;
init
y2,y2=CC
ld
AA,T
;
T=AA
mpy
y2,a
;
y2*AA
-
a
sth
a,y1
;
y2*AA
-
y1
stm
#0h,TCR
;
enable
TIMER
nop
rsbx
intm
;
enable
all
int
!
again:
nop
b
again
nop
nop
nop
nop
nop
nop
;-------------------------------------------------------------
;
interrupt
for
INT_TIMER
!
;-------------------------------------------------------------
_tint:
ld
#BB,DP
ld
BB,T
;
T=BB
mpy
y2,a
;
a=y2*BB
ltd
y1
;
T=y1,y2=y1
mac
AA,a
;
a=a+y1*AA
sth
a,1,y1
;
new
cos
data
-
y1
sth
a,1,y0
;
new
cos
data
-
y0
nop
;
set
breakpoint
in
CCS
!!!
int1_end:
nop
rete
.end
vec_table.asm文件
.mmregs
.ref
_ret
.ref
_c_int00
.ref
_tint
.global
vector
.sect“.int_table“;--------------------------------------------------------------------
;
interrupte
vector
table
!
;--------------------------------------------------------------------
vector:
rs
b
_c_int00
nop
nop
nmi
b
__ret
nop
nop
sint17
b
__ret
nop
nop
sint18
b
__ret
nop
nop
sint19
b
__ret
nop
nop
sint20
b
__ret
.word
0,0
sint21
b
__ret
.word
0,0
sint22
.word
01000h
.word
0,0,0
sint23
.word
0ff80h
.word
0,0,0
sint24
.word
01000h
.word
0,0,0
sint25
.word
0ff80h
.word
0,0,0
sint26
.word
01000h
.word
0,0,0
sint27
.word
0ff80h
.word
0,0,0
sint28
.word
01000h
.word
0,0,0
sint29
.word
0ff80h
.word
0,0,0
sint30
.word
01000h
.word
0,0,0
int0
b
__ret
nop
nop
int1
b
__ret
nop
nop
int2
b
__ret
nop
nop
tint
b
_tint
nop
nop
brint0
b
__ret
nop
nop
bxint0
b
__ret
nop
nop
trint
b
__ret
nop
nop
dmac1
b
__ret
nop
nop
int3
b
__ret
nop
nop
hpint
b
__ret
nop
nop
q26
.word
0ff80h
.word
0,0,0
q27
.word
01000h
.word
0,0,0
dmac4
b
__ret
nop
nop
dmac5
b
__ret
nop
nop
q30
.word
0ff80h
.word
0,0,0
q31
.word
01000h
.word
0,0,0
;--------------------------------------------------------------------------
;
end
of
interrupte
vector
table
!
;-------------------------------------------------------------------------
__ret
rete
链接定位sinewave.cmd
MEMORY
{
PAGE
1:
INT_D:
ORIGIN=80h,LENGTH=1F80h
PAGE
0:
EXT_P:
ORIGIN=2000h,LENGTH=2000h
}
SECTIONS{
.text
:
EXT_P
PAGE
0
.int_table
:
(EXT_P
ALIGN
(128)
PAGE
(0))
.data
:
INT_D
PAGE
1
}
选择Project
菜单中的Add
File
to
Project
选项,将汇编源程序exer3.asm、vec_table.asm
和连接
定位sinewave.cmd文件依次添加到工程文件中。注意,你可以在添加文件对话框中选择显示不同的文
件类型来加快文件选择速度。你也可以使用鼠标右键单击工程文件名(如sinewave.pjt)并选择Add
Files
项来添加需要的文件。其中,exer3.asm
包括初始化代码和中断服务程序,而vec_talbe.asm
包含中断向量表。
4.
完成编译、连接,正确生成OUT文件。然后使用File
菜单的“Load
Program”选项,将生成的OUT
文件装入DSP
的片内存储器。这时CCS
将显示程序的启始地址_c_int00。
5.
选
View→Graph→Time/Frequency…打开图形显示设置窗口。在弹出的对话框中按图4.1设置,
图图4.14.1
图形属性设置图形属性设置
主要修改“Start
Address”为y0(y0为生成的正弦波输出变量);“Acquisition
Buffer
Size”为1,“DSP
Data
Type”为“16-bit
signed
integer”。
6.
在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。选择Debug→Animate,运行
程序,观察输出波形。数一数一个周期的正弦波有多少个点?算算频率是否是2kHz?另外,想想Run
和Animate
两种运行方式的区别?
7.
用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。将“DisplayType”项改
为“FFT
Magnitude”以便显示信号频谱。修改“Sampling
Rate(Hz)”项为40000,然后退出。注意观
察生成的正弦波频率。
四、实验报告要求四、实验报告要求
1、简述实验目的;
2、简述
DSP
定时器的基本工作原理;
3、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。
五、思考题五、思考题
1.本实验程序产生了一个
2kHz
的正弦信号,请修改程序,产生一个频率相同的余弦信号。为了
验证产生的COS
信号,可以同时生成SIN
和COS
信号,然后在两个图形窗口中显示波形。它们应该正
好相差π/2
相位。
2.
重新设计和实现一个数字振荡器,采样频率改为为
20KHz,输出正弦信号的频率为
4KHz。