matlab Fourier变换--方波信号的分解与重建

N=200; %采用的数据点数
dt=4/N; %采样的间隔
for n=1:N       %生成一个方波
    if (n*dt>=2)
        x(n)=0.8;
    else
        x(n)=-0.8;
    end
end

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
plot((1:N)*dt,xx,(0:N-1)*dt,x);
hold on
plot((1:N)*dt,zeros(1,N),'k');
xlabel('时间/s')
ylabel('信号');
title('合成信号');



matlab Fourier变换--方波信号的分解与重建_第1张图片

通过不断提高最大谐波的阶数,经过Fourier逆变换来重新原来的方波信号会越来越接近真实。

你可能感兴趣的:(matlab Fourier变换--方波信号的分解与重建)