DSPFIR滤波器设计.docx
《DSPFIR滤波器设计.docx》由会员分享,可在线阅读,更多相关《DSPFIR滤波器设计.docx(19页珍藏版)》请在冰豆网上搜索。
DSPFIR滤波器设计
毕业设计论文
FIR滤波器的设计
1.设计任务及要求
设计任务:
本课程设计要求应用DES5402PP—U实验板实现FIR滤波器,能够在CCS集成开发环境中使用图形显示工具输入和输出波形。
设计要求:
利用DES5402PP评估板的模拟信号输出通道产生一个1kz的方波,然后将产生的方波信号通过模拟信号输入通道输入DES5402PP-U实验板,对方波进行低通滤波,得到一个1kz的正弦信号。
2.设计原理
本设计中我们使用一个38阶的对称结构的FIR低通滤波器,其采样频率Fs为25KHz,通带截止频率1.2KHz,阻带截止频率为2.8KHz,阻带衰减为40DB。
我们可以应用MATLAB中的设计FIR滤波器的指令fir(),也可以应用MATLAB的工具FDATOOL来进行设计,然后将所设计的滤波器的系数导入DSP程序中。
下面对FDATOOL进行简单的介绍:
FDATOOL(TheFilterDesignandAnalysisTool)是一个设计分析滤波器的工具,它具有很好的用户界面。
借助它可以快速的设计数字IIR或FIR滤波器。
你可以设置滤波器的性能指标,也可以直接配置滤波器的系数,还可以从MATLAB工作空间导入滤波器。
在FDATOOL界面下,你可以方便的看到设计的滤波器的幅频特性、相频特性、零极点分布、单位脉冲响应、阶跃响应、滤波器系数、群时延等。
要使用FDATOOL,只要在MATLAB命令窗口中键入,按回车即可。
FDATOOL有两种模式:
设计模式和输入模式。
在设计模式中,你可以从零开始设计,或者对已经设计的滤波器进行改进,或者分析滤波器。
在输入模式中,你可以导入先前已经设计好的滤波器或者已经存在于MATLAB工作空间的滤波器系数,你还可以分析导入的滤波器。
本设计中我们主要使用FDATOOL的设计模式进行FIR滤波器的设计和对所设计的滤波器进行分析,然后可以用file菜单下的export将滤波器的系数导入MATLAB的Workspace和将系数写入DSP汇编程序中。
在写系数到汇编程序中,要注意小数的表示方法。
3.程序代码
.title"fir5402.asm"
.ref_c_int00
.mmregs
;以下部分为程序要用的一系列寄存器的地址设置
gpiocr.set3ch;5402通用I/O控制寄存器
gpiosr.set3dh;5402通用I/O状态寄存器
dxr10.set23h;串口0数据发送寄存器
drr10.set21h;串口0数据接收寄存器
spsa0.set38h;串口0子地址寄存器
spcr10.set39h;多通道串口0寄存器1
spcr20.set39h;多通道串口0寄存器2
xcr10.set39h;串口0发送控制寄存器
pcr0.set39h;串口0引脚控制寄存器
dxr11.set43h;串口1数据发送寄存器
spsa1.set48h;串口1子地址寄存器
spcr11.set49h;多通道串口1寄存器1
spcr21.set49h;多通道串口1寄存器2
xcr11.set49h;串口1发送控制寄存器
pcr1.set49h;串口1引脚控制寄存器
srgr1.set49h;采样率发生寄存器1
srgr2.set49h;采样率发生寄存器2
swcr.set2bh;软件等待状态寄存器
;以下部分为要用变量的定义
timer_count.set060h;定时器计数
mcbsp_init.set061h;mcbsp初始化
wave_ptr.set062h
is_new_data.set063h;新数据到达标志
new_ad.set064h
out_wave_ptr.set065h
t_ar2.set066h
t_ar3.set067h
temp.set068h
wave_buf.set0900h
out_wave_buf.set01000h
N.set38;FIRtaps
fir_coef_buf.set100h;FIRcoefbuffer
fir_data.set200h;FIRwindowsdatabuffer!
.text
;--------------------------------------------------------------------
;interruptvectortable!
;--------------------------------------------------------------------
rsb_c_int00
nop
nop
nmib__ret
nop
nop
sint17b__ret
nop
nop
sint18b__ret
nop
nop
sint19b__ret
nop
nop
sint20b__ret
.word0,0
sint21b__ret
.word0,0
sint22.word01000h
.word0,0,0
sint23.word0ff80h
.word0,0,0
sint24.word01000h
.word0,0,0
sint25.word0ff80h
.word0,0,0
sint26.word01000h
.word0,0,0
sint27.word0ff80h
.word0,0,0
sint28.word01000h
.word0,0,0
sint29.word0ff80h
.word0,0,0
sint30.word01000h
.word0,0,0
int0b__ret
nop
nop
int1b__ret
nop
nop
int2b__ret
nop
nop
tintbtimer;内部定时中断
nop
nop
brint0breceive;缓冲串口接收中断
nop
nop
bxint0btransmit;缓冲串口发送中断
nop
nop
trintb__ret
nop
nop
txintb__ret
nop
nop
int3b__ret
nop
nop
hpintb__ret
nop
nop
q26.word0ff80h
.word0,0,0
q27.word01000h
.word0,0,0
q28.word0ff80h
.word0,0,0
q29.word01000h
.word0,0,0
q30.word0ff80h
.word0,0,0
q31.word01000h
.word0,0,0
;--------------------------------------------------------------------------
;复位中断服务程序
;------------------------------------------------------------------------
_c_int00:
stm#2020h,pmst;vectortablestart:
0x2000,看IPTR中的值
ssbxintm;closeallint!
(ssbxintm)
ssbxsxm;extendsign!
ssbxfrct;factionmultiply
stm#10h,26h;stopTIMER0!
stm#10h,36h;stopTIMER1!
stm#0ffh,sp;sp=0x0ff
ld#0,dp;dp=0
stm#0ffffh,ifr;clearallint!
中断标志寄存器
stm#20h,imr;bit5->BXINT0,bit4->BRINT0,enableBXINT0
;中断屏蔽寄存器
stm#02492h,swwsr;all2waits!
stm#0,swcr
stm#0,58h
wait_pll:
ldm58h,a
and#1,a
bcwait_pll,aneq
stm#97ffh,58h;switchpll*10->100Mclk
rpt#100
nop
;********************************************************************
;初始化RAM,Variable....
;********************************************************************
stm#wave_buf,ar6
stm#1,ar0
rpt#24
mvpdwave_data,*ar6+0;movewavedatatowave_buf->0x0900h
stm#wave_buf,wave_ptr;savewavebuffer'ptr
stm#out_wave_buf,out_wave_ptr;saveoutwavebuffer'ptr,becauseuse
;circularaddress,sowhensaveout_wave
;date,must++!
stm#fir_coef_buf,ar6
rpt#N-1
mvpdfir_coef,*ar6+;movefircoeftofir_coef_buf(indatamem)
stm#fir_coef_buf,t_ar2;
stm#fir_data,t_ar3
stm#0aa55h,mcbsp_init;whenmcbsp_init==0xaa55,transmitforinitac01
stm#5,timer_count;initvariabletimer_count!
stm#0,is_new_data;ifis_new_data==1,hasnewADdatabyslaveac01!
stm#1000h,ar0
stm#1800h,ar5
stm#400h,bk
ld*ar0,t
ld#0,b
stm#0,spsa0;spsa0为串口0的子地址寄存器,chooseSPCR10
stm#2000h,spcr10;receivesign_extendinDRR
stm#1,spsa0;chooseSPCR20
stm#0c0h,spcr20;fs->int!
stm#2,spsa0;chooseRCR10
stm#40h,39h
stm#3,spsa0;chooseRCR20
stm#0,39h
stm#4,spsa0;chooseXCR10
stm#40h,xcr10
stm#5,spsa0;chooseXCR20
stm#0,39h
stm#0eh,spsa0;choosePCR0
stm#0dh,pcr0;fsislowactive,riseedgeofclkx,fallingedge
;ofclkr
stm#7h,spsa0
stm#8000h,39h
rpt#0ffffh
nop
stm#00h,dxr10
ldm22h,a
stm#1,38h
stm#0c1h,39h;startMcBSP0send!
ld#603h,a
rsbxintm;enableallint!
idle1
idle1
idle1
idle1;软件复位两个AC01
ld#600h,a
idle1;waitforint.....
ld#3,a
idle1;send#3
ld#00105h,a;fs=10M/2/A/B=25k
;flp=10M/2/40/A=25k(allpass)
;fhp=fs/200=125Hz(notuse!
)
;A=05,B=40(0x28)
idle1;送05h到AC01的数据寄存器1
ld#3,a
idle1;send#3
ld#00228h,a
idle1;送28h到AC01的数据寄存器2
ld#3,a
idle1;send#3
ld#00300h,a
idle1;送00h到AC01的数据寄存器3
ld#3,a
idle1;send#3
ld#00405h,a
idle1;送05h到AC01的数据寄存器4(AD&DA0dB)
ld#3,a
idle1;send#3
ld#00505h,a
idle1;送05h到AC01的数据寄存器5(highpassfilterdisable)
ld#3,a
idle1;send#3
ld#00600h,a
idle1;送00h到AC01的数据寄存器6
ld#3,a
idle1;send#3
ld#00700h,a
idle1;送0到AC01的数据寄存器7
ld#3,a
idle1;send#3
ld#800h,a
idle1;送0到AC01的数据寄存器8
ld#0h,a
stm#0,38h
stm#2001h,39h;开始MCbsp0接收!
stm#30h,imr;bit5->BXINT0,bit4->BRINT0,使能BXINT0
stm#10h,tcr;stopTIMER!
stm#0ffffh,prd;装载PRD,周期寄存器
stm#0fh,tcr;TIMERstart,eachabout100HZ....
orm#8,imr;enableTIMERINT!
again:
bitfis_new_data,#1;testis_new_data==1?
ccfir,tc;==1,thencallfir!
newADdatainnew_ad(0x64)
bagain
transmit:
pshmst1
pshmst0
pshmbk
pshmar7
pshmah
pshmal
cmpmmcbsp_init,#0aa55h
bcinit,tc
stm#25,bk;eachAC01has25dotstoD/A!
mvdm#wave_ptr,ar7;restorewavebufferptr!
nop
ld*ar7+%,a
nop
stlma,dxr10;sendwavedata!
MasterAC01makesourcewave,
;SlaveAC01makefilterresultwave!
bdwave_make_end
mvmdar7,#wave_ptr;savewavebufferptr!
init:
stlma,dxr10
bitfdxr10,#800h;ifsetuplastregofAC01,setmcbsp_init=0!
bcwave_make_end,ntc;notequal,jump!
stm#0,mcbsp_init;whenmcbsp==0or1,transmitformakewave!
wave_make_end:
popmal
popmah
popmar7
popmbk
popmst0
popmst1
__ret:
rete
receive:
pshmst1
pshmst0
ld#0,dp
mvkddrr10,*ar5;saveADdata
pshd*ar5+%;saveADdatainAD_buffer(0x1800-0x1c00)
popdnew_ad
stm#1,is_new_data;hasnewADdata
popmst0
popmst1
rete
timer:
pshmah
pshmal
ldmtimer_count,a
sub#1,a
bcnot_show_led,aneq;ifa!
=0,jump!
bitfst1,#2000h;testXF?
bcshow_led,tc
ssbxxf;setxf=1
bshow_con
show_led:
rsbxxf;setxf=0
show_con:
ld#5,a;
not_show_led:
stlma,timer_count
popmal
popmah
rete
fir:
pshmst1
pshmst0
pshmbk
pshmar7
pshmah
pshmal
pshmar0
pshmar2
pshmar3
mvdm#t_ar2,ar2;restorear2
mvdm#t_ar3,ar3;restorear3
ldnew_ad,-2,a;newADdata->a,removetwoLSBs
stm#1,ar0
stm#N,bk;setcircularaddressingsize
stla,*ar3+%
rptza,#(N-1);0->a,thenrepeat34times
mac*ar2+0%,*ar3+0%,a;doneFIRfilter,resultinah
mvmdar3,#t_ar3;savear3
mvmdar2,#t_ar2;savear2
stm#1,ar0
stm#100h,bk;eachAC01has25dotstoD/A!
mvdm#out_wave_ptr,ar7;restorewavebufferptr!
stha,-2,temp;saveFIRresultintemp
ldtemp,2,a;shift2bitforAC01D/A!
stla,*ar7+0%;saveFIRresulttowavebuffer!
stla,temp
mvmdar7,#out_wave_ptr;savewavebufferptr!
stm#0,is_new_data;newADdatahasbeenprocessed!
ld#0,dp
cmpmout_wave_ptr,1000h
bccon_fir,ntc
ccs_show:
;此处加断点,查看结果
nop;ifout_wave_ptr==0xc00,
nop;mayshowout_waveinCCS!
!
!
show128dots!
;inputbuffer->0x1800
;outputbuffer->0x1000(showfrom0x1020)
con_fir:
popmar3
popmar2
popmar0
popmal
popmah
popmar7
popmbk
popmst0
popmst1
ret
wave_data:
;freqabout1kHz
.word03ffch;+2volt
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word03ffch
.word0c000h;-2volt
.word0c000h
.word0c000h
.word0c000h
.word0c000h
.word0c000h
.word0c000h
.word0c000h
.word0c000h
.word0c000h
.word0c000h
.word0c000h
fir_coef:
.wo-50
.word101
.word150
.word203
.word216
.word153
.word-3
.word-239
.word-508
.word-729
.word-802
.word-634
.word-163
.word615
.word1638
.word2777
.word3861
.word4711
.word5178
.word5178
.word4711
.word3861
.word2777
.word1638
.word615
.word-163
.word-634
.word-802
.word-729
.word-508
.word-239
.word-3
.word153
.word216
.word203
.word150
.word101
.word-50
.end
4.调试步骤:
1短接JP9,使得DES5402PP的信号输出通道和输入通道相连。
2启动CCS,新建一个工程fir5402.pjt。
3在工程中添加文件fir5402.asm和文件*.cmd,在标号ccs_show处添加断点,编译连接,然后将OUT文件装入,按Animate按扭运行程序。
这时会看到断点处黄色箭头一直闪烁,状态栏有go字一直闪烁。
4选择View->graph->Time/Frequency菜单打开一个图形显示窗口。
在“