matlab 求幅频图和相频图--利用傅里叶级数变换求取会出错

问题:matlab绘制信号的频谱和相谱

 背景:傅里叶可以将时域信号转为傅里叶级数

Q: 求傅里叶变化

A: 按照定义进行求取

Q: 如何绘图呢?

  教材答案:

   

Q:能否用计算机?

A: matlab, 代码如下

clear;
N=256;%取点数
fs=N;%采样频率, and sample with entire cycle
n=0:N-1;t=n/fs;%时间序列
A=10;% amplitude
%时域信号处理
Xt=zeros(1,N);%存储
T0=1;
for i=1:N
    if i<=N/2
         Xt(i)=A-A/(T0/2)*t(i);
         
    else
         Xt(i)= A/(T0/2)*(t(i)-T0/2);
    end
end

figure
subplot(3,1,1);
plot(t,Xt);
title('原信号');
xlabel('time/s');
ylabel('振幅/V');

%% FFT caculation
Y=fft(Xt-mean(Xt));%,N+1)/(N+1);%傅里叶变换
% remenber to subtract the DC value before FFT.
Y=Y(1:N/2+1);%由于对称性取频谱前半部分即可
mag=abs(Y);
%幅值修正
mag(1)=mag(1)/N;
mag(2:end-1)=2*mag(2:end-1)/N;
f=(0:N/2)*fs/N;
subplot(3,1,2);
%plot(f,mag,'r');
 semilogx(log(f),mag,'r');
xlabel('频率/Hz');
xlim([0 11])
ylabel('振幅/V');
title('频谱图');
%相频图
Phase=angle(Y)*180/pi;
%xiang=rad2deg(xiang);
subplot(3,1,3);
plot(f,Phase,'g');
xlabel('频率/Hz');
ylabel('相位/deg');
 ylim([-90 90])
title('相频图');

Q: 为什么不能直接用求解的傅里叶级数来算?

A: 我尝试了,结果总不对,主要是相位角不对。

clear;
N=256*1;%取点数
fs=256;%采样频率
n=0:N-1;t=n/fs;%时间序列
A=10;
%时域信号处理
Xt=zeros(1,N);%存储
sum=0;
for i=1:N
    for m=1:2:11  %n取到11 阶信号作近似原信号
         sum=sum+cos(m*2*pi*t(i))/(m*m);
        if(m>=11)
            Xt(i)=sum;%近似信号
            sum=0;
        end
    end
end
At=A/2+4*A/(pi*pi)*Xt;
subplot(3,1,1);
plot(t,At);
title('原信号');
Y=fft(At-mean(At));%傅里叶变换
Y=Y(1:N/2+1);%由于对称性取频谱前半部分即可
mag=abs(Y);
%幅值修正
mag(1)=mag(1)/N;
mag(2:end-1)=2*mag(2:end-1)/N;
f=(0:N/2)*fs/N;
subplot(3,1,2);
plot(f,mag,'r');
xlabel('频率/Hz');
xlim([0 10])
ylabel('振幅');
title('频谱图');
%相频图
xiang=angle(Y);
xiang=rad2deg(xiang);
subplot(3,1,3);
plot(f,xiang,'g');
xlabel('频率/Hz');
ylabel('相位');
title('相频图');

相位角错了?? 没找到原因!!

修改相位角求法:

xiang=atan(imag(Y)./real(Y));
xiang(1)=0;

还是不对

参考 Matlab求解周期函数的傅里叶级数以及作频谱图与相位图_xbb0720的博客-优快云博客_matlab傅里叶级数

修改如下:

傅里叶级数函数---按照定义来求,是最正确的方法

function [ f ] = Tfourierseries( a0, an, bn, m, t )
%T FOURIERSERIES  
%   
% input the values of a0, an ,bn from fourier seriers experssion
%   t time  
%m is the number of harmonic frequency

f=a0;
 
for n=1:m
    f=f+an(n)*cos(n*pi.*t);% wt
    f=f+bn(n)*sin(n*pi.*t);
end

通过查阅优快云:更好的 傅里叶级数函数定义参看:一个MATLAB中傅里叶级数变换的函数_张雅琼的博客-优快云博客_matlab 计算傅里叶级数

程序:

      获得时域信号的,用多个谐波信号来合成时域信号。

%求傅里叶变换
N=1000;%取点数
fs=200;%采样频率, and sample with entire cycle
num=0:N-1;t=num/fs;%时间序列
A=10;% amplitude
%tripuls为三角波函数,进行偏移叠加处理可以得到一个类似三角周期函数的图
 a0= A/2;
 Nf=11;% 谐波的阶次
 an=zeros(1,Nf);
 bn=zeros(1,Nf)
 for i=1 :Nf
     if mod(i,2) ==0 
         an(i)=0;
     else
         an(i)=1/i^2*4*A/(pi*pi);
     end
 end
%3次谐波叠加
f3=Tfourierseries(a0, an, bn, 3, t);
%9次谐波叠加
  f9=Tfourierseries(a0, an, bn, 9, t);
% %21次谐波叠加
% f21=trifourierseries(a0, an, bn, 21, t);
% %45次谐波叠加
% f45=trifourierseries(a0, an, bn, 45, t);
 
%级数展开图
subplot(2,3,1);plot(t,f3,'b');grid on
%axis([-6.1,6.1,-0.1,1.1]);
title('展开3项');
xlabel('t');ylabel('f(t)');
subplot(2,3,4);plot(t,f9,'b');grid on
 title('展开9项');
% xlabel('t');ylabel('f(t)');
% subplot(2,3,2);plot(t,f,'r',t,f21,'b');grid on
% axis([-6.1,6.1,-0.1,1.1]);title('展开21项');
% xlabel('t');ylabel('f(t)');
% subplot(2,3,5);plot(t,f,'r',t,f45,'b');grid on
% axis([-6,6,-0.1,1.1]);title('展开45项');
% xlabel('t');ylabel('f(t)');

绘制频谱图---按照定义来;

%幅度谱--相位谱
 num=0:1:10;
 
%注意A0需要自己赋值
An=sqrt(an.^2+bn.^2);An(1)=a0;
%phi0同理
phi=atan(-bn./an);phi(1)=0;
subplot(2,3,3);stem(num,An,'b');
grid on; xlim([0 10]);
title('幅度谱');xlabel('n');ylabel('An');
ylim([0 1])
subplot(2,3,6);plot(num,phi,'b');
grid on; axis([-0.1,10.1,-0.1,1.1]);
title('相位谱');xlabel('n');ylabel('ψn');

按照定义可以求出相位,如果用phase函数,得出错误的结果。原因未知!!

<think>嗯,用户想把一个周期为T、幅值为1的方波展开成傅里叶级数,并绘制。首先,我需要回忆傅里叶级数关知识。傅里叶级数有两种形式:三角函数形式指数形式。方波是奇函数吗?还是需要考虑它的对称性? 根据参考内容中的引用[4],傅里叶级数可以将周期信号分解为无限多个离散的正交复指数信号之。用户可能需要先确定方波的表达式。假设方波在一个周期内是-1到1的交替,或者0到1的脉冲?这里可能需要明确方波的具体定义,比如占空比。比如,常见的方波可能是奇对称的,比如在-T/2到T/2区间内,前半个周期为1,后半个为-1。如果是这样的话,傅里叶级数中的余弦项可能会消失,只剩下正弦项,因为它是奇函数。 不过用户提到幅值为1,可能是指从0到1的方波,这时候可能会有直流分量。比如,在0到T/2为1,T/2到T为0。这时候需要计算其傅里叶系数。或者,用户指的是对称方波,比如在-T/2到T/2之间,-T/2到0为-1,0到T/2为1。这时候,作为奇函数的话,其展开式会有正弦项。 需要先明确方波的数学表达式。假设用户指的是奇对称的方波,比如函数f(t)在[-T/2, T/2]区间内,当t在[-T/2, 0)时为-1,在[0, T/2]时为1,然后周期延拓。这样情况下,函数是奇函数,所以其傅里叶级数中将只包含正弦项。 然后,根据傅里叶级数的公式,计算a0、anbn。对于奇函数,a0=0,an=0,只需要计算bn。计算积分的时候,可能需要分段积分。 具体步骤可能是这样的: 三角函数形式: f(t) = Σ [bn * sin(nω0 t)],其中ω0=2π/T。 然后计算bn: bn = (2/T) ∫_{-T/2}^{T/2} f(t) sin(nω0 t) dt. 积分区间分为两部分:从-T/2到0,f(t)=-1;从0到T/2,f(t)=1。代入积分,得到: bn = (2/T)[ ∫_{-T/2}^0 (-1) sin(nω0 t) dt + ∫_{0}^{T/2} 1*sin(nω0 t) dt ] 计算这两个积分,可能需要变量替换。例如,第一个积分可以令τ = t + T/2,但可能需要更直接的积分。或者,直接计算积分,得到表达式。 积分的结果应该是对于每个n的值,可能会得到一个系数。例如,对于奇次谐波存在,偶次谐波为零。比如,bn = 4/(nπ) 当n为奇数,否则0。这时候,傅里叶级数展开式将只包含奇次谐波的正弦项,系数为4/(nπ)。 如果是这样的话,三角函数形式可以写成: f(t) = (4/π) Σ [1/(2k-1) * sin((2k-1)ω0 t)],其中k从1到无穷大。 接下来是指数形式的傅里叶级数。根据引用[4],指数形式是复指数的,即: f(t) = Σ [Cn e^{jnω0 t}] 其中,Cn = (1/T) ∫_{0}^{T} f(t) e^{-jnω0 t} dt,或者根据周期积分区间而定。对于奇函数的情况,指数形式中的系数可能与三角函数形式中的系数有关联。例如,Cn可以表示为 (an - j bn)/2,而由于an=0,所以 Cn = -j bn/2。因此,在这种情况下,指数形式的系数会是纯虚数,且对于正负n对称。 然后,绘制需要分别绘制幅相频谱。幅谱是|Cn|的大小,相频谱是位角。例如,对于三角函数形式,每个谐波的幅值是bn,而指数形式的幅值是|Cn|,可能等于bn/2。对于奇次谐波,幅值逐渐递减,如4/(nπ)对应的指数形式中的系数为 2/(nπ)(因为Cn是bn/2的虚数)。 在绘制时,需要区分单边谱(三角函数形式)双边谱(指数形式)。单边谱每个率点nω0处的幅值是bn,而双边谱在±nω0处的幅值是|Cn|,即bn/2,并且位为±90度(因为Cn是虚数)。 此外,参考[2]中提到,方波平移会影响相频谱,但幅谱不变。因此,在计算过程中需要注意方波的位位置是否会影响位谱,但幅值谱可能同。例如,如果方波的位置不同,如用户提到的平移T0/4,会导致位的不同,但幅同。 现在,具体的步骤可能需要详细推导: 1. 确定方波的数学表达式,明确其对称性周期。 假设方波f(t)在[-T/2, T/2]内,当- T/2 ≤ t < 0时,f(t) = -1;当0 ≤ t < T/2时,f(t) = 1,并周期延拓。此时f(t)是奇函数,所以其傅里叶级数不含余弦项直流分量。 计算傅里叶系数: a0 = (1/T) ∫_{-T/2}^{T/2} f(t) dt = 0,因为正负面积抵消。 an = (2/T) ∫_{-T/2}^{T/2} f(t) cos(nω0 t) dt = 0,因为奇函数乘以偶函数cos是奇函数,积分结果为0。 bn = (2/T) ∫_{-T/2}^{T/2} f(t) sin(nω0 t) dt. 将积分拆分为两部分: bn = (2/T) [ ∫_{-T/2}^0 (-1) sin(nω0 t) dt + ∫_0^{T/2} 1·sin(nω0 t) dt ] 计算每个积分: 第一个积分,令t = -τ,积分限变为从0到T/2: ∫_{-T/2}^0 (-1) sin(nω0 t) dt = ∫_{T/2}^0 (-1) sin(-nω0 τ) (-dτ) ) = ∫_0^{T/2} (-1) [-sin(nω0 τ)] dτ = ∫_0^{T/2} sin(nω0 τ) dτ 第二个积分也是 ∫_0^{T/2} sin(nω0 τ) dτ 因此,bn = (2/T) [ ∫_0^{T/2} sin(nω0 τ) dτ + ∫_0^{T/2} sin(nω0 τ) dτ ] = (2/T) * 2 ∫_0^{T/2} sin(nω0 τ) dτ = (4/T) ∫_0^{T/2} sin(nω0 τ) dτ 计算积分: ∫ sin(a x) dx = -1/a cos(a x) + C,所以: 积分结果为 [-1/(nω0) cos(nω0 τ)] 从0到T/2. 代入上下限: = [-1/(nω0) cos(nω0 * T/2) + 1/(nω0) cos(0)] 由于ω0=2π/T,所以nω0*T/2 = n*(2π/T)*(T/2) = nπ. 因此: 积分结果 = [-1/(nω0) cos(nπ) + 1/(nω0) *1 ] = 1/(nω0) [1 - cos(nπ)] 而cos(nπ) = (-1)^n,所以: 积分结果 = 1/(nω0) [1 - (-1)^n ] 因此,bn = (4/T) * [1/(nω0)(1 - (-1)^n ) ] 代入ω0=2π/T,得到: bn = (4/T) * [ T/(2π n) (1 - (-1)^n ) ] = (4/(2π n)) (1 - (-1)^n ) = (2/(π n)) (1 - (-1)^n ) 当n为偶数时,1 - (-1)^n = 0,所以bn=0;当n为奇数时,1 - (-1)^n = 2,所以bn= (2/(π n)) *2 = 4/(π n ) 因此,傅里叶级数的三角函数形式为: f(t) = Σ_{n=1,3,5,...} (4/(π n)) sin(nω0 t ) 或者用k代替n,n=2k-1,k=1,2,3,... 即 f(t) = (4/π) Σ_{k=1}^∞ [ sin( (2k-1)ω0 t ) / (2k-1) ] 这就是方波的傅里叶级数展开式,三角函数形式。 接下来,指数形式。根据欧拉公式,可以将正弦函数表示为复指数: sinθ = (e^{jθ} - e^{-jθ})/(2j) 因此,代入上式: f(t) = (4/π) Σ_{k=1}^∞ [ (e^{j(2k-1)ω0 t} - e^{-j(2k-1)ω0 t}) / (2j(2k-1)) ) ] 整理得: = (4/(π·2j)) Σ [ (e^{j(2k-1)ω0 t} - e^{-j(2k-1)ω0 t})/(2k-1) ] = (2/(jπ)) Σ [ e^{j(2k-1)ω0 t}/(2k-1) - e^{-j(2k-1)ω0 t}/(2k-1) ] 注意到指数形式的傅里叶级数一般是: f(t) = Σ_{n=-∞}^∞ Cn e^{jnω0 t} 因此,比较可知,对于n为正奇数负奇数的情况: 当n=2k-1(正奇数)时,Cn = 2/(jπ(2k-1)) = -j2/(π(2k-1)) 当n=-(2k-1)(负奇数)时,Cn = -2/(jπ(2k-1)) = j2/(π(2k-1)) (因为原式中是减去负指数的项) 或者可以统一表示为: Cn = (1/T) ∫_{-T/2}^{T/2} f(t) e^{-jnω0 t} dt 这里,因为原函数是奇函数,计算Cn: Cn = (1/T) [ ∫_{-T/2}^0 (-1) e^{-jnω0 t} dt + ∫_0^{T/2} 1·e^{-jnω0 t} dt ] 同样的积分拆分: 令第一个积分变量替换为τ = -t: ∫_{-T/2}^0 (-1) e^{-jnω0 t} dt = ∫_{0}^{T/2} (-1) e^{jnω0 τ} dτ 所以,整个积分变为: (1/T) [ - ∫_0^{T/2} e^{jnω0 τ} dτ + ∫_0^{T/2} e^{-jnω0 τ} dτ ] 计算这两个积分: ∫ e^{jnω0 τ} dτ = (1/(jnω0)) e^{jnω0 τ} |从0到T/2 同样,积分结果为: 对于第一个积分: [ e^{jnω0 T/2} - 1 ] / (jnω0 ) 同理,第二个积分: [ e^{-jnω0 T/2} - 1 ] / (-jnω0 ) 代入Cn: Cn = (1/T) [ - ( [e^{jnπ} - 1]/(jnω0 ) ) + ( [e^{-jnπ} -1]/(-jnω0 )) ) ] 因为ω0 T = 2π,所以 ω0 T/2 = π。因此,代入后: Cn = (1/(T jnω0 )) [ - (e^{jnπ} -1 ) + (e^{-jnπ} -1 ) ] 简化: 分子部分: - (e^{jnπ} -1) + (e^{-jnπ} -1 ) = -e^{jnπ} +1 + e^{-jnπ} -1 = e^{-jnπ} - e^{jnπ} = -2j sin(nπ) 因为 e^{jθ} - e^{-jθ} = 2j sinθ,所以这里 e^{-jnπ} - e^{jnπ} = -2j sin(nπ) 因此,Cn = (1/(T jnω0 )) * (-2j sin(nπ)) ) 但sin(nπ)对于整数n来说都是0,所以看起来这里会得到0,这似乎矛盾。这可能是在计算过程中哪里出错了? 或者,可能我的假设方波的表达式不同,导致结果出现问题。或者,这里可能需要重新考虑方波的定义是否正确。 可能我犯了一个错误,因为在之前的三角函数形式中,bn的结果是正确的,但计算指数形式时可能哪里出错了。 或者,另一种方法,利用已知的三角函数形式转换为指数形式。由于三角函数形式中的每一项是 (4/(π n)) sin(nω0 t),其中n为奇数。而sin(nω0 t)可以写成 (e^{jnω0 t} - e^{-jnω0 t})/(2j),所以: f(t) = Σ_{n奇数} (4/(π n)) * (e^{jnω0 t} - e^{-jnω0 t})/(2j ) = Σ_{n奇数} (4/(π n * 2j )) (e^{jnω0 t} - e^{-jnω0 t} ) = Σ_{n奇数} [ 2/(j π n) e^{jnω0 t} - 2/(j π n) e^{-jnω0 t} ] 注意到j = 1/j,所以 1/j = -j,因此: = Σ_{n奇数} [ -2j/(π n) e^{jnω0 t} + 2j/(π n) e^{-jnω0 t} ] 这可以重新索引,将负率的项合并。对于每个正的奇数n,对应的负n为-奇数,因此: 指数形式中的系数为: 对于n=奇数,Cn = -2j/(π n ) 对于n=-奇数,Cn= 2j/(π n ) 但这样看起来,每个正n负n的系数都是虚数,且互为共轭,因为对于n=positive odd,Cn是纯虚数,而C(-n) = -Cn*,因为原函数是实函数。 但此时,幅值谱是|Cn|,即对于每个n为奇数,|Cn|=2/(π |n| )。位谱为对于正n,位是 -π/2(因为系数是 -j乘以正数,即e^{-jπ/2}),而负n的位是 π/2(系数是j乘以正数,即e^{jπ/2})。 所以,指数形式的傅里叶级数为: f(t) = Σ_{n=奇数} [ (-2j/(π n)) e^{jnω0 t} + 2j/(π n) e^{-jnω0 t} ] 或者更简洁地,合并为从负无穷到正无穷的奇数n: f(t) = Σ_{n=-∞}^∞ Cn e^{jnω0 t} 其中,当n为奇数时,Cn= -2j/(π n);否则为0。 不过可能更正确的表达式是: 当n为奇数时, Cn = (2/(j π n)) * (1/(2j)) ) ? 可能需要再仔细推导。 或者,回到之前计算Cn的正确方式: 因为原函数是奇函数,其傅里叶级数的指数形式中的系数可以通过已知的bn得到。根据公式,指数形式中的系数Cn = (an - j bn)/2,但在这里an=0,所以 Cn= -j bn/2。当n为正时,而C(-n)=Cn*,即共轭复数。所以对于n为正奇数: Cn = -j bn /2 = -j (4/(π n )) / 2 = -j 2/(π n ) 而C(-n) = j 2/(π n ) 这样,指数形式可以表示为: f(t) = Σ_{n=odd} [ (-j 2/(π n)) e^{jnω0 t} + j 2/(π n) e^{-jnω0 t} ] 这与之前的结果一致。 接下来,绘制。对于三角函数形式,单边谱显示每个nω0处的幅值为4/(π n ),仅正率,n为奇数。而指数形式的双边谱在±nω0处的幅值为2/(π n ),位为±π/2。 绘制幅谱时,单边谱的振幅是4/(π n ),而双边谱的振幅是2/(π n )在正负n处。位谱方面,单边谱中的每个正弦项的位是0,因为只有正弦项,或者可能位为-π/2,但由于是正弦函数,位为0可能需要更仔细的考虑。对于指数形式,每个正率分量的位是-π/2,负率分量的位是π/2。 在引用[3]中,提到了振幅的计算,比如三角形的宽度高度对应于复数的实部虚部,这可能与绘制谱时如何将复数分解为正弦余弦有关。 关于的绘制步骤: 1. 三角函数形式的幅谱:对于n=1,3,5,…,在率nω0处画线,高度为4/(π n )。 2. 指数形式的双边幅谱:对于n=±1,±3,…,在率nω0处画线,高度为2/(π |n| )。 位谱方面,对于指数形式,每个正奇数的位是-π/2(因为Cn是- j 2/(π n ),即位为 -π/2),而负奇数的位是 π/2。 在引用[2]中提到,平移会影响相频谱,但幅谱不变,所以必须正确计算位。 现在,用户还需要用傅里叶变换来表示,但傅里叶变换通常用于非周期信号,而傅里叶级数适用于周期信号。不过,周期信号的傅里叶变换可以表示为冲激函数的序列,每个冲激位于谐波率处,强度为2π乘以傅里叶级数的系数。例如,周期方波的傅里叶变换是 Σ Cn δ(ω - nω0 ),其中Cn是傅里叶级数的系数。 但用户的问题可能更关注于傅里叶级数的两种形式的绘制,而不是连续傅里叶变换。因此,可能只需要给出傅里叶级数的表达式,并说明如何绘制幅相频。 总结步骤: 1. 确定方波的傅里叶级数的三角函数形式,得到各次谐波的振幅。 2. 转换为指数形式,得到复数系数Cn。 3. 绘制单边或双边,显示各率成分的振幅位。 现在,结合用户提供的引用,例如引用[2]提到幅相频谱的重要性,每个信号需同时用两者描述。引用[4]说明傅里叶级数的分解方式。 在编写回答时,需要按照用户的要,分步骤说明如何展开为两种形式,并绘制。可能还需要提供示例的代码,如MATLAB或Python代码,用于绘制。 例如,在Python中,可以计算前几个谐波的振幅位,然后用matplotlib绘制线谱。 例如,对于幅值为1,周期为T的方波,假设T=2π,则ω0=1。取前5个奇次谐波(n=1,3,5,7,9),计算它们的振幅位,然后绘制幅相频。 代码的大致步骤: 对于三角函数形式: - 率点:nω0,n=1,3,5,... - 振幅:4/(π n ) - 位:正弦函数,位为0,或者根据参考[3],可能位需要根据展开式确定。例如,每个正弦项的位为0,因为是sin函数,没有位移。 对于指数形式: - 对于正负率n,振幅为2/(π |n| ) - 位:正率为-π/2,负率为π/2. 绘制幅谱时,双边谱在±nω0处有谱线,高度为2/(π |n| )。 代码示例: Python中使用matplotlib: ```python import numpy as np import matplotlib.pyplot as plt # 参数设置 T = 2 * np.pi # 周期 omega0 = 2 * np.pi / T # 基波率,这里等于1 n_max = 5 # 取前5个奇次谐波 # 生成谐波次数:1,3,5,7,9 n_values = np.arange(1, 2*(n_max)+1, 2) # 计算三角函数形式的幅值 amplitude_trig = 4 / (np.pi * n_values) # 绘制单边幅谱 plt.figure(figsize=(10, 4)) plt.stem(n_values * omega0, amplitude_trig, basefmt=" ", use_line_collection=True) plt.title('单边幅谱(三角函数形式)') plt.xlabel('率 (rad/s)') plt.ylabel('振幅') plt.grid(True) plt.show() # 指数形式的双边谱 n_bilateral = np.concatenate((-n_values[::-1], n_values)) # 包括负率 amplitude_exp_pos = 2 / (np.pi * np.abs(n_values)) amplitude_exp = np.concatenate((amplitude_exp_pos[::-1], amplitude_exp_pos)) phase_exp = np.concatenate((np.ones(n_max) * np.pi/2, np.ones(n_max) * -np.pi/2)) plt.figure(figsize=(10, 8)) plt.subplot(2,1,1) plt.stem(n_bilateral * omega0, amplitude_exp, basefmt=" ", use_line_collection=True) plt.title('双边幅谱(指数形式)') plt.xlabel('率 (rad/s)') plt.ylabel('振幅') plt.grid(True) plt.subplot(2,1,2) plt.stem(n_bilateral * omega0, phase_exp, basefmt=" ", use_line_collection=True) plt.title('双边相频谱(指数形式)') plt.xlabel('率 (rad/s)') plt.ylabel('位 (rad)') plt.grid(True) plt.tight_layout() plt.show() ``` 这段代码首先生成单边谱,然后双边谱的振幅位。注意,这里假设T=2π,因此ω0=1。用户可以根据实际需要调整T的值。 在回答用户时,需要明确方波的参数,并给出推导过程代码示例,同时引用关的参考文献。例如,引用[4]说明傅里叶级数分解的原理,引用[2]强调幅相频谱的必要性。</think>### 方波的傅里叶级数展开与绘制 #### 1. 方波的傅里叶级数表示 **定义**:幅值为1、周期为$T$的方波函数$f(t)$在区间$[-T/2, T/2]$内定义为: $$ f(t) = \begin{cases} 1 & 0 \leq t < T/2 \\ -1 & -T/2 \leq t < 0 \end{cases} $$ 其周期延拓后为奇函数[^2]。 **三角函数形式**: 由于$f(t)$是奇函数,傅里叶级数仅包含正弦项: $$ f(t) = \frac{4}{\pi} \sum_{k=1}^{\infty} \frac{\sin\big((2k-1)\omega_0 t\big)}{2k-1}, \quad \omega_0 = \frac{2\pi}{T} $$ 其中,$k=1,2,3,\dots$对应奇次谐波分量,振幅为$\frac{4}{\pi(2k-1)}$[^4]。 **指数形式**: 通过欧拉公式转换,复数系数$C_n$为: $$ C_n = \begin{cases} -\frac{2j}{\pi n} & n \text{为奇数} \\ 0 & n \text{为偶数} \end{cases} $$ 展开式为: $$ f(t) = \sum_{n=-\infty}^{\infty} C_n e^{jn\omega_0 t} $$ #### 2. 绘制步骤 1. **单边幅谱(三角函数形式)**: - 率点:$n\omega_0$($n=1,3,5,\dots$) - 振幅:$\frac{4}{\pi n}$ - 位:正弦项位为$0$。 2. **双边谱(指数形式)**: - 率点:$\pm n\omega_0$($n=1,3,5,\dots$) - 振幅:$\frac{2}{\pi |n|}$ - 位:正位为$-\pi/2$,负位为$\pi/2$。 #### 3. Python代码示例 ```python import numpy as np import matplotlib.pyplot as plt # 参数设置 T = 2 * np.pi # 方波周期 omega0 = 2 * np.pi / T # 基 n_max = 5 # 最大谐波次数(奇次) # 三角函数形式:单边谱 n_values = np.arange(1, 2*n_max, 2) # 1,3,5,7,9 amplitudes = 4 / (np.pi * n_values) plt.figure(figsize=(10,4)) plt.stem(n_values*omega0, amplitudes, linefmt='b-', markerfmt='bo', basefmt=" ") plt.title("单边幅谱(三角函数形式)") plt.xlabel("率 (rad/s)") plt.ylabel("振幅") plt.grid(True) plt.show() # 指数形式:双边谱 n_bilateral = np.concatenate((-n_values[::-1], n_values)) # -9,-7,...,7,9 amplitude_bilateral = 2 / (np.pi * np.abs(n_bilateral)) phase_bilateral = np.where(n_bilateral > 0, -np.pi/2, np.pi/2) plt.figure(figsize=(10,8)) plt.subplot(2,1,1) plt.stem(n_bilateral*omega0, amplitude_bilateral, linefmt='r-', markerfmt='ro', basefmt=" ") plt.title("双边幅谱(指数形式)") plt.xlabel("率 (rad/s)") plt.ylabel("振幅") plt.subplot(2,1,2) plt.stem(n_bilateral*omega0, phase_bilateral, linefmt='g-', markerfmt='go', basefmt=" ") plt.title("双边相频谱(指数形式)") plt.xlabel("率 (rad/s)") plt.ylabel("位 (rad)") plt.tight_layout() plt.show() ``` #### 4. 结果分析 - **单边谱**:仅包含正率分量,振幅随谐波次数增加而衰减(见1)。 - **双边谱**:对称分布于正负率轴,幅值减半,反(见2)。平移操作会改变相频谱,但幅谱保持不变。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个码农都是奢望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值