北邮《数字信号处理》Matlab实验——实现重叠相加和重叠保留算法完成线性卷积的分段计算
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验题目 1:线性卷积的分段计算
实验目的:
实现重叠相加和重叠保留算法,完成线性卷积的分段计算(可任意指定 x(n)及 h(n)) 。
试验内容:
1、对算法的概括性说明
重叠相加法是将待过滤的信号分割成长为 N 的若干段,每一段都可以和有限时宽单位 取样响应作卷积,再将过滤后的各段重叠相加。建立缓存序列,每次输入 N 点序列,通过 计算 x(n)和 h(n) 的循环卷积实现线性卷积运算,将缓存的 M‐1 点序列和卷积结果相加,并 输出前 N 点作为计算结果,同时缓存后 M‐1 点,如此循环,直至所有分段计算完毕,则输 出序列 y(n)为最终计算结果。
5、总结实验过程中出现的问题以及解决问题的具体措施
1.利用自定义函数解决代码重复使用的问题,避免多次输入同样代码。 2.构造分段补零不会实现,通过上网查资料后获得实现相关功能的代码。
可见, 用重叠相加法和重叠保留发分别计算的卷积结果与直接利用线性卷积计算的结果 一致。算法正确性得以验证。
4、结合教材 3.5.1 节作运算量分析
若有限长因果序列 x(n)和 h(n)的长度分别为 N 和 M,计算其线性卷积 y(n),需 MN 次乘 法运算,(M‐1)(N‐1)次加法运算。如果利用循环卷积方法,按基 2 时域抽选法实现 L 点 FFT 和 IFFT,需
3、实验结果
输入(参考教材例 3.4、3.5) :
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)
输出:
y1 = 1 y2 = Columns 1 through 10 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2 2 2 2 2 2 2 2 2 -9 -10
M‐1 点缓存 后 M‐1 点 xl(n) N+M‐1 点 循环卷积 后 N 点 y(n)
序列衔接
每 N 点输入
h(n)
2、流程图及源代码
重叠相加法
开始
重叠保留法
开始
输入序列 X(n),h(n)
输入序列 X(n),h(n)
计算各序列长度、 分 段数、 生成临时序列
M‐1 点缓存 后 M‐1 点 xl(n) L 点循环卷积 前 N 点 L=N+M‐1 h(n) + y(n)
重叠保留法相当于将想 xl(n)和 h(n)作循环卷积,然后找出循环卷中相当于线性的部分。 在这种情况下,将序列 y(n)分为长 N 的若干段,每个输入段和前一段有 M‐1 个重叠点。此 时只需要将发生重叠的前 M‐1 个点舍去,保留重叠的部分并输出,则可获得序列 y(n)。
2.0000
Columns 11 through 12 -9.0000 -10.0000 y3 = Columns 1 through 10 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000
2.0000
Columns 11 through 12 -9.0000 -10.0000
计算各序列长度、 分 段数、 生成临时序列
分段循环卷积
填入保留之后 分段循环卷积
重叠相加后输 出前 N 点 否 完成所有分段 计算?
输出前 N 个点 并为 t(n)重新赋 为保留值 否
完成所有分段 计算?
是 是 输出序列 y(n) 输出序列 y(n)
结束 function [ y ] = circular_conv( x1, x2, L ) % 利用循环卷积计算线性卷积 % 循环卷积采用频域计算方法,已 FFT 代替 DFT,降低运算量 X1k = fft(x1,L); %x1 做 L 点 FFT X2k = fft(x2,L); %x1 做 L 点 FFT Yk = X1k.*X2k; %频域相乘 y = ifft(Yk); %FFT 反变换得循环卷积结果 end function [ y ] = overlap_add( x, h, N ) %重叠相加法实现 %核心为将高点数 DFT 转化为低点数 DFT,且用循环卷积计算线性卷积 M = length(h); %获得 h(n)的长度 if N < M %为 N 选择合适的值保证运算正确 N = M+1; end L = M+N-1; %循环卷积与线性卷积结果相同时需要进行运算的最少点数
结束
Hale Waihona Puke Lx = length(x); %获得 x(n)的长度 T = ceil(Lx/N); %确定分段数 T t = zeros(1,M-1); %初始化序列 t(n) x = [x,zeros(1, (T+1)*N-Lx)]; %不足的分段补零 y = zeros(1, (T+1)*N); %生成输出序列 y(n),长度足够长 for i = 0:1:T xi = i*N+1; x_seg = x(xi:xi+N-1); %选择低点数计算时的分段 x(n) 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); %重新对 t(n)赋值为保留的后 M-1 点 y(xi:xi+N-1) = y_seg(1:N); %直接输出前 N 个点 end y=y(1:Lx+M-1); %取出最终的输出序列 end function [ y ] = overlap_save( x, h, N ) %重叠保留法实现 %核心为将高点数 DFT 转化为低点数 DFT,且用循环卷积计算线性卷积 Lx = length(x); %获得 x(n)的长度 M = length(h); %获得 h(n)的长度 if N < M %为 N 选择合适的值保证运算正确 N = M+1; end L = N+M-1; %为降低点数,取 M+N-1 点循环卷积即可 t = zeros(1,M-1); %初始化序列 t(n) 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)]; %确定每个低点数卷积的分段 x(n) t = x_seg(N+1:N+M-1); %为 t(n)重新赋值为后 M-1 个点的值 y_seg = circular_conv(x_seg,h,L); %循环卷积计算线性卷积 y(xi:xi+N-1) = y_seg(M:N+M-1);%直接取出后 N 个点作为一次计算的输出 end y=y(1:Lx+M-1); %取出实际的输出序 end
3L log 2 L L 次乘法运算, 3L log 2 L 次加法运算。可以看出: (1)当 M、N 2
取值较大且相近时,可实现对线性卷积的快速计算; (2)当 M、N 有较大差异时,线性卷积 和循环卷积运算量相当, 此时若希望降低线性卷积计算开销, 需采用重叠相加法或重叠保留 法。 重叠保留法和相加运行效率与分段长度关性较强。 分段数和卷积运算的序列长度为非线 性关系,在实际应用中,重叠保留和相加主要用于实施信号处理,在保证实时性的要求下, 输入序列的分段不能太长。
实验目的:
实现重叠相加和重叠保留算法,完成线性卷积的分段计算(可任意指定 x(n)及 h(n)) 。
试验内容:
1、对算法的概括性说明
重叠相加法是将待过滤的信号分割成长为 N 的若干段,每一段都可以和有限时宽单位 取样响应作卷积,再将过滤后的各段重叠相加。建立缓存序列,每次输入 N 点序列,通过 计算 x(n)和 h(n) 的循环卷积实现线性卷积运算,将缓存的 M‐1 点序列和卷积结果相加,并 输出前 N 点作为计算结果,同时缓存后 M‐1 点,如此循环,直至所有分段计算完毕,则输 出序列 y(n)为最终计算结果。
5、总结实验过程中出现的问题以及解决问题的具体措施
1.利用自定义函数解决代码重复使用的问题,避免多次输入同样代码。 2.构造分段补零不会实现,通过上网查资料后获得实现相关功能的代码。
可见, 用重叠相加法和重叠保留发分别计算的卷积结果与直接利用线性卷积计算的结果 一致。算法正确性得以验证。
4、结合教材 3.5.1 节作运算量分析
若有限长因果序列 x(n)和 h(n)的长度分别为 N 和 M,计算其线性卷积 y(n),需 MN 次乘 法运算,(M‐1)(N‐1)次加法运算。如果利用循环卷积方法,按基 2 时域抽选法实现 L 点 FFT 和 IFFT,需
3、实验结果
输入(参考教材例 3.4、3.5) :
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)
输出:
y1 = 1 y2 = Columns 1 through 10 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2 2 2 2 2 2 2 2 2 -9 -10
M‐1 点缓存 后 M‐1 点 xl(n) N+M‐1 点 循环卷积 后 N 点 y(n)
序列衔接
每 N 点输入
h(n)
2、流程图及源代码
重叠相加法
开始
重叠保留法
开始
输入序列 X(n),h(n)
输入序列 X(n),h(n)
计算各序列长度、 分 段数、 生成临时序列
M‐1 点缓存 后 M‐1 点 xl(n) L 点循环卷积 前 N 点 L=N+M‐1 h(n) + y(n)
重叠保留法相当于将想 xl(n)和 h(n)作循环卷积,然后找出循环卷中相当于线性的部分。 在这种情况下,将序列 y(n)分为长 N 的若干段,每个输入段和前一段有 M‐1 个重叠点。此 时只需要将发生重叠的前 M‐1 个点舍去,保留重叠的部分并输出,则可获得序列 y(n)。
2.0000
Columns 11 through 12 -9.0000 -10.0000 y3 = Columns 1 through 10 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000
2.0000
Columns 11 through 12 -9.0000 -10.0000
计算各序列长度、 分 段数、 生成临时序列
分段循环卷积
填入保留之后 分段循环卷积
重叠相加后输 出前 N 点 否 完成所有分段 计算?
输出前 N 个点 并为 t(n)重新赋 为保留值 否
完成所有分段 计算?
是 是 输出序列 y(n) 输出序列 y(n)
结束 function [ y ] = circular_conv( x1, x2, L ) % 利用循环卷积计算线性卷积 % 循环卷积采用频域计算方法,已 FFT 代替 DFT,降低运算量 X1k = fft(x1,L); %x1 做 L 点 FFT X2k = fft(x2,L); %x1 做 L 点 FFT Yk = X1k.*X2k; %频域相乘 y = ifft(Yk); %FFT 反变换得循环卷积结果 end function [ y ] = overlap_add( x, h, N ) %重叠相加法实现 %核心为将高点数 DFT 转化为低点数 DFT,且用循环卷积计算线性卷积 M = length(h); %获得 h(n)的长度 if N < M %为 N 选择合适的值保证运算正确 N = M+1; end L = M+N-1; %循环卷积与线性卷积结果相同时需要进行运算的最少点数
结束
Hale Waihona Puke Lx = length(x); %获得 x(n)的长度 T = ceil(Lx/N); %确定分段数 T t = zeros(1,M-1); %初始化序列 t(n) x = [x,zeros(1, (T+1)*N-Lx)]; %不足的分段补零 y = zeros(1, (T+1)*N); %生成输出序列 y(n),长度足够长 for i = 0:1:T xi = i*N+1; x_seg = x(xi:xi+N-1); %选择低点数计算时的分段 x(n) 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); %重新对 t(n)赋值为保留的后 M-1 点 y(xi:xi+N-1) = y_seg(1:N); %直接输出前 N 个点 end y=y(1:Lx+M-1); %取出最终的输出序列 end function [ y ] = overlap_save( x, h, N ) %重叠保留法实现 %核心为将高点数 DFT 转化为低点数 DFT,且用循环卷积计算线性卷积 Lx = length(x); %获得 x(n)的长度 M = length(h); %获得 h(n)的长度 if N < M %为 N 选择合适的值保证运算正确 N = M+1; end L = N+M-1; %为降低点数,取 M+N-1 点循环卷积即可 t = zeros(1,M-1); %初始化序列 t(n) 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)]; %确定每个低点数卷积的分段 x(n) t = x_seg(N+1:N+M-1); %为 t(n)重新赋值为后 M-1 个点的值 y_seg = circular_conv(x_seg,h,L); %循环卷积计算线性卷积 y(xi:xi+N-1) = y_seg(M:N+M-1);%直接取出后 N 个点作为一次计算的输出 end y=y(1:Lx+M-1); %取出实际的输出序 end
3L log 2 L L 次乘法运算, 3L log 2 L 次加法运算。可以看出: (1)当 M、N 2
取值较大且相近时,可实现对线性卷积的快速计算; (2)当 M、N 有较大差异时,线性卷积 和循环卷积运算量相当, 此时若希望降低线性卷积计算开销, 需采用重叠相加法或重叠保留 法。 重叠保留法和相加运行效率与分段长度关性较强。 分段数和卷积运算的序列长度为非线 性关系,在实际应用中,重叠保留和相加主要用于实施信号处理,在保证实时性的要求下, 输入序列的分段不能太长。