北京邮电大学
《数字信号处理》Matlab实验
学院:
班级:
姓名:
学号:
班内序号:
实验一
【实验要求】
实现重叠相加和重叠保留算法,完成线性卷积的分段计算。
【实验原理】
一、算法产生背景
DFT是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换频域的采样。
对于线性非移变离散系统,可由线性卷积表示时域输入输出关系。即y(n)=x(n)*h(n)。
通常采用循环卷积降低运算量,但实际中往往无法满足对信号处理的实时性要求。因此,产生了重叠相加法和重叠保留法两种典型的算法,用以快速计算线性卷积,成为了DFT的一个重要应用。
二、算法基本思想
重叠相加法是将待过滤的信号分割成长为N的若干段,每一段都可以和有限时宽单位取样响应作卷积,再将过滤后的各段重叠相加。
具体算法实现:建立缓存序列,每次输入N点序列,通过计算x(n)和h(n)的循环卷积实现线性卷积运算,将缓存的M-1点序列和卷积结果相加,并输出前N点作为计算结果,同时缓存后M-1点,如此循环,直至所有分段计算完毕,则输出序列y(n)为最终计算结果。
重叠保留法相当于将x(n)和h(n)作循环卷积,然后找出循环卷积中相当于线性卷积的部分。在这种情况下,将序列y(n)分为长为N的若干段,每个输入段和前一段有M-1个重叠点。此时只需要将发生重叠的前M-1个点舍去,保留重叠的部分并输出,则可获得序列y(n)。
【流程图设计】
重叠相加法
重叠保留法
【MATLAB源代码】
重叠相加法
function y = ovrlplus (x,h,N) %重叠相加法实现
M = length(h); %获得h(n)的长度
if N <M %为N选择合适的值保证运算正确
N = M+1;
end
L = M+N-1; %循环卷积与线性卷积结果相同时需要进行运算的最少点数
Lx = length(x); %获得x(n)的长度
T = floor(Lx/N); %确定分段数T floor 向下取整函数
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 = circonvt(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); %取出最终的输出序列
(2)function[y]=circonvt(x1,x2,N)%循环卷积实现
if length(x1)>N
error('N must be>=the length of x1')
end
if length(x2)>N
error('N must be>=the length of x1')
end
x1=[x1 zeros(1,N-length(x1))];
x2=[x2 zeros(1,N-length(x2))];
m=[0:1:N-1];
x2=x2(mod(-m,N)+1);
H=zeros(N,N);
for n=1:1:N
H(n,:)=cirshftt(x2,n-1,N);
end
y=x1*conj(H');
(3)function y=cirshftt(x,m,N)%循环移位实现
if length(x)>N
error('N must be >= the length of x')
end
x=[x zeros(1,N-length(x))];%补零函数(x(n)的长度小于N,将不够的地方全部补零)
n=[0:1:N-1]; n=mod(n-m,N);y=x(n+1);
重叠保留法
(1)function[y]=ovrlpsav(x,h,N)%实现重叠保留的主函数
Lenx=length(x);
M=length(h);
M1=M-1;
L=N-M1;
h= [h zeros(1,N-M)];
x=[zeros(1,M1),x,zeros(1,N-1)];
K=floor((Lenx+M1-1)/
北邮大《数字信号处理》Matlab实验报告 来自淘豆网m.daumloan.com转载请标明出处.