北邮信息工程信号与信息处理综合实验DSP实验三报告FIR滤波器实现.docx
《北邮信息工程信号与信息处理综合实验DSP实验三报告FIR滤波器实现.docx》由会员分享,可在线阅读,更多相关《北邮信息工程信号与信息处理综合实验DSP实验三报告FIR滤波器实现.docx(12页珍藏版)》请在冰豆网上搜索。
北邮信息工程信号与信息处理综合实验DSP实验三报告FIR滤波器实现
信息与通信工程学院
信号与信息处理综合实验报告
(DSP部分)
班级:
姓名:
学号:
序号:
日期:
实验三FIR滤波器实现
一、实验目的
进一步熟悉CCSv5的开发环境,掌握调试的要素,并理解FIR滤波的过程。
二、程序功能
1、基本功能
本程序的基本要求是:
实现信号的滤波过程,并对工程进行优化,提高运行速度,使用音频输入输出端口进行测试。
2、拓展功能
●如改变滤波器的系数、改变信源数据等;
●如自定义不同带宽的滤波器系数等;
三、程序基本信息
(一)、程序模块描述:
1、通过AIC23输出混频信号:
shortinputTable[TABLE_SIZE]:
存储经采样后的输入信号,其中TABLE_SIZE是输入信号长度(本程序为48)。
voidDSK6416_init():
设置所有的CPLD寄存器到上电状态,初始化内部BSL数据结构。
在使用任何BSL函数之前都必须调用。
DSK6416_AIC23_CodecHandleDSK6416_AIC23_openCodec(intid,DSK6416_AIC23_Config*Config):
打开AIC23编码器,并进行配置。
参数说明:
id:
指定使用哪个编码器,DSK6416上为id=0;
Config:
指向包含编码器寄存器值的结构,该函数将以该结构中的值初始化寄存器。
调用成功:
返回编码器句柄;失败:
返回INV常数(-1)。
当McBSP在使用中,才会出现失败
Int16DSK6416_AIC23_write(DSK6416_AIC23_CodecHandlehCodec,Int32val):
向AIC23中写入要输出的信号值。
参数说明:
hCodec:
编码器句柄;
val:
写入编码器的值。
函数若返回TRUE:
数据成功写入;返回FALSE:
数据端口忙。
DSK6416_AIC23_closeCodec(DSK6416_AIC23_CodecHandlehCodec):
关闭编码器,其中hCodec是要关闭的编码器句柄。
2、混频信号通过FIR进行滤波:
该程序是第一个程序的拓展,增加了以下函数或模块:
shorth[FILTER_SIZE]:
存储FIR滤波器的系数,其中FILTER_SIZE为滤波器阶数加1。
该FIR低通滤波器阶数为64。
shortinput[113]:
存储FIR滤波器的输入信号,是inputTable里存储的信号的拓展,为了消除滤波器边界效应的影响。
intoutput[177]:
FIR滤波器的输出。
输出声音信号时,截取output[64]到output[111]部分。
voidFilter(short*input,short*h,int*output):
FIR低通滤波函数。
参数说明:
input:
输入,h:
滤波器系数,output:
输出。
该FIR低通滤波器通过MATLAB的FDATOOL设计,其系数存储在h数组中,FIR滤波器可用如下方程描述:
3、优化后的FIR滤波器:
该程序仅保留第2个程序中的FIR部分,去掉了原程序中的通过AIC23发声的代码,并对相关模块进行了修改和优化,以下只对修改和优化部分进行说明。
output数组长度被精简,去掉了受边界效应影响的数据。
Filter函数作了如下改动:
a.使用restrict关键字,让编译器知道在input,h和output之间没有相关性,更好的优化程序;
b.声明input和h都是字对齐的,意味着编译器能在存储器访问时用一条指令加载64位数据,减少读取数据的时间。
c.重新设计FIR滤波算法。
由于h[FILTER_SIZE]偶对称,FIR滤波公式可以变换为
这样每个输出一个数据,都节省N次减法运算。
4、功能拓展:
本次实验我做了两个功能拓展:
(1)构造新信号并采样:
该信号从原来信号修改而来,信号形式
,其中
,采样率为48KHz,在MATLAB中输入信号并采样、转化成16bit数组如下:
shortinputTable[TABLE_SIZE]=
{
28987,20687,3982,-4740,2723,18191,25296,15864,-1890,
-11561,-4930,9837,16384,6547,-11454,-21207,-14493,520,
7472,-1807,-19106,-28028,-20366,-4303,3781,-4303,-20366,
-28028,-19106,-1807,7472,520,-14493,-21207,-11454,6547,
16384,9837,-4930,-11561,-1890,15864,25296,18191,2723,
-4740,3982,20687,
};
信号波形图:
(2)设计新的滤波器:
使用MATLAB的FDATOOL可以很方便的设计一个新的滤波器。
以下是采用FDATOOL设计滤波器的截图,里面包含了新滤波器的信息。
设计的新滤波器仍为FIR低通型(曾尝试过设计IIR型,但生成的系数数组较为复杂),采用汉明窗进行设计。
FIR滤波器的阻带边缘频率为2kHz,的阶数由下式确定:
6.2π是汉明窗的精确过度带宽。
0.2π是数字频率过渡带宽,它由过渡带宽(
)转换成数字频率(
)而得。
为设计方便,取N=64。
设计完成后可以利用FDATOOL生成如下的数组:
shorth[65]=
{
23,27,31,35,37,37,32,20,0,
-29,-67,-113,-164,-215,-260,-293,-304,-287,
-234,-140,0,185,414,680,975,1286,1600,
1901,2175,2405,2579,2688,2725,2688,2579,2405,
2175,1901,1600,1286,975,680,414,185,0,
-140,-234,-287,-304,-293,-260,-215,-164,-113,
-67,-29,0,20,32,37,37,35,31,
27,23
};
利用该数组作为FIR的系数即可使用设计的新滤波器。
2、程序流程:
三个程序中,因为原始的发声程序和优化程序都是混频信号通过FIR滤波的一部分,所以以下只给出该程序的流程图。
四、功能测试记录
1、通过AIC23输出混频信号:
略。
2、混频信号通过FIR进行滤波:
输入信号(滤波前信号):
滤波后信号:
由于边界效应的问题,所以输出有失真。
3、优化程序:
未优化之前需要9万多个周期,优化后只需要1258个。
4、功能拓展:
(1)输入信号在CCS中的显示波形:
(2)输入信号通过原FIR滤波器后的输出波形:
(3)输入信号通过新FIR滤波器后的输出波形:
五、调试过程中的主要问题及难点
输入信号通过原FIR滤波器和新FIR滤波器后的输出波形相比较而言,后者失真较大。
这是新FIR滤波器的特性图:
由该图可见,滤波器的旁瓣功率比较大,可能是造成失真大的原因,由于时间所限,未能作进一步优化。
六、实验总结
最后一次DSP实验,做起来并不难,但是包含的内容非常多,不仅实验的主要内容FIR滤波器是数字信号处理课程的重要内容,而且还认识了DSK6416的AIC23发声模块,学习了MATLAB的滤波器设计功能,更重要的是这次实验认识了许多代码优化的内容,让我树立了一种观念,可以用的程序不一定是好的,好的程序一定是又快又好用的。
这三次DSP实验让我学到了很多,实践了很多,确实是受益匪浅。