dsp_FIR滤波器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子信息学院
DSP结构原理及应用实验_FIR低通滤波器设计及滤波
组员:
蒋万欣;邓宏恩;谢兴轮
实验报告书写:
蒋万欣:2012141451177
日期:第十四教学周四
地点:基础教学楼B座520实验室
实验五FIR滤波器
一、实验目的:
1,熟悉FIR滤波器‘C54X’实现的编程方法。
2,测试FIR滤波器的单位冲击响应曲线。
3,检查FIR滤波器的频率特性。
二、实验条件
1,已经设计出的线性相位FIR滤波器的参数如下:
滤波器名称:带通滤波器
采样频率:Fs = 10 kHz
通带:1 kHz ——4 kHz
过渡带:1 kHz —— 1.375 kHz,3.625 kHz —— 4 kHz
带类脉动:< 0.5dB
阻带衰减:—60dB以下
滤波器级数:N = 80
滤波器系数:
H(0) = FFDCH H(10) = 00A2H H(20) = 000BH H(30) = FAA3H
H(1) = 001FH H(11) = FF6FH H(21) = FE7FH H(31) = 0347H
H(2) = 0051H H(12) = FFFEH H(22) = FDBFH H(32) = FE3DH
H(3) = FFE9H H(13) = FF70H H(23) = 0192H H(33) = 0747H
H(4) = FFE6H H(14) = FEF4H H(24) = FFB5H H(34) = 09BBH
H(5) = FFBAH H(15) = 00CBH H(25) = 026AH H(35) = FE3DH
H(6) = FFB4H H(16) = 000BH H(26) = 0368H H(36) = 052BH
H(7) = 004BH H(17) = 00E6H H(27) = FDC2H H(37) = DB59H
H(8) = FFF9H H(18) = 0187H H(28) = 00C0H H(38) = DC2AH
H(9) = 0069H H(19) = FEE5H H(29) = FC0AH H(39) = 2D57H
2,生成正弦信号的数据文件的高级语言程序,程序名,sin_flt.exe.用法见附录2.
3,线性相位FIR滤波器源程序Lab5.asm,以及链接命令文件Lab5.cmd,参看教材6.3节。
三、实验内容
1,根据设计好的FIR滤波器参数,修改Lab5.asm:
X_new 由4改成40
X_old 由4改成40
Size 由4改成40
将系数改成本实验中的40个系数
2,创建新工程,并添加文件Lab5.asm、vectors.asm 和lab5.cmd。
3,对工程进行汇编编译,链接产生输出文件并加载程序。
4,测试FIR滤波器的单位冲击响应:
①在file菜单中选择new项,再选择source file 创建一个新文件夹,在右边的编辑窗口编写输入数据文件,编写内容如下:
0x7FFF
0x0
0x0
···
0x0
文件中0 的数目至少79个。
编辑完成后保存为“in.dat”
②从tool菜单中选择port connect命令,进行端口连接
③利用ccs执行LAB5.out文件
④在file菜单中打开out.dat 文件,核对单位冲击响应
⑤检查FIR滤波器频率特性:
⑥画出FIR滤波器的单位冲击响应曲线
四、实验程序:
.title "FIR4.asm"
.mmregs
.def _c_int00
.bss y,1 ;给y分配地址空间
xn .usect "xn",5 ;给xn分配存储单元
a0 .usect "a0",5 ;给a0分配存储单元
PA0 .set 0 ;端口设置
PA1 .set 1
.data
table .word 1*32768/10 ;0.1
.word 2*32768/10 ;0.2
.word 3*32768/10 ;0.3
.word 4*32768/10 ;0.4
.word 5*32768/10 ;0.5
.text
_c_int00: SSBX FRCT ;状态寄存器复位
STM #a0,AR1 ;a0->AR1
RPT #4 ;重复操作4次一共执行5次
MVPD table,*AR1+ ;AR1=0092
STM #xn+4,AR3; ;AR3=0084
STM #a0+4,AR4 ;AR4=008c
STM #5,BK
STM #-1,AR0
LD #xn,DP
PORTR PA1,@xn ;从PA1读入数据xn
STM #1000h,AR6
STM #0200h-1,AR7
FIR: RPTZ A,#4
MAC *AR3+0%,*AR4+0%,A ;AR3与AR4的数相乘后放到累加器A中
STH A,@y ;将累加器高位以为后赋给y
; PORTW @y,PA0 ;从PA0输出数据y
; BD FIR ;判断FIR滤波器是否执行完成(当辅助寄存器AR3 的值从0084变为0080时结束跳转)
PORTR PA1,*AR3+0% ;从PA1读入AR3的值
STH A,*AR6+ ;累加器A高位保存到AR6中
BANZ FIR,*AR7- ;当辅助寄存器AR7不为0时转到FIR继续执行end: B end
.END
说明:PORTW @y,PA0
; BD FIR 和
STH A,*AR6+
BANZ FIR,*AR7-
两句语句实现的功能是一样的,所以避免冲突,直接将前两句注解。
五、实验结果
这个实验没有仿真出结果,是为了接下来的实验做一个准备,实验的目的是连接调试成功。
六、实验体会
1,程序是我们自己写的,由于自己写程序的经历比较少,所以在写程序的过程中出现了很多错误,然后就一直在调试程序。
最后我们自己实在是调试不出来,请助教老师帮忙调试,一直调试到下课,也正是醉了,好在最后还是调试成功了,然而遗憾的是,整个程序忘记了保存,由于不想吐槽实验室的电脑到底有多少病毒,所以之前保存过程序的U盘中病毒了,拿回自己的电脑一插,杀毒软件一来就把U盘杀得干干净净,唉,所以我发现我们做简单实验也这么耗费时间的真正原因,是实验室太落后了······
2,需要定义配置I/0端口的GEL函数:
在hotmenu C5402_Init()中添加
GEL_MapAdd(0x0001,2,0x0001,1,0);
GEL_MapAdd(0x0000,2,0x0001,0,1);
设置I/O接口函数。
实验六FIR滤波器过滤语音信号中的噪音
一、实验目的
利用设计好的FIR低通滤波器将语音信号中的噪音滤除。
将滤除后生成的.DAT文件通过MATLAB生成.WA V文件。
二、实验要求
在语音3500Hz处加了一个单频噪声,将这个单频噪声用ccs软件滤除,并在ccs 中观察带噪和滤除噪声后的语音频谱图。
将滤除后生成的.DAT文件通过MATLAB生成.WA V文件,读出。
三、实验过程
1,用MATLAB设计低通滤波器
滤波器参数如下:
ORDER(阶数) :55
FS = 8000 HZ
FC = 2100 HZ
LOWPASS
设计截图:
设计完成之后保存命名为FIRFILTER,然后在MATLAB命令窗口键入如下命令:
LOAD(‘THE PATH OF FIRFILTER’)
C = ROUND(NUM*32768); %获取滤波器滤波器系数
2,将滤波器系数添加到实验五所示程序中,改变相应参数,进行仿真:
仿真结果如图所示:
3,将CCS生成的OUT.DA T文件用MA TLAB转换成W A V文件,再读出,具体转换代码如下:
%将dat 文件还原成wav文件
fid = fopen('lujing\filename.dat','r');
s = fscanf(fid,'%x');
for i = 1:length(s)
if s(i) >= 32768 %判断s是否是小数
s(i) = s(i) - 65536;%对应音频信号波形幅度等级。
end
end
s = s/32768;%再生成dat文件时数据乘了32768.
audiowrite(s,Fs,16,'path\filename.wav');%Fs采样频率
16比特就是指把波形的振幅划为2^16即65536个等级四、实验源程序来源于实验五
.title "FIR4.asm"
.mmregs
.def _c_int00
.bss y,1
xn .usect "xn",56
a0 .usect "a0",56
PA0 .set 0
PA1 .set 1;蒋万欣
.data
table
.word 30 .word -9 .word -35 .word 19 .word 49 .word -70 .word 76 .word 94 .word -134 .word -115 .word 219 .word 126 .word -338 .word -116 .word 495 .word 70 .word -701 .word 33 .word 974 .word -228 .word -1356 .word 598 .word 1978 .word -1402 .word -3402 .word 4273 .word 15296 .word 15296 .word 4273 .word -3402 .word -1402 .word 1978 .word 598 .word -1356 .word -228 .word 974 .word 33 .word -701 .word -338 .word -116 .word 495 .word 70 .word -701 .word 70 .word 495 .word -116 .word -338 .word 126 .word 219 .word -115 .word -134 .word 94 .word 76 .word -70 .word -39 .word 49 .word 19 .word -35 .word -9 .word 30 .text
_c_int00: SSBX FRCT
STM #a0,AR1
RPT #55
MVPD table,*AR1+
STM #xn+55,AR3
STM #a0+55,AR4
STM #56,BK
STM #-1,AR0
LD #xn,DP
PORTR PA1,@xn
STM #1000h,AR6
STM #0200h-1,AR7
FIR: RPTZ A,#55
MAC *AR3+0%,*AR4+0%,A
STH A,@y
;PORTW @y,PA0
; BD FIR
PORTR PA1,*AR3+0%
STH A,*AR6+
BANZ FIR,*AR7-
end: B end
.end
打开音频信号signalpluszhengxian.dat进行仿真的实验结果如图所示:
六、实验体会
我尝试用MATLAB进行FIR滤波器设计,然后将WA V文件加载之后进行滤波,有两个问题我觉得是很关键的,就是如何打开已经设计好的滤波器,然后如何将语音信号加载到滤波器函数进行滤波,通过查阅资料,我发现这个操作应该是要用到MATLAB中的仿真工具SIMULINK,所以就从简单设计出发设计如下简单程序,
利用fftfilt基于FFT的重叠相加法对数据进行滤波:
得到的结果图如下:
第二问题就是如何将WA V文件在MATLAB中转换成DAT文件。
如图所示,利用AUDIOREAD 和FOPEN 和FWRITE 即可实现转化。
%***wav文件转dat文件****%
clc,clear all;
y = audioread('lujing');
s = round(y*32768);
fid = fopen('lijing.dat','w');
for i = 1 : length(s)
fprintf(fid,'%d\n',s(i));
end
fclose(fid);
作为本学期最后一次DSP实验,还是有不小收获。
首先,我意识到MATLAB 和CCS的这种联合工作确实为这次实验增加了许多亮点,CCS中的程序可以用C语言来进行编写,而MATLAB对C也兼容,MATLAB对数据强大的处理能力能否被CCS利用?换句话说,能不能调用MATLAB的计算引擎来为CCS工作,正如这次的滤波系数的生成,以及又.WA V文件到.DAT文件的转化。
其次,CCS .PJT工程软件的建立和源代码的编写,编写链接运行,其中也包括设置断点单步调试,总结起来,利用CCS完成的整个开发流程已经基本掌握。
窃以为,CCS是一款有些“娇弱”的软件,也可能是因为我们用于实验的版本太低。
我认为在整个开发流程中,最为重要的当然是源码的书写,但是我们很少涉及,然后另外一个很有趣的内容就是调试,当连接不成功,出现各种错误,然后解释这些错误并解决这些错误,是实验中锻炼能力的地方。
能真正理解出错的原因,也是对DSP设计核心内容的理解吧,我觉得。