matlabFourier变换--⽅波信号的分解与重建
N=200; %采⽤的数据点数
dt=4/N; %采样的间隔
for n=1:N      %⽣成⼀个⽅波
if (n*dt>=2)
x(n)=0.8;
else
x(n)=-0.8;
end
endmatlab求傅里叶变换
figure
subplot(2,1,1)
plot((1:N)*dt,x)
hold on
plot((1:N)*dt,zeros(1,N),'k');
xlabel('时间/s')
ylabel('⽅波信号');
title('原始信号');
%下⾯开始计算傅⾥叶变换系数
a=zeros(1,N);
b=a;
c=b;
nn=floor(N/2)+1;
for k=0:nn-1
a(k+1)=0;
b(k+1)=0;
for ii=0:N-1
a(k+1)=a(k+1)+2/N*x(ii+1)*cos(2*pi*k*ii/N); %求解Fourier系数
b(k+1)=b(k+1)+2/N*x(ii+1)*sin(2*pi*k*ii/N);
end
c(k+1)=sqrt(a(k+1).^2+b(k+1).^2);
end
subplot(2,1,2)
freq=(0:nn-1)/(N*dt);
plot(freq,c(1:length(freq)));
title('Fourier变换');
xlabel('频率/Hz')
ylabel('振幅');
%下⾯通过逆变换重现信号
m=input('输⼊谐波的最⼤阶数:');
if(m>(floor(N/2)+1))
error('谐波最⼤阶数必须⼩于Nyquist频率对应的阶数.');
end
if(mod(N,2)~=1)
a(nn)=a(nn)/2;
end
%合成信号
for ii=0:N-1
xx(ii+1)=a(1)/2;
for k=1:m
xx(ii+1)=xx(ii+1)+a(k+1)*cos(2*pi*k*ii/N)+b(k+1)*sin(2*pi*k*ii/N);
end
end
% figure
% figure
plot((1:N)*dt,xx,(0:N-1)*dt,x);
hold on
plot((1:N)*dt,zeros(1,N),'k');
xlabel('时间/s')
ylabel('信号');
title('合成信号');
通过不断提⾼最⼤谐波的阶数,经过Fourier逆变换来重新原来的⽅波信号会越来越接近真实。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。