DSP与matlab联合设计FIR滤波器.docx
《DSP与matlab联合设计FIR滤波器.docx》由会员分享,可在线阅读,更多相关《DSP与matlab联合设计FIR滤波器.docx(15页珍藏版)》请在冰豆网上搜索。
DSP与matlab联合设计FIR滤波器
设计FIR滤波器作业报告
学号:
姓名:
设计FIR滤波器作业报告
本设计主要内容是利用MATLAB验证设计思路并用CCS3.3仿真环境设计一个FIR滤波器,要求滤除给定的叠加正弦波的两个较高频分量。
给定波形函数为:
y=sin(2*pi*100*t)+sin(2*pi*250*t)+sin(2*pi*270*t)。
1.设计思路:
输入信号是频率为100Hz、250HZ、270Hz的合成正弦等幅信号,由于给定的谐波分量最高为270Hz,根据奈奎斯特准则,采样频率应大于最高频率分量的2倍,即大于2*270,故可以以600Hz的采样频率进行采样,即fs=600Hz。
设计了一个截止频率为200Hz的低通滤波器,目的是通过所设计的低通bartlett滤波器将信号源中频率为200Hz以上的信号滤掉,留下频率为100Hz的信号,达到滤波的效果。
利用MATLAB设计合适的滤波器实现滤波,然后得到其滤波器系数在CCS的simulator方式下编写滤波程序,调用波形数据,实现滤波,并观看滤波前后的信号波形图、频谱图,观察滤波达到预期效果。
2.设计过程
1)在MATLAB中进行算法验证
MATLAB语言由于具有数值计算功能、符号计算功能、数据可视化功能、建模仿真可视化功能,使得MATLAB在命题构思、模型建立、仿真研究、假想验证、数据源可视化各环节起着强大的作用。
因此在设计中必须先在MATLAB语言中设计一个FIR滤波器。
本设计采用的是bartlett窗函数。
下面是在MATLAB中设计的27阶FIR型bartlett滤波器程序:
clearall;%请寄存器
clf;%清屏
N=256;%清数据点
fs=600;%采样频率
dt=1/fs;%采样时间间隔
fort=1:
N
f1=250;
f2=100;
f3=270;
y(t)=(sin(2*pi*f1*t*dt)+sin(2*pi*f2*t*dt)+sin(2*pi*f3*t*dt));%产生合成信号
x(t)=round(10000*y(t));%为DSP汇编程序做数据转换
end
figure
(1)
plot(y),title('滤波前的波形图像');
fp=200
fst=250
NL=26
f1=200;
w1=2*pi*f1/fs
window=bartlett(NL+1)%窗函数
n=1:
NL+1
hd=sin(w1*(n-NL/2))./(pi*(n-NL/2));
hd(NL/2)=0.67;
h=hd.*rot90(window)
h1=h*32768;
h2=fft(h,N);%将信号做FFT变换
pyy=h2.*conj(h2);%做功率谱分析
f=(0:
(N/2-1));
fori=1:
N/2-1
f(i)=f(i)*fs/N;
end
figure
(2)
plot(f,pyy(1:
N/2)),title('滤波器的频谱图像');
yy1=filter(h,1,y);%滤波
figure(3)
plot(yy1),title('滤波后的波形图像');
y=fft(y,N);
pyy=y.*conj(y);
f=(0:
(N/2-1));
fori=1:
N/2-1
f(i)=f(i)*fs/N;
end
figure(4)
subplot(1,2,1),plot(f,pyy(1:
N/2)),title('滤波前的波形频谱图像');
y=fft(yy1,N);
pyy=y.*conj(y);
f=(0:
(N/2-1));
fori=1:
N/2-1
f(i)=f(i)*fs/N;
end
subplot(1,2,2),plot(f,pyy(1:
N/2)),title('滤波后的波形频谱图像')
其中采样点为256个,采样频率为600Hz,输入信号为100Hz、250Hz、270Hz的合成信号,设定的截止频率为200Hz,通过FIR滤波器后,期望保留的信号是100Hz的信号,200Hz以上的频率基本被滤掉。
图1是滤波前的图形,图2是滤波后的图形,图3为滤波器频谱图像,图4滤波前后的波形频谱图像。
从这四个图中可以看住原始信号中的频率有100Hz、250Hz、270Hz,经过滤波后200Hz以上的信号成分基本上被滤掉。
只留下100Hz的信号。
图1滤波前波形图像
图2滤波后波形图像
图3滤波器的频谱图像
图4.滤波前后的波形频谱图像
2)在CCS环境的仿真
首先配置处理器项,进入CCStudiov3.3中,编写程序,程序如下:
.mmregs
.reffilter_start
.def_c_int00
K_DATA_SIZE.set256
K_BUFFER_SIZE.set32
K_STACK_SIZE.set256
K_B.set27
K_CIR.setK_BUFFER_SIZE
STACK.usect"stack",K_STACK_SIZE
SYSTEM_STACK.setK_STACK_SIZE+STACK
DATA_DP.usect"filter_vars",0
filterdata.usect"filter_vars",K_DATA_SIZE
bufferdatay.usect"filter_vars",K_BUFFER_SIZE*2
bufferdatax.usect"filter_vars",K_BUFFER_SIZE*2
.data
.globalinputdata
inputdata
.WORD16750,-5878,18090,-26831,6340,-9511,11750,11443
.WORD-6910,0,-16750,5878,5570,9511,0,-7810
.WORD-11750,5878,570,17321,-6910,-5878,-5570,-9511
.WORD23660,-9511,18090,-23198,-570,0,570,23198,-18090
.WORD9511,-23660,9511,5570,5878,6910,-17321,-570
.WORD-5878,11750,7810,0,-9511,-5570,-5878,16750
.WORD0,6910,-11443,-11750,9511,-6340,26831,-18090
.WORD5878,-16750,0,16750,-5878,18090,-26831,6340
.WORD-9511,11750,11443,-6910,0,-16750,5878,5570
.WORD9511,0,-7810,-11750,5878,570,17321,-6910
.WORD-5878,-5570,-9511,23660,-9511,18090,-23198,-570
.WORD0,570,23198,-18090,9511,-23660,9511,5570
.WORD5878,6910,-17321,-570,-5878,11750,7810,0
.WORD-9511,-5570,-5878,16750,0,6910,-11443,-11750
.WORD9511,-6340,26831,-18090,5878,-16750,0,16750
.WORD-5878,18090,-26831,6340,-9511,11750,11443,-6910
.WORD0,-16750,5878,5570,9511,0,-7810,-11750
.WORD5878,570,17321,-6910,-5878,-5570,-9511,23660
.WORD-9511,18090,-23198,-570,0,570,23198,-18090
.WORD9511,-23660,9511,5570,5878,6910,-17321,-570
.WORD-5878,11750,7810,0,-9511,-5570,-5878,16750
.WORD0,6910,-11443,-11750,9511,-6340,26831,-18090
.WORD5878,-16750,0,16750,-5878,18090,-26831,6340
.WORD-9511,11750,11443,-6910,0,-16750,5878,5570
.WORD9511,0,-7810,-11750,5878,570,17321,-6910
.WORD-5878,-5570,-9511,23660,-9511,18090,-23198,-570
.WORD0,570,23198,-18090,9511,-23660,9511,5570
.WORD5878,6910,-17321,-570,-5878,11750,7810,0
.WORD-9511,-5570,-5878,16750,0,6910,-11443,-11750
.WORD9511,-6340,26831,-18090,5878,-16750,0,16750
.WORD-5878,18090,-26831,6340,-9511,11750,11443,-6910
.WORD0,-16750,5878,5570,9511,0,-7810
.text
_c_int00:
.asgAR2,ORIGIN
.asgAR3,INPUT
.asgAR4,FILTER
.asgAR5,OUTPUT
START:
SSBXFRCT
SSBXINTM
LD#DATA_DP,DP
STM#STACK,SP
CALLfilter_start
NOP
NOP
NOP
LOOP
BLOOP
.defh0,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h15,h16,h17,h18,h19,h20,h21,h22,h23,h24,h25,h26
.deffilter_start
h0.set0000H
h1.set-003FH
h2.set008AH
h3.set0000H
h4.set-015BH
h5.set01F0H
h6.set0000H
h7.set-03CDH
h8.set056EH
h9.set0000H
h10.set-0D92H
h11.set1DDBH
h12.set4F2AH
h13.set2349H
h14.set-1049H
h15.set0000H
h16.set06C9H
h17.set-04E3H
h18.set0000H
h19.set02B7H
h20.set-0209H
h21.set0000H
h22.set0116H
h23.set-00BEH
h24.set0000H
h25.set0035H
h26.set0000H
.text
filter_start:
STM#K_CIR,BK
STM#1,AR0;设置循环缓冲区的大小和步长
STM#inputdata,ORIGIN
STM#bufferdatax,INPUT
;STM#bufferdatay,FILTER
STM#filterdata,OUTPUT
STM#K_DATA_SIZE-1,BRC;设置快循环计数器
RPTBfilter_end-1
MVDD*ORIGIN+,*INPUT
RPT#K_B-1-1
MAR*INPUT-0%
MPY*INPUT+0%,#h26,B
LDB,A
MPY*INPUT+0%,#h25,B
ADDB,A
MPY*INPUT+0%,#h24,B
ADDB,A
MPY*INPUT+0%,#h23,B
ADDB,A
MPY*INPUT+0%,#h22,B
ADDB,A
MPY*INPUT+0%,#h21,B
ADDB,A
MPY*INPUT+0%,#h20,B
ADDB,A
MPY*INPUT+0%,#h19,B
ADDB,A
MPY*INPUT+0%,#h18,B
ADDB,A
MPY*INPUT+0%,#h17,B
ADDB,A
MPY*INPUT+0%,#h16,B
ADDB,A
MPY*INPUT+0%,#h15,B
ADDB,A
MPY*INPUT+0%,#h14,B
ADDB,A
MPY*INPUT+0%,#h13,B
ADDB,A
MPY*INPUT+0%,#h12,B
ADDB,A
MPY*INPUT+0%,#h11,B
ADDB,A
MPY*INPUT+0%,#h10,B
ADDB,A
MPY*INPUT+0%,#h9,B
ADDB,A
MPY*INPUT+0%,#h8,B
ADDB,A
MPY*INPUT+0%,#h7,B
ADDB,A
MPY*INPUT+0%,#h6,B
ADDB,A
MPY*INPUT+0%,#h5,B
ADDB,A
MPY*INPUT+0%,#h4,B
ADDB,A
MPY*INPUT+0%,#h3,B
ADDB,A
MPY*INPUT+0%,#h2,B
ADDB,A
MPY*INPUT+0%,#h1,B
ADDB,A
MPY*INPUT+0%,#h0,B
ADDB,A
;STHA,*FILTER-0%
STHA,*OUTPUT+
;MAR*FILTER-0%
filter_end:
NOP
RET
.end
配置文件:
MEMORY{
PAGE0:
PARAM:
org=3000hlen=4000h
PAGE1:
DARAM:
org=100hlen=4000h
}
SECTIONS{
.text:
>PARAMPAGE0
STACK:
>DARAMPAGE1
filter_vars:
>DARAMPAGE1
.bss:
>DARAMPAGE1
.data:
>DARAMPAGE1
}
仿真结果如下:
图5、6为滤波前的信号时域图和频谱图像,图7、8为滤波后的信号时域图和频谱图像。
图5滤波前的信号时域波形图像
图6滤波前的信号功率谱图
图7滤波后的信号时域波形图像
图8滤波后的信号功率谱图