1. 程式人生 > >重疊保留法、重疊相加法的MATLAB程式碼

重疊保留法、重疊相加法的MATLAB程式碼

%重疊保留法
clc;close all;clear all;
xk=[1 2 3 4 5];%子序列
h=[1 2 1];%短序列
N=5;M=3;%長度
for k=1:6
x((k-1)N+1:kN)=xk;%長序列
end
Hk=fft(h,N+M-1);%短序列的DFT
y=zeros(1,M+N*6-1);%規定線性卷積序列的總長度
overlap=zeros(1,M-1);
y(1:N+M-1)=ifft(fft([overlap x(1:N)],N+M-1).*Hk);
y(1:N)=y(M:N+M-1);%捨棄前M-1點
for k=2:6
overlap=x((k-1)*N-M+2:(k-1)*N);%向前重複取的資料
yk=ifft(fft([overlap x((k-1)N+1:k

N)],N+M-1).*Hk);
y((k-1)N+1:kN)=yk(M:N+M-1);%捨棄前M-1點
end
k=k+1;
overlap=x((k-1)*N-M+2:(k-1)*N);
yk=ifft(fft([overlap zeros(1,N)],N+M-1).*Hk);
y((k-1)N+1:kN)=yk(M:N+M-1);%捨棄前M-1點
figure;
stem(0:length(y)-1,y,‘bp’,‘linewidth’,1);
xlabel(‘n’,‘fontsize’,15);ylabel(‘y(n)’,‘fontsize’,15);

%重疊相加法
clc;close all;clear all;
xk=[1 2 3 4 5];%子序列
h=[1 2 1];%短序列
N=5;M=3;%長度
for k=1:6
x((k-1)N+1:k

N)=xk;%長序列
end
Hk=fft(h,N+M-1);
y=zeros(1,M+N*6-1);%規定線性卷積序列的總長度
y(1:N+M-1)=ifft(fft(x(1:N),N+M-1).*Hk);%求前(N+M-1)點的線性卷積
for k=2:6
yk=ifft(fft(x((k-1)N+1:kN),N+M-1).*Hk);
y((k-1)*N+1:(k-1)*N+M-1)=yk(1:M-1)+y((k-1)*N+1:(k-1)*N+M-1);%重疊相加
y((k-1)N+M:kN+M-1)=yk(M:N+M-1);
end
figure;
stem(0:length(y)-1,y,‘bp’,‘linewidth’,1);
xlabel(‘n’,‘fontsize’,15);ylabel(‘y(n)’,‘fontsize’,15);