DSPFIR滤波器设计.docx

上传人:b****7 文档编号:10865642 上传时间:2023-02-23 格式:DOCX 页数:19 大小:23.48KB
下载 相关 举报
DSPFIR滤波器设计.docx_第1页
第1页 / 共19页
DSPFIR滤波器设计.docx_第2页
第2页 / 共19页
DSPFIR滤波器设计.docx_第3页
第3页 / 共19页
DSPFIR滤波器设计.docx_第4页
第4页 / 共19页
DSPFIR滤波器设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

DSPFIR滤波器设计.docx

《DSPFIR滤波器设计.docx》由会员分享,可在线阅读,更多相关《DSPFIR滤波器设计.docx(19页珍藏版)》请在冰豆网上搜索。

DSPFIR滤波器设计.docx

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菜单打开一个图形显示窗口。

在“

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1