实验四滤波、频谱分析综合编程实验实验目的:通过在ADSP-21161评估板(ADSP-21161NEZ-KIT)上设计实现一个可完成信号滤波和频谱分析的小系统,掌握DSP系统设计与开发方法。实验内容:A.实验环境的准备1.实验的硬件资源a)PC机一台(安装有VisualDSP++集成开发与调试环境、音频播放器、音乐文件);b)ADSP-21161N-EZ-KIT一套;c)音频连接电缆一根;d)耳麦一副。2.实验设备连接方式a)将ADSP-21161N-EZ-KIT通过USB接口连接到PC机上;b)用音频连接电缆将PC的音频输出插座和ADSP-21161N-EZ-KIT的音频输出插座连接在一起;c)将耳麦的耳机插头连接到ADSP-21161N-EZ-KIT的音频输出插座上。B.实验内容本实验以工程实例“d:\ADSP-21161EZ-KITLite\Talkthru\”为基础,在工程文件中添加滤波器功能和频谱分析功能。其中,数字滤波器的设计可参考工程实例“d:\ADSP-21161EZ-KITLite\SIMD_FIRs\”中的例子程序;频谱分析采用DFT方法,有关设计可参考工程实例“d:\ADSP-21161EZ-KITLite\DFT\”中的例子程序。滤波器子程序和频谱分析子程序既可添加到中断服务子程序中,也可放在主程序中。滤波器有三种类型:低通、高通和带通,每种类型滤波器的截止频率有两档,因此,总的滤波器类型的选择共有6种。滤波器类型的选择通过“IRQ2”按钮开关来实现,通过6个指示灯(LED2~LED7)来指示,每按一次“IRQ2”按钮,滤波器类型切换到下一种类型,并点亮对应的指示灯。另外,通过“IRQ1”按钮开关来切换选择是直通方式,还是滤波方式。通过播放音乐信号和语音信号来体会各种类型滤波器的滤波效果。播放标准音(包括各种正弦波信号和线性调频信号),绘出直通和滤波后的信号的频谱图。实验步骤:1.滤波器切换功能的调试原有程序中,已经有了四种滤波器的的相互切换的程序段。在实验前,先用MATLAB生成相应的两个带通滤波器的系数,在原程序中,滤波器的阶数设置为130,但是在本实验中,如果加入两个130阶的带通滤波器,则在程序编译中会出现错误,会有错误提示”outmemory”,我分析为可能是超出了存储范围,由于在源程序中已有65阶的滤波器系数,因此我统一将滤波器的阶数改为65阶,然后再编译则正常,又因为人耳的听力范围为20-20kHz,人所能发出的语音信号的范围为30-4kHz,因此在本实验中,我将两个带通滤波器的中心频率分别设置在500Hz和1.2kHz。以便能取得好的滤波效果。在修改完滤波器的切换以后,我先进行了程序的测试,发现运行正常,滤波效果也很好,然后我继续加入一个中断来控制滤波和全通的选择。其中在滤波器切换的程序调试中,我只需要在change_filter_coeffs段中加入以下一段程序并且将R11的值由4改为6就可以:2.全通与滤波功能的选择在原始程序中,控制滤波选择的程序段如下所示:do_audio_processing:ifflag3_injumpskip_to_no_processing;call(pc,fir);jumpplayback_AD1836_left_DACs;通过对这段程序的分析,我不难看出,它是通过检测FLAG3按钮是否按下来选择是否进行滤波,但是我在这里要通过一个中断来控制是否选择滤波,因此我需要定义一个变量filter_or_not=0;在程序运行过程中该变量有两个值可以选择,分别以0和1来控制是否滤波,当变量的值为0时,则不滤波,当变量的值为1时,则进行滤波。相应的程序段如下所示:do_audio_processing:r0=dm(filter_or_not);r1=0;comp(r0,r1);ifeqjumpskip_to_no_processing;call(pc,fir);jumpplayback_AD1836_left_DACs;通过我对上述程序的分析,我可以看出,先将filter_or_not的值赋予r0,然后和0比较,若相等则不滤波,若不相等,则进入滤波。接下来我还需要在写一段中断调用子程序来修改filter_or_not的值,以便通过该中断来控制滤波与否的选择。其程序段如下所示:在这里我需要将change_filter_model设置为全局中断子程序,然后还有在中断向量表中进行声明。通过以上中断子程序,我就可以通过中断来改变filter_or_not的值从而选择滤波还是全通。在原程序中,中断向量表中的IRQ0~2都是控制滤波器的切换,根据实验的要求,IRQ2还是控制滤波器的切换,但是此时我需要将IRQ1设置为控制滤波还是直通,其相应的修改以下程序段所示:此时我可以通过中断来控制滤波和全通的选择,并且在滤波的阶段,我还可以通过中断来控制滤波方式的选择。完成以上两个功能后,我再进行程序的测试,通过程序的测试,我很好地实现了滤波和直通之间的切换,以及滤波器类型的选择。完成以上两个功能后,我继续完成最后一个任务,也就是对信号进行DFT分析。3.DFT功能的实现根据实验的要求,我要通过中断IRQ0来控制DFT的进行。由于已经给出了DFT实现的一个工程,我就将DFT的程序加入到SIMD_FIR_demo.asm子程序中,然后要对程序进行一些修改,由于在本试验中,DFT是作为一个中断服务子程序出现的,因此一开始我要加入如下程序段:来进行中断子程序的设置,并且将原先DFT工程中的main改成main_dft。由于信号的输入数据时存储在dline中,因此我还要做如下修改也就是将输入设置为dline,此时还要将main_dft设置成全局的,并且在中断向量表中声明,然后加入到中断IRQ0中:由于在实验二已经仿真过DFT,将该DFT工程中的求模的运算实现的程序加入到该工程中,如下所示,再对程序做进一步的调试,然后我对程序进行测试。通过对程序的测试,我先通过中断IRO1将系统切换到滤波模式,然后通过IRQ0进行DFT分析,通过对程序的测试,我发现通过中断可以很好地控制滤波和DFT的分析,有较好的效果。然后我还有进一步声明变量output来存储滤波后的数据,然后再声明变量存储滤波后数据的DFT,其具体如下;然后我可以重复上面输入数据的DFT过程,在此过程中,DFT的程序基本不需要做太大修改,我只需要将相应的变量地址换成输出数据的即可。然后我再进行程序的调试,可以得到较好的结果。在本实验中,我对一个测试语音信号,也就是一个单频的正弦信号进行分析,观察它的输入数据的时域波形和DFT以后的频谱。如下图所示:图1输入数据及其DFT变换的模值由于实验过程中采用的是单频信号,因此若该信号频率在滤波器的阻带以内,则该信号基本全部被滤去,波形幅度大幅度衰减,频谱的模也大幅度衰减,剩下的只有噪声部分。若在通带内,则不会有明显的变化。实验结果:在本次实验中,实现了语音信号的采集,然后通过中断来控制是否对该信号进行滤波以及进行怎样的滤波,并且通过LED灯可以观察到显示进行什么类型的滤波。然后再通过中断进行DFT分析。实验体会:通过本次实验,对DSP板的操作有了更深入的了解,学会了在程序中添加中断子程序,以及对中断子程序的调用,掌握了通过中断来改变变量,从而来进行不同的中断子程序的调用。对于FIR滤波器的设计有了更深入的了解,学会了通过变量来存储采样数据,然后对这些采样数据进行处理分析。同时更加清楚怎样进行寄存器的设置,并且通过观察变量存储值的变化来分析程序运行的是否正确,对程序的改进有很大的帮助。对画图功能和寄存器、存储器的查看分析更加熟悉,掌握了在程序运行过程中各个变量的值的变化。通过对该程序的分析和调试,在不断的尝试中,学会了在实际操作中如何对程序进行调试,如何逐步实现各个功能,这些都为能够实现一个完整的系统设计有着巨大的帮助。