《数字信号处理》Matlab 实验
一.实现重叠相加和重叠保留算法,完成线性卷积的分段计算(可任意指定()x n 及()h n );
1、 对算法的概括性说明;
1)重叠相加法
重叠相加法是将待过滤的信号分割成长为N 的若干段,每一段都可以和有限时宽单位取
样响应作卷积,再将过滤后的各段重叠相加。
具体算法实现:建立缓存序列,每次输
入N 点序列,通过计算x(n)和h(n) 的循环卷积实现线性卷积运算,将缓存的M-1点序
列和卷积结果相加,并输出前N 点作为计算结果,同时缓存后M-1点,如此循环,直至
所有分段计算完毕,则输出序列y(n)为最终计算结果。
2)重叠保留法
重叠保留法相当于将x l (n )和h(n )作循环卷积,然后找出循环卷积中相当于线性卷积的部
分。
在这种情况下,将序列y(n)分为长为N 的若干段,每个输入段和前一段有M-1个重
叠点 。
此时只需要将发生重叠的前M-1个点舍去,保留重叠的部分并输出,则可获得序
列y(n)。
2、源代码及流程图;
2.1 源代码:
function[y] = overlap_add(x,h,N)
M = length(h);
if N<M
N = M+1;
end
L = M+N-1;
Lx = length(x);
T = ceil(Lx/N);
t = zeros(1,M-1);
x = [x,zeros(1,(T+1)*N-Lx)];
y = zeros(1,(T+1)*N);
for i = 0:1:T
xi = i*N+1;
x_seg = x(xi:xi+N-1);
y_seg = circular_conv(x_seg,h,L);
y_seg(1:M-1) = y_seg(1:M-1)+t(1:M-1); t(1:M-1) = y_seg(N+1:L);
y(xi:xi+N-1) = y_seg(1:N);
end
y = y(1:Lx+M-1);
end
function[y] = overlap_save(x,h,N)
Lx = length(x);
M = length(h);
if N<M
N = M+1;
end
L = N+M-1;
t = zeros(1,M-1);
T = ceil(Lx/N);
x = [x,zeros(1,(T+1)*N-Lx)];
y = zeros(1,(T+1)*N);
for i = 0:1:T
xi = i*N+1;
x_seg= [t,x(xi:xi+N-1)];
t = x_seg(N+1:N+M-1);
y_seg = circular_conv(x_seg,h,L); y(xi:xi+N-1) = y_seg(M:N+M-1); end
y = y(1:Lx+M-1);
end
function[y] = circular_conv(x1,x2,L) X1k = fft(x1,L);
X2k = fft(x2,L);
Yk = X1k.*X2k;
y = ifft(Yk);
end
n = 0:9;
xn = n+1;
hn = [1,0,-1];
N = 6;
y1 = conv(hn,xn)
y2 = overlap_add(xn,hn,N)
y3 = overlap_save(xn,hn,N)
2.2流程图
1)重叠相加法
2)重叠保留法
3、实验结果;
4、结合教材3.5.1节作运算量分析;
重叠相加法和重叠保留法的算法的时间复杂度均为O(n),空间复杂度均为O(1),二者都具有较好的时间和空间复杂度。
5、总结实验过程中出现的问题以及解决问题的具体措施。
①运算完整性问题
在写好代码之后的测试中,出现了一个十分奇怪的现象,即:当输入点数为1000、10000
或者更大时卷积运算最后M-1个结果为0.反复测试发现,不仅1000和10000,只要是分
段数N 的倍数的输入点数都存在同样问题,而其他非倍数的输入,运算与conv() 函数运
算结果完全一致。
通过设置断点,逐句调试,最终发现问题的症结,当输入序列为N 的
倍数时,最后的一段卷积实际上没有做。
因而将循环次数增加1,将最后一次保留的M-1
个点补全N 个0,做最后一次分段卷积。
修改后,测试结果正确。
②算法硬件实现
第一, 重叠保留和重叠相加算法在硬件实现时将算法中的临时变量都化为缓存,所以考
虑缓存的大小限制,不能将输入序列分段过长,否则所需的缓存将加大,成本加
大。
第二, 接收延时和处理延时两者存在矛盾,减少分段长度,可减少接收延时但会增加处
理延时,同理,增大分段长度,可减少处理延时,但将增加接收延时。
具体实现
时需要综合考虑两者的作用,去最优化值。
二.周期序列的谱分析
利用DFT 分析模拟信号()()cos 16a x t t π=之频谱;试验要求:
1、 设定采样周期T 并说明原因;
取T= 1/20,理由:f = 8,fs≥2f,所以取T = 1/20。
2、 若令()cos(16)x n nT π=,确定该序列之周期N 并说明原因;
N= 5。
2π/(16πT )=5/4,周期为整数,所以N= 5。
3、 绘制10个周期内()x n 的取值情况;
4、 令1()x n 表示()x n 的主值序列,绘制1(())DFT x n ,解释取值情况;
所得X1(k)取值即为x(n)的5点(一个周期内)DFT 结果,为清晰谱线。
5、 令1()x n 表示()x n 的任一周期,绘制1(())DFT x n ,解释取值情况;
所得X2(k)取值与x(n)主值序列DFT 结果相同。
因为DFT 是反映信号的频域特性,所以同
为一个周期,频域特性一定相同,无论起始位置如何,其DFT 情况都相同。
6、 令1()x n 表示()x n 的2个周期,绘制1(())DFT x n ,解释取值情况(参照习题3.
7、3.8
或3.16分析);
所得X3(k)是在x(n)主值序列DFT 结果的基础上插入取值为零的点,将点数提高至10,仍
为清晰谱线。
因为选取了2个周期,所以DFT 点数是X1(k)的2倍。
因为取的周期的整数
倍,所以可以得到清晰谱线。
7、 (选作)若1()()()M x n x n R n =⨯,而M 不是()x n 周期的整数倍,绘制1(())DFT x n ,解
释取值情况。
所得X4(k)是非周期整数倍点数的DFT ,不是清晰谱线。
因为选取了1.3个周期,不是周
期的整数倍,选取的x4(n)没有体现出x(n)的周期特性,所以得到的谱线的形状特征必然
与X1(k)、X2(k)、X3(k)不同。
三.梳状滤波器的应用
录制一段自己的话音,时间长度及取样频率自定;对该段声音加入一次反射、三次反射和无穷多次反射。
试验报告要求:
1、 对试验原理的说明;
回声可以认为是由原始声音衰减后的多个延迟叠加组成的,因此回声可以用延迟单元来生
成。
x(n)表示原始声音信号,a 为衰减系数,T 为延迟周期,回声信号
Y(n)=X(n)+a*x(n ‐T )+a^2*x(n ‐2T)+……+a^k*x(n ‐kT)。
Z 变换后的系统函数 H(z)可由
梳状滤波器实现。
本实验用MATLAB 中的filter(b,a,x)函数可用来仿真差分方程 a(1)*y(n)=b(1)*x(n)+b(2)*x(n ‐1)+...+b(nb+1)*x(n ‐nb)‐a(2)*y(n ‐1)‐...‐a(na+1)*y(n ‐
na)。
2、 在同一张图上,绘制原声音序列()x n 、加入一次反射后的声音序列1()x n 、加入三次反射
后的声音序列3()x n 和加入无穷多次反射后的声音序列()I x n ;
其中蓝色为原声音序列x(n),粉红色为加入一次反射后的声音序列x1(n),绿色为加入三次反射后的声音序列x3(n),红色为加入无穷多次反射后的声音序列x1(n)。
3、结合上述各序列,分析延时、衰减系数对回声效果的影响(提示:定量考察序列()
x n、
1()
x n、
3()
x n和()
I
x n之间的区别)。
延时不变时,衰减系数 a 从零增大到 1 的过程中,回声效果由差变好再变差。
a 很小时,几乎听不到回声,a 在 0.5(±0.1)时,回声效果最明显,a 接近 1 时,声音变得很不清晰,几乎不可识别。
衰减系数不变时,延时 T 从零增大的过程中,回声效果由差变好再变差。
T接近 0 时,可以听到回声,但多次回声的层次感不清晰。
0.1s<T<1s 时,回声效果最好,多次回声层次感强。
T>1s 时,回声感不强,感觉只是单纯地对输入声音的重复。