实验 5 数字信号处理算法实验(6 学时)
一、实验目的
1 .掌握 FIR 滤波的 DSP 实现方法。
2 .掌握 IIR 滤波的 DSP 实现方法。
3 .掌握 FFT 滤波的 DSP 实现方法。
二. 实验设备
PC 机一台,操作系统为 Windows,安装 VisualDSP++5.1.2 软件, ADSP-21489 EZ-Board 一套。
三. 实验内容
1.FIR 滤波器的 DSP 实现
(1)用 MATLAB 设计一个 FIR 滤波器,将滤波器系数导出;
(2)在 ADSP-21489 EZ-Board 上,打开一个声音直通 DSP 工程(点进点出或块进块出都可 以),参照 VisualDSP++50_21k_rtl_man.rev1.4.pdf 文件中的 fir 函数的例程实现对输入 声音信号滤波。(注:采用 Vector-Valued 的_SIMDSHARC_模式)
2. IIR 滤波器的 DSP 实现
(1)用 MATLAB 设计一个 IIR 滤波器,将滤波器系数导出;
(2)在 ADSP-21489 EZ-Board 上,打开一个声音直通 DSP 工程(点进点出或块进块出都可 以),参照 VisualDSP++50_21k_rtl_man.rev1.4.pdf 文件中的 IIR 函数的例程实现对输入 声音信号滤波。(注:采用 Vector-Valued 的_SIMDSHARC_模式)
3.FFT 的 DSP 实现
在 ADSP-21489 EZ-Board 上,打开一个声音直通 DSP 工程(点进点出或块进块出都可以), 参照 VisualDSP++50_21k_rtl_man.rev1.4.pdf 文件中的 cfft 和 ifft 函数的例程实现对输入 声音信号先进行 FFT,然后再做 IFFT,取 IFFT 的实部输出。
4.在 ADSP-21489 EZ-Board 上用重叠相加法实现 FIR 滤波。
五.实验报告要求
1、整理各个实验内容的步骤、实验结果。
2、分析实验现象。
3、实验体会、注意事项。
实验结果:
1.FIR 滤波器的 DSP 实现
(1)用 MATLAB 设计一个 FIR 滤波器,将滤波器系数导出;
我们使用fdatool进行滤波器系数的设计,使用布莱克曼窗进行滤波器设计,滤波器阶数为101阶,采样率fs为48000,截止频率fc为700。fdatool设计图如下:
并使用以下代码给滤波器系数加逗号,代码如下所示:
1. for i=1:length(Num2)
2. fprintf(fid,'%.20f,\n',Num2(i));
3. end
生成的fir.dat文件:
1. 0.00568750305027048140,
2. 0.00774540094529890120,
3. 0.01337382127122300000,
4. 0.02249088980140157400,
5. 0.03450987404398568600,
6. 0.04839034972138992600,
7. 0.06275905339139202500,
8. 0.07608440510070656200,
9. 0.08687990466444219000,
10. 0.09390659445716430200,
11. 0.09634440710545078000,
12. 0.09390659445716430200,
13. 0.08687990466444219000,
14. 0.07608440510070656200,
15. 0.06275905339139202500,
16. 0.04839034972138992600,
17. 0.03450987404398568600,
18. 0.02249088980140157400,
19. 0.01337382127122300000,
20. 0.00774540094529890120,
21. 0.00568750305027048140,
图5-3 fir.dat文件的数据
(2)在 ADSP-21489 EZ-Board 上,打开一个声音直通 DSP 工程(点进点出或块进块出都可以),参照 VisualDSP++50_21k_rtl_man.rev1.4.pdf 文件中的 fir 函数的例程实现对输入声音信号滤波。(注:采用 Vector-Valued 的_SIMDSHARC_模式)
具体的DSP实现代码如下:
blockProcess_audio.c
①初始化:系数、输入输出数组
1. #include "ADDS_21489_EzKit.h"
2. #include <filter.h>
3. #include <stdio.h>
4. #define TAPS 21
5. #define SAMPLES 256
6. //FIR输入输出、系数设置
7. float input[SAMPLES];
8. float output[SAMPLES];
9. float pm coeffs[TAPS]={
10. #include"fir.dat"
11. };
12. int Firstflag=0;
13. float fir_state1[TAPS+1];
14. float fir_state2[TAPS+1];
1. void process_audioBlocks()
2. {
3.
4. int i;
5. // FIR
6. if(Firstflag==0)
7. {
8. for (i = 0; i < TAPS+1; i++)
9. {
10. fir_state1[i] = 0;
11. fir_state2[i] = 0;
12. }
13. Firstflag=1;
14. }
15.
16. fir (fBlockA.Rx_R1, fBlockA.Tx_R1, coeffs, fir_state1, SAMPLES, TAPS);
17. fir (fBlockA.Rx_L1, fBlockA.Tx_L1, coeffs, fir_state2, SAMPLES, TAPS);
18. }
通过对同一首歌的前10秒,在实时硬件仿真的情况下,通过对memcopy()和fir()函数的注释切换,通过人耳听音对比直通和FIR滤波后的效果,发现声音有明显的区别,为了进一步正确验证,我们将其都进行了录音。
实验效果:
完整的实验代码工程、实验报告如下:
https://download.csdn.net/download/weixin_39589455/18655952