当前位置: 首页 > article >正文

FDM(傅里叶分解)

代码的使用教程

傅里叶分解(FDM)

代码原理

FDM (Frequency Division Multiplexing)是一种调制技术,将信号分成多个不同的频带进行传输,从而实现多路复用的通信方式。FDM分解原理是将不同频率的信号分解成不同的频带(子载波),通过多个子载波同时向传输介质发送数据,每个子载波都被分配一个频段,相互之间不会干扰,同时利用传输介质的带宽效率比较高。

在FDM系统中,将不同的信号加入到载波波形上,所有的载波频率都在相同的信道中传输。因此,可以通过分离载波的频率来恢复每个源信号。对于输入信号x(t),通过余弦函数调制,可以得到载波信号c(t)。然后,在每一个分频带的频率上加入载波脉冲,从而产生多路信号。

在接收端,使用一个特殊的滤波器,将所需的频段选择出来,其中包括每个子载波的频段。然后,去除其他频率分量并恢复原始信号。因此,FDM系统是一种多路复用的技术,它使得多个信号能够在同一时间内共享一个通信介质。

代码效果图

部分代码和相关解释

function [xt_recov_IMFsLowToHigh,xt_recov_IMFsHighToLow] = FDM_Low2High_High2LowS(xt,Fs)
    global PS_PhaseUnwrap;
    global CentralDiff;
    CentralDiff=1; % central finite difference, e.g. for delta function
    PS_PhaseUnwrap=0;
    threshold=-0*(10)^(-1); % idealy should be zero.
    L=length(xt);
    if 1 % adding zero at last, can create discontinuity in signal. e.g. org emd example
        if rem(L,2) == 1 % odd
                L=L+1; % make it even for faster FFT
                %xt=[xt 0]; %  can create discontinuity
                xt=[xt xt(end)]; % repeat last data
        end
    end
    NFFT=L;
    N=(NFFT);
    Xk=fft(xt,NFFT)/L;     
    % k=1, Xk, is real, (2 to N/2) are complex, (N/2+1) is real, (N/2+2 to N) are complex conjugate of (N/2 to 2)    
    nTotalHormonics=N/2;
    
    %if 1 % this is much better, seen by examples 1.
        %%
        xt_recov_IMFsLowToHigh=zeros(1,N)';
        IFOfSignalIF=zeros(1,N)'; 
        xt_AnalyticFIBF=zeros(1,N)';
        xt_recov_IMFsLowToHigh(:,1)=(ones(1,N))*Xk(1); % first IMF DC
        init=2;
        p=2;     
        while(init<=N/2)            
            [kk, xt_recov_FIBF, xt_recov_AnalyticFIBF, IFOfSignal]=getIMFsScanAllLowToHigh(Xk,Fs,init,nTotalHormonics,threshold);
            %% 
            init=kk+1;
            xt_recov_IMFsLowToHigh(:,p)=xt_recov_FIBF;
            IFOfSignalIF(:,p-1)=IFOfSignal;
            xt_AnalyticFIBF(:,p-1)=xt_recov_AnalyticFIBF;            
            p=p+1;  
        end
         
        %subplot(2,1,1)
        % sp_PlotTF(xt_AnalyticFIBF,IFOfSignalIF,t,Fs,Fs/2);
        
        % title('FDM: Time-Frequncy-Energy estimate of FIBFs (LTH-FS)','FontSize',16,'FontName','Times');
        nn=(1:N);
        tttmp=Xk((N/2)+1).*cos(pi*(nn-1)); % N/2+1 part of FFT, last part of DFT
        xt_recov_IMFsLowToHigh(:,end+1)=tttmp'; % N/2+1 part of FFT, last part of DFT
    %end   
    
    
    %if 1 % this is much better, seen by examples 1 and 3.
        xt_recov_IMFsHighToLow=zeros(1,N)'; 
        IFOfSignalIF=zeros(1,N)'; 
        xt_AnalyticFIBF=zeros(1,N)';
        mm=1;        
        %tttmp=Xk((N/2)+1).*cos(pi*(1:N-1));
        xt_recov_IMFsHighToLow(:,mm)=tttmp'; % N/2+1 part of FFT, last part of DFT        
        final=N/2;        
        while(final>=2)
            mm=mm+1; 
            
            [kk, xt_recov_FIBF, xt_recov_AnalyticFIBF, IFOfSignal]=getIMFsScanAllHighToLow(Xk,Fs,final,threshold);
            %% 
            final=kk-1;
            xt_recov_IMFsHighToLow(:,mm)=xt_recov_FIBF;
            xt_AnalyticFIBF(:,mm-1)=xt_recov_AnalyticFIBF;
            IFOfSignalIF(:,mm-1)=IFOfSignal;            
        end
        %subplot(2,1,2)
        %figure 
        % sp_PlotTF(xt_AnalyticFIBF,IFOfSignalIF,t,Fs,Fs/2);   
        % title('FDM: Time-Frequncy-Energy estimate of FIBFs (HTL-FS)','FontSize',16,'FontName','Times');        
        %% residue
        xt_recov_IMFsHighToLow(:,mm+1)=(ones(1,N))*Xk(1); % first IMF DC        
    %end  
这段代码是一个实现低频到高频和高频到低频的FDM(Frequency Division Multiplexing)信号分解的函数。函数接受输入信号 xt 和采样频率 Fs,并返回分解后的低频到高频和高频到低频的信号。
函数中的变量 xt_recov_IMFsLowToHigh 和 xt_recov_IMFsHighToLow 分别用于保存低频到高频和高频到低频的信号。函数首先对输入信号进行FFT变换,得到频率域的表示 Xk。然后通过调用 getIMFsScanAllLowToHigh 函数,从低频到高频逐步分解信号,得到对应的IMFs(Intrinsic Mode Functions)和IFs(Instantaneous Frequencies),并将它们保存在 xt_recov_IMFsLowToHigh 中。
该函数使用了一些全局变量 PS_PhaseUnwrap 和 CentralDiff,它们可能在其他地方被定义和使用。
最后,函数返回分解后的低频到高频和高频到低频的信号 xt_recov_IMFsLowToHigh 和 xt_recov_IMFsHighToLow。   

代码链接:阿里云盘分享 (aliyundrive.com)

获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复FDM

本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。


http://www.kler.cn/a/132643.html

相关文章:

  • ChromeDriver驱动下载地址更新(保持最新最全)
  • django——创建 Django 项目和 APP
  • 游戏引擎学习第16天
  • 微信小程序-prettier 格式化
  • 开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据
  • SpringBoot源码解析(四):解析应用参数args
  • 电子眼与无人机在城市安防中的协同应用研究
  • 单区域OSPF配置
  • oracle:让is null使用索引
  • 调整Windows键盘上只能看到拼音而无法看到实际的文本以及关闭输入法悬浮窗方法
  • [深度学习]卷积神经网络的概念,入门构建(代码实例)
  • M2 Mac Xcode编译报错 ‘***.framework/‘ for architecture arm64
  • IPv4数据报格式
  • 我认为除了HelloWorld之外,Python的三大数据转换实例可以作为开始学习Python的入门语言。
  • jenkins 使用原生 git clone 命令,指定ssh密钥文件
  • C++之set/multise容器
  • Linux 无名管道实现文件复制
  • 阿里面试面试题
  • 【P1010 [NOIP1998 普及组] 幂次方】
  • C#匿名方法介绍Action、Func、柯里化Currying
  • 1234234234
  • PostgreSQL按月计算每天值的累加
  • Java之线程的概念及方法的学习
  • JVM实战-JVM之类加载时机
  • C++构造函数 拷贝构造函数 括号法显示法隐式转换法实现类
  • openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库