北邮《数字信号处理》Matlab实验——实现重叠相加和重叠保留算法完成线性卷积的分段计算
- 格式:pdf
- 大小:156.59 KB
- 文档页数:4
重叠相加法与重叠保存法的原理实现侯凯(吉林大学 通信工程学院 吉林 长春 130012)0概述线性卷积是求离散系统响应的主要方法之一,许多重要应用都建立在这一理论基础上,如卷积滤波等。
用圆周卷积计算线性卷积的方法归纳如下:将长为N 2的序列x(n)延长到L,补L -N 2个零,将长为N 1的序列h(n)延长到L,补L -N 1个零。
如果L ≥N1+N2-1,则圆周卷积与线性卷积相等,此时,可有FFT 计算线性卷积,方法如下:a.计算X(k)=FFT[x(n)]b.求H(k)=FFT[h(n)]c.求Y(k)=H(k)Y(k) k=0~L -1d.求y(n)=IFFT[Y(k)] n=0~L -1可见,只要进行二次FFT,一次IFFT 就可完成线性卷积计算。
上述结论适用于x(n)、h(n)两序列长度比较接近或相等的情况,如果x(n)、h(n)长度相差较多。
例如,h(n)为某滤波器的单位脉冲响应,长度有限,用来处理一个很长的输入信号x(n),或者处理一个连续不断的信号,按上述方法,h(n)要补许多零再进行计算,计算量有很大的浪费,或者根本不能实现。
为了保持快速卷积法的优越性,可将x(n)分为许多段后处理,每小段的长与h(n)接近,其处理方法有两种:重叠相加法和重叠保留法。
1重叠相加法——由分段卷积的各段相加构成总的卷积输出假定x i (n)表示图中第i 段x(n)序列如下图:22()(1)1()0i x n iN n i N x n ≤≤+-⎧=⎨⎩则输入序列可表为:()()i i x n x n ∞=-∞=∑图1 长序列分段滤波于是输出可分解为: ()()*()()*()()i i i i i y n x n h n x n h n y n ∞∞=-∞=-∞===∑∑其中 ()()*()i i y n x n h n =由此表明,只要将x(n)的每一段分别与h(n)卷积,然后再将这些卷积结果相加起来就可得到输出序列,这样,每一段的卷积都可用上面讨论的快速卷积来计算。
Dsp-matlab实验实验一:重叠相加法和重叠保留法的实现设计报告课题名称:学生姓名:班级:班内序号:学号:日期:2015/06/15目录一、实验原理·········································二、Matlab源代码·································三、Matlab运行结果····························四、Matlab结果分析····································五、遇到的难题与解决方法····························参考文献·························································一、实验原理1、算法来源DFT 是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换频域的采样。
Dsp-matlab实验实验一:重叠相加法和重叠保留法的实现设计报告课题名称:学生姓名:级:班班内序号:学号:2015/06/15 日期:目录一、实验原理·········································二、Matlab源代码·································运行结果Matlab三、····························结果分析Matlab四、····································五、遇到的难题与解决方法····························参考文献·························································一、实验原理1、算法来源DFT 是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换频域的采样。
Matlab实验报告学院:信息与通信工程学院班级:201321113学号:2013210381班内序号:18姓名:石雪原实验题目1.实现重叠相加和重叠保留算法一.实验原理重叠相加法和重叠保留法的实质都是以逐段地方式通过循环卷积来完成线性卷积的计算。
将输入序列x (n)进行分段,每段长为N,且N>M(M为有限长因果序列h (n)的长度),x (n) 逐段与h (n)进行循环卷积,在重叠保留法中需在x (n)序列首部加入长度为M-1的0序列。
在算法中,在获得N个点的输入后,进行N+M-1点循环卷积计算,之后输出N个点。
通过for循环逐段进行循环卷积,使用FFT和IFFT 计算两个有限长序列的N点循环卷积结果。
二.源代码和流程图重叠相加法代码function [Y]=overpl(x,h,N)Lx=length(x); % 序列长度M=length(h); %h (n )长度x=[x,zeros(1,N-1)];t=zeros(1,M-1);Y=zeros(1,Lx+M-1);a=floor(Lx/N);for k=0:aA=x(k*N+1:k*N+N);y1=fft(A,Lx+M-1); % 利用fft 进行运算y2=fft(h,Lx+M-1);y3=y1.*y2;q=ifft(y3,Lx+M-1);Y(k*N+1:k*N+M-1)=q(1:M-1)+t(1:M-1);Y(k*N+M:k*N+N)=q(M:N);t(1:M-1)=q(N+1:N+M-1);endY(1:Lx+M-1);对应流程图图一:每段利用fft和ifft实现循环卷积图二:对X (n)逐段进行循环卷积然后相加得输出线性卷积结果y (n)重叠保留法代码fun cti on [Y]二overlpsav(x,h,N)Lx=le ngth(x);M=le ngth(h);M仁M -1;L=N-M1;h=[h,zeros(1,N-M)];图x=[zeros(1,M1),x,zeros(1,N-1)];a 二floor ((Lx+M1-1)/(L))+1; Y=zeros(1,N); for k=0:a-1 xk=x(k*L+1:k*L+N); b=fft(xk,N); C=fft(h,N); Z=b.*C;Y (k+1,:)=ifft(Z,N); end Y=Y (:,M:N): Y=( Y(:))'对应流程图装成单列向量再转置成行向量 输出输入数据 x I 各段搭接长 长度及脉冲 —\度M1,有效 响应长度k数据长度L将h 延长 至循环 长度N㈡把x 前面 加上(M- 1)个零各段进 行卷积把 K+1X N 阶输出矩 阵Y 初始 化Y 中各行均去 掉前M-1个样 Z 本,转置后构V成新的Y三.实验结果重叠相加法x=[1,2,3] h二[1,2,3] N=41 5]? 3X] 1 K 12 9 0緒=1 1 10 12 9 0重叠保留法x=[1,2,3,4,5,6,7,8,9,10] h=[1,0,-1] N=4四.结果分析(有关运算量的定量分析结果)有限长因果序列x (n)h (n)的长度分别为N和M直接计算线性卷积y (n),y(n)可视为N个序列的叠加结果,序列长度为M 所以每生成一个序列需完成M次乘法,共需完成MN次乘法运算。
基于MATLAB的线性圆周卷积(DFT)及重叠相加法代码主程序:x1=[1,2,3,4,5,5,4,3,2,1];x2=[1,0,1];L=8;y=chongdie(x1,x2,L);s=1:10;subplot(2,2,1);stem(s,x1)r=1:3;subplot(2,2,2);stem(r,x2)u=1:13;subplot(2,2,3);stem(u,y)函数juanji()function y=juanji(x1,x2,L)if length(x1)>L %如果x1长度大于L则产生错误error('L must not be less than length of x1');endif length(x2)>N %如果x2长度大于L则产生错误error('L must not be less than length of x2');endX1k=fft(x1,L); %对x1进行L点FFT计算X2k=fft(x2,L); %对x2进行L点FFT计算Yk=X1k.*X2k; %频域相乘y=ifft(Yk); %反变换得卷积结果if (all(imag(x1)==0))&(all(imag(x2)==0))y=real(y);end函数chongdie()方案1:function[y]=chongdie(x,h,N)Lenx=length(x); %取x(n)的长度M=length(h); %取h(n)的长度L=N+M-1; %计算圆周卷积的周期L使其不发生混叠x=(x,zero(1,N-1)); %填充序列使得循环中对序列的索引不会超出围K=floor(Lenx/N);y=zeros(1,Lenx+L-1); %确定分段数Kfor i=0:1:Kix=i*N;x_seg=x(ix+1:ix+N); %将x(n)分段y_seg=juanji(x_seg,h,L); %调用函数juanji()计算圆周卷积y(ix+1:ix+L)=y(ix+1:ix+L)+y_seg(1:L); %各段重叠相加endy=y(1:Lenx+M-1); %取出实际的输出序列方案2:function[y]=chongdie(x,h,L)Lenx=length(x); %取x(n)的长度M=length(h); %取h(n)的长度N=L-M+1; %计算分段大小Nx=[x,zeros(1,N-1)]; %填充序列使得循环中对序列的索引不会超出围K=floor(Lenx/N); %确定分段数Ky=zeros(1,Lenx+L-1);for i=0:1:Kix=i*N;x_seg=x(ix+1:ix+N); %将x(n)分段y_seg=juanji(x_seg,h,L); %调用函数juanji()计算圆周卷积y(ix+1:ix+L)=y(ix+1:ix+L)+y_seg(1:L); %各段重叠相加endy=y(1:Lenx+M); %取出实际的输出序列。
实验题目3:梳状滤波器的应用实验目的:录制一段自己的话音,时间长度及取样频率自定;对该段声音加入一次反射、三次反射和无穷多次反射。
试验内容: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)、加入一次反射后的声音序列x1(n)、加入三次反射后的声音序列x3(n)和加入无穷多次反射后的声音序列x I(n)。
[x, fs] = wavread('a.wav');% sound(x, fs);a = 0.6; T = 0.2;y1 = filter([1, zeros(1,T*fs-1), a], 1, x);% sound(y1, fs); wavwrite(y1, fs, 'echo1.wav');y2 = filter([1, zeros(1,T*fs-1), a, zeros(1,T*fs-1), a^2, zeros(1,T*fs-1), a^3], 1, x);% sound(y2, fs); wavwrite(y2, fs, 'echo2.wav');y3 = filter(1, [1, zeros(1,T*fs-1), a], x);% sound(y3, fs); wavwrite(y3, fs, 'echo3.wav');plot(y3, 'm');hold on; plot(y2, 'r');hold on; plot(y1, 'g');hold on; plot(x, 'b');其中蓝色为原声音序列x(n),粉红色为加入一次反射后的声音序列x1(n),绿色为加入三次反射后的声音序列x3(n),红色为加入无穷多次反射后的声音序列x I(n)。
数字信号处理软件实验——MatLab仿真实验报告学院:电子工程学院班级:2013211202姓名:学号:实验一:数字信号的 FFT 分析1、实验内容及要求(1) 离散信号的频谱分析:设信号 此信号的0.3pi 和 0.302pi 两根谱线相距很近,谱线 0.45pi 的幅度很小,请选择合适的序列长度 N 和窗函数,用 DFT 分析其频谱,要求得到清楚的三根谱线。
(2) DTMF 信号频谱分析用计算机声卡采用一段通信系统中电话双音多频(DTMF )拨号数字 0~9的数据,采用快速傅立叶变换(FFT )分析这10个号码DTMF 拨号时的频谱。
2、实验目的通过本次实验,应该掌握:(a) 用傅立叶变换进行信号分析时基本参数的选择。
(b) 经过离散时间傅立叶变换(DTFT )和有限长度离散傅立叶变换(DFT ) 后信号频谱上的区别,前者 DTFT 时间域是离散信号,频率域还是连续的,而 DFT 在两个域中都是离散的。
(c) 离散傅立叶变换的基本原理、特性,以及经典的快速算法(基2时间抽选法),体会快速算法的效率。
(d) 获得一个高密度频谱和高分辨率频谱的概念和方法,建立频率分辨率和时间分辨率的概念,为将来进一步进行时频分析(例如小波)的学习和研究打下基础。
(e) 建立 DFT 从整体上可看成是由窄带相邻滤波器组成的滤波器组的概念,此概念的一个典型应用是数字音频压缩中的分析滤波器,例如 DVD AC3 和MPEG Audio 。
3.设计思路及实验步骤1)离散信号的频谱分析:该信号中要求能够清楚的观察到三根谱线。
由于频率0.3pi 和0.302pi 间隔非常小,要清楚的显示,必须采取足够大小的N ,使得分辨率足够好,至少到0.001单位级,而频率0.45pi 的幅度很小,要清楚的观察到它的谱线,必须采取幅度够大的窗函数,使得它的频谱幅度变大一些。
同时还要注意频谱泄漏的问题,三个正弦函数的周期(2pi/w )分别为20,40,1000,所以为了避免产生频谱泄漏(k=w/w0为整数),采样点数N 必须为1000的整数倍。