新手初学MATLAB(2)周期信号的傅里叶级数(频谱图)求解(原创易懂)

      在MATLAB中貌似没有相关求解周期信号频谱的函数,在查阅了许多资料也没有找到比
较合适可靠的资料,于是自己琢磨了,写了也可以实现**有关正弦线性函数(可直接
用符号变量表达的)**的、和**脉冲周期(可用数字量表现的周期信号)**两类的傅
里叶级数求解!

在进入正题前先来了解下基本的理论知识:
首先是连续信号的傅里叶级数公式在这里插入图片描述
一、有关正弦线性函数(可直接用符号变量表达的)信号
由于时间比较紧,也不做许多解释,核心点就是利用傅里叶级数公式,
其次就是注意符号变量表达式可以利用int积分函数,代码如下:
ps: 亲测可用,对应不同正弦线性函数信号,只需改下原函数即可,注意同时对w0进行更改,其为函数的最小频率,否则会出现错误;

t0=-10:0.01:10;
y0=cos(pi./2*t0);   
subplot(2,1,1);
plot(t0,y0);
xlabel('t');
ylabel('x(t)');%上述为绘制原信号图
grid on;
title('正弦信号');

N=21;    %(奇数)想要频谱左右显示的点数,此处为21个,即左右各10个频率点及k=0的一个点;
N0=(N+1)./2;%确定f=0点对应第几个点,其排序是从最左边开始排起,即第1个为k=-10;
a=ones(1,N);%给a(k)即傅里叶系数先定好对应行向量,方便后续运算;
syms z t y; %定义符号变量,方便积分
y=cos(t);
w0=1     ; %更变原信号时,此处应变为原信号的最小频率;
T=2*pi./w0; %以上为初始定义
for k=1:N;  %开始进行循环求出a(k)
if(k==N0)
z=y;        %因为a(0)的特殊性,故此处拿出单独计算;
a(k)=int(z,t,0,T)./(T);%傅里叶级数公式
else
z=y*exp(-i*(k-N0)*w0*t);%此处注意转换
a(k)=int(z,t,0,T)./(T);
end
end
k=-(N-1)./2:(N-1)./2;
subplot(2,1,2);
stem(k,a);  %绘制频谱图
grid on;
title('正弦信号频谱图');
xlabel('k');
ylabel('|a(k)|');
axis([-10,10,-1,1.5])

二、脉冲周期(可用数字量表现的周期信号),其核心点还是利用傅里叶级数公式,
其次就是下列非符号量函数不能用int函数,改成无穷求和函数trapz,代码如下:
ps:亲测可用,对于其它非符号变量函数,只需写一个周期对应函数即可

>> t=-10:0.01:10;
y=(square(pi./2*(t+0.5),25)+1)./2;
subplot(2,1,1);
plot(t,y);
grid on;
title('周期脉冲');
xlabel('t');
ylabel('x(t)');%上述为绘制原信号图
axis([-10,10,-0.5,1.5]);
N=21;         %想要绘制频谱的数目,一般为奇数因为包括k=0;
T1=0.5;        %高电平脉宽长的一半,方便表达单个周期的信号
T=4;          %周期
w0=2*pi./T;
t=-T1:0.001:T1;  %积分区间,具体可参考trapz函数的注释
a=ones(1,N);    %产生行矩阵存放各系数
y1=1*(t>-0.5)-1*(t>0.5);%一个周期的信号
for k=1:21;           %对a(k)进行求解赋值
z=1*exp(-i*(k-11)*w0*t);%积分对象函数可直接写,注意傅里叶级数的求解公式

a(k)=trapz(t,z)./T;      %积分
end
k=-10:10;
subplot(2,1,2);
stem(k,abs(a));        %绘制频谱图
grid on;
title('周期脉冲频谱图');
xlabel('k');
ylabel('|a(k)|');

附录;冲激串序列的傅里叶级数,其与上述(二)方法一样,只是改了原函数,代码如下:

>> t=-10:0.01:10;
y=1*(mod(t,4)==0);
subplot(2,1,1);
plot(t,y);
grid on;
title('周期脉冲');
xlabel('t');
ylabel('x(t)');%上述为绘制原信号图
axis([-10,10,-0.5,1.5]);

N=21;         %想要绘制频谱的数目,一般为奇数因为包括k=0;
T1=0.5;        %高电平脉宽长的一半,方便表达单个周期的信号
T=4;          %周期
w0=2*pi./T;
t=-T1:0.001:T1;  %积分区间,具体可参考trapz函数的注释
a=ones(1,N);    %产生行矩阵存放各系数
y1=1*(t==0);    %一个周期的信号
for k=1:21;           %对a(k)进行求解赋值
z=1*exp(-i*(k-11)*w0*t*0);%积分对象函数可直接写,注意傅里叶级数的求解公式
a(k)=trapz(t,z)./T;      %积分
end
k=-10:10;
subplot(2,1,2);
stem(k,abs(a));        %绘制频谱图
grid on;
title('周期脉冲频谱图');
xlabel('k');
ylabel('|a(k)|');

有所不足,欢迎讨论

猜你喜欢

转载自blog.csdn.net/qq_37335890/article/details/82973363