听门外雪花风@ 2021-05-23 20:37 采纳率: 83.3%
浏览 1313
已采纳

利用MATLAB求函数的傅里叶变换

绘制周期T1=1,幅度Vpp=1的对称方波的前十项傅里叶级数的系数(三角函数形式),并分别用前三项、前五项和前十项恢复原信号,时域采样点数N=1000,所有图中时间坐标从-0.5到0.5。

跪求一段代码

  • 写回答

1条回答 默认 最新

  • CSDN专家-Matlab_Fans 2021-05-23 21:27
    关注

    思路:

    先用fourier函数求傅里叶级数,得到傅里叶级数解析表达式,再取不同的频率w值,根据傅里叶级数求得不同频率的幅值和相位,将不同w的信号加和得到不同项数恢复的时域信号。

    代码:

    %% 傅里叶级数求解
    syms a b t
    f = rectangularPulse(a,b,t)-0.5;   % 矩形信号
    f_FT = fourier(f);                 % 矩形信号傅里叶变换表达式
    
    %% 时域信号
    a = -0.25;
    b = 0.25;
    t = linspace(-0.5,0.5,1000);   % 时间
    y = subs( f );                 % 时域信号 
    
    %% 前3项恢复
    w1 = 2*pi*[1  3 5 ];                % 频率
    w =w1;
    Aw1 = 2*abs( double(subs(f_FT)) );    % 幅值
    Pw1 = angle( double(subs(f_FT)) );  % 相位 
    y1 = 0;
    for  ii = 1:length(w1)
        y1 = y1 + Aw1(ii) .* cos( w1(ii).*t + Pw1(ii) );
    end
    
    %% 前5项恢复
    w2 = 2*pi*[1 3 5 7 9];              % 频率
    w =w2;
    Aw2 = 2*abs( double(subs(f_FT)) );    % 幅值
    Pw2 = angle( double(subs(f_FT)) );  % 相位 
    y2 = 0;
    for  ii = 1:length(w2)
        y2 = y2 + Aw2(ii) .* cos( w2(ii).*t + Pw2(ii) );
    end
    
    %% 前10项恢复
    w3 = 2*pi*[1 3 5 7 9 11 13 15 17 19];                  % 频率
    w =w3;
    Aw3 = 2*abs( double(subs(f_FT)) );    % 幅值
    Pw3 = angle( double(subs(f_FT)) );  % 相位 
    y3 = 0;
    for  ii = 1:length(w3)
        y3 = y3 + Aw3(ii) .* cos( w3(ii).*t + Pw3(ii) );
    end
    
    
    figure
    plot(t,y,t,y1,t,y2,t,y3)
    xlabel('时间/s')
    ylabel('输出')
    legend('原始信号','前3项','前5项','前10项')

    结果:

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵