T=1;% 周期0-1
N=20;% 最大谐波
k=-N:N;% -20:20——-20表示a_(20)e^(j*20*w0*t)
N1=length(k);%N1=41
% ceil(N1/2)=21%即21是N1的中位数
t=linspace(0,T,100);
Nt=length(t);
tt=linspace(-4*T,4*T,1024);
Ntt=length(tt);
w0=2*pi/T;
% 0-T
xt=(t>=T/4).* 1.0;
fig10=figure(10);
fig10.Name='原函数';
plot(t,xt);
axis([t(1) t(Nt) min(xt)-0.05 max(xt)+0.05 ]);
N2=length(tt);
xx=zeros(1,N2);%size(a)=1*41,用于记录傅里叶级数的系数
for n=1:N2
for numT=-4:3
if (T/4+numT*T)
a=zeros(1,N1);%size(a)=1*41,用于记录傅里叶级数的系数
for n=1:N1
% a(n)=integral(@(x) signal0(x,k(n),T),0,T); %1
a(n)=integral(@(x) signal0(x,k(n),T),0,T,'RelTol',0,'AbsTol',1e-12);
% %解决《警告: 最小步长已快达到 x = 0.25。可能具有奇异性,或者容差可能对于此问题太小。 》
% RelTol - 相对误差容限
% AbsTol - 绝对误差容限
end
A=abs(a); %计算傅里叶变换的幅值
fig30=figure(30);
fig30.Name='傅里叶分解图';
subplot(3,1,1);stem(k,A);ylabel("a(k)幅值");
axis([k(1) k(N1) min(A)-0.05 max(A)+0.05]);% axis([ x起点 x终点 y起点 y终点]);
subplot(3,1,2); stem(k,real(a));ylabel('a(k)实部'); % real(F)
axis([k(1) k(N1) min(real(a))-0.05 max(real(a))+0.05 ]);
subplot(3,1,3);stem(k,imag(a));ylabel('a(k)虚部'); % imag(F)
xlabel('k');
axis([k(1) k(N1) min(imag(a))-0.05 max(imag(a))+0.05 ]);
%基波分量
fundamental_component=a(ceil(N1/2))*exp(1i*0*w0*tt);
%一次谐波分量
% first_harmonic_component=a(ceil(N1/2)-1)*exp(-1i*1*w0*tt)+a(ceil(N1/2)+1)*exp(1i*1*w0*tt);
har=1;
first_harmonic_component=a(ceil(N1/2)-har)*exp(-1i*har*w0*tt)+a(ceil(N1/2)+har)*exp(1i*har*w0*tt);
%二次谐波分量
% second_harmonic_component=a(ceil(N/2)-2)*exp(-1i*2*w0*tt)+a(ceil(N/2)+2)*exp(1i*2*w0*tt);
har=2;
second_harmonic_component=a(ceil(N1/2)-har)*exp(-1i*har*w0*tt)+a(ceil(N1/2)+har)*exp(1i*har*w0*tt);
%三次谐波分量
har=3;
third_harmonic_component=a(ceil(N1/2)-har)*exp(-1i*har*w0*tt)+a(ceil(N1/2)+har)*exp(1i*har*w0*tt);
fig40=figure(40);
fig40.Name='傅里叶分解图';
subplot(3,1,1);
plot(tt,fundamental_component);
ylabel('基波分量');
subplot(3,1,2);
plot(tt,fundamental_component+first_harmonic_component+second_harmonic_component);
ylabel(sprintf('%d%s',2,'次谐波分量合成图'));
subplot(3,1,3);
plot(tt,fundamental_component+first_harmonic_component+second_harmonic_component+third_harmonic_component)
ylabel(sprintf('%d%s',3,'次谐波分量合成图'));
xiebo=8;% 计算前xiebo次谐波分量的和
% tt=linspace(-4*T,4*T,1024);
fx=a(ceil(N1/2))*exp(1i*0*w0*tt);
for n=1:xiebo
fx=fx+a(ceil(N1/2)-n)*exp(-1i*n*w0*tt)+a(ceil(N1/2)+n)*exp(1i*n*w0*tt);
% n=1——第20次谐波分量
% a(1)*exp(1i*(1-20-1)*w0*tt)=a(1)*exp(1i*(-20)*w0*tt)
% n=N1=41——第20次谐波分量
% a(41)*exp(1i*(41-20-1)*w0*tt)=a(41)*exp(1i*(20)*w0*tt)
end
fig41=figure(41);
fig41.Name=sprintf('%d%s',xiebo,'次谐波分量合成图');
% f3=figure('Name','傅里叶合成图','IntegerHandle','on','Number',100)
plot(tt,fx)
grid on
% tt=linspace(-4*T,4*T,1024);
fx=0;
for n=1:N1
fx=fx+a(n)*exp(1i*(n-N-1)*w0*tt);
% n=1——第20次谐波分量
% a(1)*exp(1i*(1-20-1)*w0*tt)=a(1)*exp(1i*(-20)*w0*tt)
% n=N1=41——第20次谐波分量
% a(41)*exp(1i*(41-20-1)*w0*tt)=a(41)*exp(1i*(20)*w0*tt)
end
fig42=figure(42);
fig42.Name='傅里叶合成图';
% f3=figure('Name','傅里叶合成图','IntegerHandle','on','Number',100)
plot(tt,fx)
grid on
%程序signal0.m:定义求傅里叶级数的系数的被积函数: y=(1/T)*x(t).*exp(-j*(2*pi/T)*k*t)
function y=signal0(t,k,T) %T为信号周期,t为时间变量,k为k次谐波
x=(t>=T/4).* 1.0;
% 定义占空比为25%的非对称周期方波for one period=T
% 对称周期三角形可定义:x=(abs(t)<=T/4). * (1-abs(t))
% 占空比为50%的对称周期方波可定义:x=(abs(t)<=T/4). *1.0
y=(1/T).*x.*exp(-1i*k*(2*pi/T)*t);
end
傅里叶分析和滤波- MATLAB & Simulink- MathWorks 中国