一、实验目的

1、复习并巩固数字信号处理中有关知识,如:快速傅里叶变换、重叠保留法以及FIR滤波器设计方法,利用这些知识在MATLAB平台和编程软件CSS中设计满足要求的FIR滤波器,具体要求如下:
1) 设计数字高通滤波器;
2) 采集语音信号,利用重叠保留法进行滤波处理;
3) 播放滤波后的信号;
4) 利用开发板的资源拓展应用。
2、了解并掌握DSP的开发方法,为以后从事生产科研工作打下一定的基础。
3、通过实验增强查阅专业相关知识、搜集整理文献资料、以及应用仿真软件和使用C语言进行编程的能力;
4、培养团队合作能力和实践应用能力。通过共同解决实际问题来提高合作攻关的能力,增强动手实践的能力。

二、实验内容和步骤

2.1基于MATLAB的FIR滤波器设计及功能实现

2.1.1基于filterDesigner的高通滤波器的设计

在MATLAB命令行执行filterDesigner命令,弹出滤波器设计交互窗口,根据需求设计符合既定要求的高通滤波器如下:
image.png
图1 高通滤波器设计
导出方式是到MAT-File:
image.png
选择Coefficient,保存为后缀.mat的文件之后,对于FIR滤波器的代码调用形式为:
HPF=load(‘HPF.mat’);

2.1.2生成语音信号

分别生成频率为150Hz、200Hz、2KHz的语音信号,以8KHz进行采样,并对三路语音信号进行求和
image.png

2.1.3利用重叠保留法进行滤波处理

利用重叠保留法对求和信号进行高通滤波,并画出滤波后信号的波形如下图所示:
image.png

2.1.4 播放语音信号验证效果

依次播放高频信号、合成信号和滤波后的信号,可以比较高频信号与滤波后信号的相似性,验证高通滤波的作用。

2.2用C语言编程DFT重叠保留法并进行FIR滤波器滤波

2.2.1重叠保留法原理

FIR有快速圆周卷积的结构。FIR滤波器的时域差分方程为:

设h(n)的长度为点,x(n)的长度为点,则卷积结果的长度为,若做DFT运算,其DFT点数必须满足L≥,则有:

(皆为L点)

由于H(k)可预先算出结果,存在存储器中,因此有如下快速卷积结构:
image.png
在实际应用中,会遇到一个长度很长的序列与一个短的有限长序列的线性卷积问题,这时直接利用FFT计算会产生两个问题:一是在输入数据没有完全收集到之前,无法作FFT运算,也就是说会有很大的延迟时间;二是直接FFT运算时,当长度很长时,FFT 的优点就表现不出来了。若 采用线性相位FIR滤波器系统,相乘量比直接做线性卷积减少了一半;当和点数差不多时,L越长,圆周卷积好处越明显。
因此需要分段卷积或称分段过滤的方法,即可以将待处理的长信号x(n)加以分段,然后将每段输出以适当的方式组合起来,以得到所需的总输出,有重叠相加和重叠保留这两种方式,这里我们重点介绍重叠保留法:
重叠保留法是针对计算无限长序列线性卷积,要求利用圆周卷积代替线性卷积以方便计算机计算而提出来的,它是指通过保留分段信号前端一定位数的原输入序列来延长信号序列,在卷积完成后再将这些位数的错误序列舍弃再按位相加,以使圆周卷积结果与线性卷积结果相同的快速卷积方法。

2.2.2重叠保留法具体步骤

  1. 已知每一段子序列的长度,单位脉冲响应的长度为,先将分段,每段个点。在第一段子序列的左边补零,补零长度为。
    2. 序列补零之处不补零,而在每一段前边补上前一段保留下来的个输入序列值,组成 点序列,即输入数据分段时有重叠。
    3. 对单位脉冲响应序列进行补零,凑够个点,进行DFT;对每一段子序列也进行DFT。两者的DFT相乘,对乘积求IDFT,得到子序列和单位脉冲响应的循环卷积。
    4. 将每段循环卷积结果的前个点去掉之后衔接起来,就得到整个输入序列和单位脉冲响应线性卷积的结果。

2.2.3设计思路

首先根据设计要求生成一个高通滤波器,然后生成150Hz、200Hz、2KHz的语音信号,以8KHz进行采样,并对三路语音信号进行叠加,使用重叠保留法对信号进行滤波,依次是重叠式分段、逐段卷积、掐头去尾、补零算末尾、存数依次排这几个步骤。 在滤波之后依次播放高频信号,混合信号以及滤波后的信号,比较高频信号与滤波后信号的相似性,验证高通滤波的作用,即完成了测试要求。
接下来使用C语言,在CSS上编写程序,烧写到F28335DSP板子上,调用各种库函数对麦克风等硬件进行初始化。紧接着对收集到的音频信号进行采集,边采集边进行重叠保留滤波,同时输出滤波后语音。
编写程序流程图:
image.png

  1. clear
  2. clc
  3. N=512;%分段的长度,也就是做fft的长度
  4. h=[-0.00491000678664519,-0.0110940581309966,0.00410194747948791,0.0123959008767979,0.0260846944086577,0.0280068857178369,0.0117031929574722,-0.0282213909190478,-0.0862193226866780,-0.148431590883831,-0.196291852743501,0.785720061596288,-0.196291852743501,-0.148431590883831,-0.0862193226866780,-0.0282213909190478,0.0117031929574722,0.0280068857178369,0.0260846944086577,0.0123959008767979,0.00410194747948791,-0.0110940581309966,-0.00491000678664519];%系统冲击响应h(n)
  5. Frequence0 = 150; %单位:Hz
  6. Frequence1 = 200; %单位:Hz
  7. Frequence2 = 2e3; %单位:Hz
  8. SampleFre = 8e3; %单位:Hz
  9. SampleLen = SampleFre; %采样点数
  10. %-------------------产生三路信号
  11. t = 0:1/SampleLen:1/SampleFre*(SampleLen-1);
  12. SignalData0 = sin(2*pi*Frequence0*t);
  13. SignalData0 = SignalData0(1:4096);
  14. SignalData1 = sin(2*pi*Frequence1*t);
  15. SignalData1 = SignalData1(1:4096);
  16. SignalData2 = sin(2*pi*Frequence2*t);
  17. SignalData2 = SignalData2(1:4096);
  18. x = SignalData0+SignalData1+SignalData2;
  19. Lenx=length(x);
  20. M=length(h);
  21. M1=M-1; %重叠部分的长度
  22. L=N-M1; %不重叠部分的长度
  23. h=fft(h,N);
  24. K=floor((Lenx+M1-1)/L)+1; %分的段数
  25. p=(K)*L-Lenx; %最后一段结尾补零数
  26. x1=[zeros(1,M1),x,zeros(1,p)]; %总的大矩阵
  27. Y=zeros(K,N); %保存结果矩阵初始化
  28. for k=0:K-1
  29. xk=fft(x1(k*L+1:k*L+N));
  30. Y(k+1,:)=(ifft(xk.*h));
  31. end
  32. Z=reshape(Y(:,M:N)',1,[]); %将保存结果矩阵转成一个行向量
  33. figure;plot(t(1:350),Z(1:350))
  34. ylim([-1.5, 1.5]);
  35. xlim([-0.001, 0.05]);
  36. title('高通滤波之后的波形')
  37. sound(x,SampleFre);