周期方波信号的级数分解

根据傅里叶级数的定义我们知道:

对于任意一个周期为的周期信号,都可以求出它在三角函数集中各函数中的分量,从而可将在区间内表示为三角函数集中各函数的加权和。即:


其中:




借助Matlab编写M文件,以方波信号为例,选取不同的级数项数进行合成,观察与原方波的逼近情况。

源码如下:

%该m文件用于绘制方波信号及其傅立叶级数谐波叠加
clc;clear;close all;
syms x;		 %定义符号变量x,用于求解an、bn
A = input('请输入方波信号的幅度:');
T = input('请输入方波信号的周期:');
PW = input('请输入方波信号的脉宽:');
c = input('请问您要显示几个周期的方波:');
m = input('请问您需要几次谐波叠加:');
index = 1;		 %定义方波信号下标
sw = ones(1,c*T*100+1);		 %预定义方波信号,可提高Matlab运行速率
for  N = -c/2:c/2-1		 %遍历c个周期
%绘图过程中舍弃重复部分
     if  N==-c/2
         i = 0;
     else
         i = 0.01;
     end
%一个周期内判断何时为幅度为A,何时为0
     for  t = N*T+i:0.01:(T+N*T)
         if((t>=(T-PW)/2 + N*T)&&(t<=((T+PW)/2 + N*T)))
             sw(index) = A;
             index = index + 1;
         else
             sw(index) = 0;
             index = index + 1;
         end
     end
 end
t = -c*T/2:0.01:c*T/2;
plot(t,sw,'LineWidth',2);		 %绘制方波信号
xlabel('t');ylabel('幅度');title(['方波信号及其傅立叶级数' num2str(m) '次谐波叠加']);
hold on;
%以下为傅立叶级数展开部分
w = 2*pi/T;
%预定义an、bn
an = ones(1,m);
bn = ones(1,m);
sum = 0;
a0 = 2/T*A*PW;
for  n = 1:m
%根据周期的奇偶选择积分区间
    if (mod(c,2)==1)        
        an(n) = 2/T*double(int(A*cos(n*w*x),-PW/2,PW/2));
        bn(n) = 2/T*double(int(A*sin(n*w*x),PW/2,PW/2));
    else
        an(n) = 2/T*double(int(A*cos(n*w*x),(T-PW)/2,(T+PW)/2));
        bn(n) = 2/T*double(int(A*sin(n*w*x),(T-PW)/2,(T+PW)/2));
    end
    ft = a0/2 + an(n)*cos(n*w*t) + bn(n)*sin(n*w*t);
    %避免重复添加a0
    if  n==1
        sum = sum + ft;
    else
        sum = sum + ft - a0/2;
    end
end
plot(t,sum,'r','LineWidth',2);      %绘制m次谐波叠加后图像
legend('方波信号',[num2str(m) '次谐波叠加']);

在命令窗口输入对应参数:幅度5,周期4,脉宽2,显示5个周期方波,3次谐波叠加。运行该M文件得结果如下:


将叠加次数换为9次,得如下结果:


再将叠加次数换为15次,得如下结果:


对比以上三幅图,可以得到以下结论:

周期信号(本实验中为方波信号)选取有限次傅里叶级数进行叠加。当选取的项数越多,在所合成的波形中出现的峰起越靠近原信号的不连续点。当选取的项数很大时,该峰起值趋于一个常数,大约等于总跳变值的9%(吉布斯效应)。


### 绘制周期方波信号的幅度谱 绘制周期方波信号的幅度谱可以通过傅里叶级数展开实现,因为周期信号可以通过傅里叶级数分解为一系列正弦和余弦分量。以下分别介绍如何使用Python和MATLAB完成这一任务。 #### 使用Python绘制周期方波信号的幅度谱 在Python中,可以使用`numpy`生成方波信号,并利用`scipy.fftpack`模块计算其傅里叶变换,最后通过`matplotlib`绘制幅度谱[^3]。 ```python import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft # 参数设置 T = 1.0 # 周期 fs = 1000 # 采样频率 t = np.linspace(0, T, int(fs * T), endpoint=False) # 时间轴 f_square = np.where((t * fs) % 2 < 1, 1, -1) # 方波信号 # 计算傅里叶变换 N = len(f_square) F = fft(f_square) / N # 归一化 freqs = np.fft.fftfreq(N, d=1/fs) # 频率轴 # 幅度谱 magnitude_spectrum = np.abs(F) # 绘制结果 plt.figure(figsize=(10, 6)) plt.plot(freqs[:N//2], magnitude_spectrum[:N//2], label="幅度谱") plt.title("周期方波信号的幅度谱") plt.xlabel("频率 (Hz)") plt.ylabel("幅度") plt.grid(True) plt.legend() plt.show() ``` 上述代码首先生成一个周期方波信号,然后通过快速傅里叶变换(FFT)计算其频域表示,最后绘制出幅度谱[^3]。 #### 使用MATLAB绘制周期方波信号的幅度谱 在MATLAB中,可以使用内置函数`square`生成方波信号,并结合`fft`函数计算其傅里叶变换,从而得到幅度谱[^4]。 ```matlab % 参数设置 T = 1; % 周期 fs = 1000; % 采样频率 t = 0:1/fs:T-1/fs; % 时间轴 f_square = square(2*pi*fs*t); % 方波信号 % 计算傅里叶变换 N = length(f_square); F = fft(f_square)/N; % 归一化 freqs = (0:N-1)*(fs/N); % 频率轴 % 幅度谱 magnitude_spectrum = abs(F); % 绘制结果 figure; plot(freqs(1:N/2), magnitude_spectrum(1:N/2), 'b', 'LineWidth', 1.5); title('周期方波信号的幅度谱'); xlabel('频率 (Hz)'); ylabel('幅度'); grid on; ``` 这段MATLAB代码同样生成一个周期方波信号,并通过FFT计算其频域表示,最终绘制出幅度谱[^4]。 ### 注意事项 - 在实际应用中,为了减少频谱泄漏,可以对方波信号进行适当的窗口处理。 - 幅度谱的绘制仅显示正频率部分,因为对于实信号,负频率部分是对称的。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值