• 使用MATLAB进行傅里叶变换


    1、定义

    1. T=1;% 周期0-1
    2. N=20;% 最大谐波
    3. k=-N:N;% -20:20——-20表示a_(20)e^(j*20*w0*t)
    4. N1=length(k);%N1=41
    5. % ceil(N1/2)=21%即21是N1的中位数
    6. t=linspace(0,T,100);
    7. Nt=length(t);
    8. tt=linspace(-4*T,4*T,1024);
    9. Ntt=length(tt);

    2、原函数

    1. w0=2*pi/T;
    2. % 0-T
    3. xt=(t>=T/4).* 1.0;
    4. fig10=figure(10);
    5. fig10.Name='原函数';
    6. plot(t,xt);
    7. axis([t(1) t(Nt) min(xt)-0.05 max(xt)+0.05 ]);

    3、原函数的周期延拓

    1. N2=length(tt);
    2. xx=zeros(1,N2);%size(a)=1*41,用于记录傅里叶级数的系数
    3. for n=1:N2
    4. for numT=-4:3
    5. if (T/4+numT*T)
    6. xx(n)=1;
    7. break
    8. end
    9. end
    10. end
    11. fig20=figure(20);
    12. fig20.Name='原函数的周期延拓';
    13. plot(tt,xx);
    14. axis([tt(1) tt(Ntt) min(xx)-0.05 max(xx)+0.05 ]);
    15. grid on

     

    4、使用integral进行傅里叶变换

    1. a=zeros(1,N1);%size(a)=1*41,用于记录傅里叶级数的系数
    2. for n=1:N1
    3. % a(n)=integral(@(x) signal0(x,k(n),T),0,T); %1
    4. a(n)=integral(@(x) signal0(x,k(n),T),0,T,'RelTol',0,'AbsTol',1e-12);
    5. % %解决《警告: 最小步长已快达到 x = 0.25。可能具有奇异性,或者容差可能对于此问题太小。 》
    6. % RelTol - 相对误差容限
    7. % AbsTol - 绝对误差容限
    8. end
    9. A=abs(a); %计算傅里叶变换的幅值
    10. fig30=figure(30);
    11. fig30.Name='傅里叶分解图';
    12. subplot(3,1,1);stem(k,A);ylabel("a(k)幅值");
    13. axis([k(1) k(N1) min(A)-0.05 max(A)+0.05]);% axis([ x起点 x终点 y起点 y终点]);
    14. subplot(3,1,2); stem(k,real(a));ylabel('a(k)实部'); % real(F)
    15. axis([k(1) k(N1) min(real(a))-0.05 max(real(a))+0.05 ]);
    16. subplot(3,1,3);stem(k,imag(a));ylabel('a(k)虚部'); % imag(F)
    17. xlabel('k');
    18. axis([k(1) k(N1) min(imag(a))-0.05 max(imag(a))+0.05 ]);

    5、谐波分量

    1. %基波分量
    2. fundamental_component=a(ceil(N1/2))*exp(1i*0*w0*tt);
    3. %一次谐波分量
    4. % first_harmonic_component=a(ceil(N1/2)-1)*exp(-1i*1*w0*tt)+a(ceil(N1/2)+1)*exp(1i*1*w0*tt);
    5. har=1;
    6. first_harmonic_component=a(ceil(N1/2)-har)*exp(-1i*har*w0*tt)+a(ceil(N1/2)+har)*exp(1i*har*w0*tt);
    7. %二次谐波分量
    8. % second_harmonic_component=a(ceil(N/2)-2)*exp(-1i*2*w0*tt)+a(ceil(N/2)+2)*exp(1i*2*w0*tt);
    9. har=2;
    10. second_harmonic_component=a(ceil(N1/2)-har)*exp(-1i*har*w0*tt)+a(ceil(N1/2)+har)*exp(1i*har*w0*tt);
    11. %三次谐波分量
    12. har=3;
    13. third_harmonic_component=a(ceil(N1/2)-har)*exp(-1i*har*w0*tt)+a(ceil(N1/2)+har)*exp(1i*har*w0*tt);
    14. fig40=figure(40);
    15. fig40.Name='傅里叶分解图';
    16. subplot(3,1,1);
    17. plot(tt,fundamental_component);
    18. ylabel('基波分量');
    19. subplot(3,1,2);
    20. plot(tt,fundamental_component+first_harmonic_component+second_harmonic_component);
    21. ylabel(sprintf('%d%s',2,'次谐波分量合成图'));
    22. subplot(3,1,3);
    23. plot(tt,fundamental_component+first_harmonic_component+second_harmonic_component+third_harmonic_component)
    24. ylabel(sprintf('%d%s',3,'次谐波分量合成图'));

    6、任意次谐波的傅里叶级数合成

    1. xiebo=8;% 计算前xiebo次谐波分量的和
    2. % tt=linspace(-4*T,4*T,1024);
    3. fx=a(ceil(N1/2))*exp(1i*0*w0*tt);
    4. for n=1:xiebo
    5. fx=fx+a(ceil(N1/2)-n)*exp(-1i*n*w0*tt)+a(ceil(N1/2)+n)*exp(1i*n*w0*tt);
    6. % n=1——第20次谐波分量
    7. % a(1)*exp(1i*(1-20-1)*w0*tt)=a(1)*exp(1i*(-20)*w0*tt)
    8. % n=N1=41——第20次谐波分量
    9. % a(41)*exp(1i*(41-20-1)*w0*tt)=a(41)*exp(1i*(20)*w0*tt)
    10. end
    11. fig41=figure(41);
    12. fig41.Name=sprintf('%d%s',xiebo,'次谐波分量合成图');
    13. % f3=figure('Name','傅里叶合成图','IntegerHandle','on','Number',100)
    14. plot(tt,fx)
    15. grid on

    7、20次谐波的傅里叶级数合成

    1. % tt=linspace(-4*T,4*T,1024);
    2. fx=0;
    3. for n=1:N1
    4. fx=fx+a(n)*exp(1i*(n-N-1)*w0*tt);
    5. % n=1——第20次谐波分量
    6. % a(1)*exp(1i*(1-20-1)*w0*tt)=a(1)*exp(1i*(-20)*w0*tt)
    7. % n=N1=41——第20次谐波分量
    8. % a(41)*exp(1i*(41-20-1)*w0*tt)=a(41)*exp(1i*(20)*w0*tt)
    9. end
    10. fig42=figure(42);
    11. fig42.Name='傅里叶合成图';
    12. % f3=figure('Name','傅里叶合成图','IntegerHandle','on','Number',100)
    13. plot(tt,fx)
    14. grid on

    8、局部函数——signal0

    1. %程序signal0.m:定义求傅里叶级数的系数的被积函数: y=(1/T)*x(t).*exp(-j*(2*pi/T)*k*t)
    2. function y=signal0(t,k,T) %T为信号周期,t为时间变量,kk次谐波
    3. x=(t>=T/4).* 1.0;
    4. % 定义占空比为25%的非对称周期方波for one period=T
    5. % 对称周期三角形可定义:x=(abs(t)<=T/4). * (1-abs(t))
    6. % 占空比为50%的对称周期方波可定义:x=(abs(t)<=T/4). *1.0
    7. y=(1/T).*x.*exp(-1i*k*(2*pi/T)*t);
    8. end

    傅里叶分析和滤波- MATLAB & Simulink- MathWorks 中国

  • 相关阅读:
    【CAN】CAN基础概念3
    Raymarching(光线步进)基础
    国产8K摄像机记录中国航展的飞速发展
    API低代码平台介绍4-数据库记录插入功能
    python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例
    Java学习 --- 面向对象三大特征之封装
    BIO/NIO学习
    go的反射和断言
    PMP每日一练 | 考试不迷路-11.07(包含敏捷+多选)
    程序员实现财务自由的5个方法
  • 原文地址:https://blog.csdn.net/qq_35629563/article/details/133655241