FDM(傅里叶分解)

news2025/1/18 6:13:09

代码的使用教程

傅里叶分解(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.coloradmin.cn/o/1224982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】基本指令

Linux现在已经是绕不开的操作系统&#xff0c;其开源导致的稳定性&#xff0c;安全性等方面遥遥领先。今天我们开始学习Linux操作系统的基本指令 ls 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于…

极光笔记 | EngageLab Push的多数据中心接入指南

01背景 作为一个面向全球的消息推送服务平台&#xff0c;我们一直致力于给全球用户提供安全、可靠、高效的消息推送服务&#xff0c;因此我们意识到在不同洲建立数据中心的重要性。这样做将有助于提高我们的服务可用性、降低延迟并保护用户数据的安全性。 第一&#xff0c;通过…

Kubernetes1.28.X 集群安装

1、环境准备 准备2台虚拟机&#xff0c;安装集群一律使用内网ip通信&#xff0c;相关配置文件一律配置内网ip。 ip别名用途192.168.0.193kubernetes-master.openlab.cn主节点&#xff0c;harbor仓库192.168.0.194kubernetes-work.openlab.cnwork节点 hostnamectl set-hostna…

git diff相关命令

git diff相关命令 git diff git diff此命令比较的是工作目录中当前文件和暂存区中的文件差异&#xff0c;也就是修改之后还没有暂存起来的变化内容。因为后续要将工作目录中的文件添加到暂存区。 示例&#xff1a; 当前工作目录下有一个2.txt的文件&#xff0c;文件的内容是…

Vue 路由缓存 防止路由切换数据丢失 路由的生命周期

在切换路由的时候&#xff0c;如果写好了一丢数据在去切换路由在回到写好的数据的路由去将会丢失&#xff0c;这时可以使用路由缓存技术进行保存&#xff0c;这样两个界面来回换数据也不会丢失 在 < router-view >展示的内容都不会被销毁&#xff0c;路由来回切换数据也…

《轻购优品》新零售玩法:消费积分认购+众筹新玩法

《轻购优品》新零售玩法&#xff1a;消费积分认购众筹新玩法 引言&#xff1a;2023年开年已来&#xff0c;政府的工作报告提出“把恢复和扩大消费摆在优先位置”&#xff0c;并且把2023年定位为“消费提振年”&#xff0c;以“全年乐享全年盛惠”为主题多地政府共同发力&#x…

LLM大模型4位量化实战【GPTQ】

权重量化方面的最新进展使我们能够在消费类硬件上运行大量大型语言模型&#xff0c;例如 RTX 3090 GPU 上的 LLaMA-30B 模型。 这要归功于性能下降最小的新型 4 位量化技术&#xff0c;例如 GPTQ、GGML 和 NF4。 在上一篇文章中&#xff0c;我们介绍了简单的 8 位量化技术和出…

2020年06月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 如下图所示脚本运行的结果是()? A:画一条直线 B:画一个三角形 C:画一个圆形 D:画一条虚线 答案:D 第2题 运行如下图所示脚本,下面选项中说法错误的是? A:“笔的颜色”…

计算机网络秋招面试题

自己在秋招过程中遇到的计算机网络的面试题 OSI七层网络模型 DNS&#xff1a;应用层协议 根据域名查IP地址 DNS查询⽅式有哪些&#xff1f; 递归解析 局部DNS服务器⾃⼰负责向其他DNS服务器进⾏查询&#xff0c;⼀般是先向该域名的根域服务器查询&#xff0c;再由根域名服…

C++之map容器

C之map容器 map构造和赋值 #include<iostream> #include<string> using namespace std; #include<map>void printMap(map<int,int>&m) {for (map<int,int>::iterator it m.begin();it ! m.end();it){//cout <<"key is: "&l…

macbook ntfs能读不能复制 c盘ntfs拒绝访问怎么解决

如果你是一位Mac用户&#xff0c;你可能会遇到这样的问题&#xff1a;你的Mac能够读取NTFS格式的移动硬盘或U盘&#xff0c;但是不能往里面复制或者修改文件。或者&#xff0c;你的Windows电脑出现了C盘NTFS拒绝访问的错误&#xff0c;导致你无法正常使用系统。这些问题都是由于…

Spring 设计模式-简洁版

Java 中包括以下设计模式&#xff1a; 其中Spring 用到的设计模式 1.简单工厂-BeanFactory 2.工厂方法FactoryBean 3.单例模式Bean实例 4.适配器模式SpringMVC中的HandlerAdatper 5.装饰器模式BeanWrapper 6.代理模式_AOP底层 7.观察者模式-spring的事件监听 8.策略横式exclud…

Unity在Windows选项下没有Auto Streaming

Unity在Windows选项下没有Auto Streaming Unity Auto Streaming插件按网上说的不太好使最终解决方案 Unity Auto Streaming插件 我用的版本是个人版免费版&#xff0c;版本号是&#xff1a;2021.2.5f1c1&#xff0c;我的里边Windows下看不到Auto Streaming选项,就像下边这张图…

Clickhouse初认识

技术主题-clickhouse 一什么是clickHouse 1&#xff09;本质上就是一款数据库管理系统&#xff0c;能提供海量数据的存储和检索 2&#xff09;基于列存储&#xff0c;数据是按照列进行存储的&#xff08;数据格式一样&#xff0c;方便进行压缩&#xff09; 3&#xff09;具备…

数据结构-插入排序+希尔排序+选择排序

目录 1.插入排序 插入排序的时间复杂度&#xff1a; 2.希尔排序 希尔排序的时间复杂度&#xff1a; 3.选择排序 选择排序的时间复杂度&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的…

Gem5模拟器学习之旅——翻译自官网

文章目录 安装并使用gem5 模拟器支持的操作系统和环境依赖在 Ubuntu 22.04 启动(gem5 > v21.1)Docker获取代码用 SCons 构建用法首次构建 gem5gem5 二进制类型调试opt快速 常见错误错误的 gcc 版本Python 位于非默认位置未安装 M4 宏处理器Protobuf 3.12.3 问题 安装并使用g…

Pandas中loc和iloc函数(提取某几列或者行的数据)

loc函数&#xff1a;通过行索引&#xff08;列名、行名&#xff09; 中的具体值来取行数据&#xff08;如取"Index"为"A"的行&#xff09; iloc函数&#xff1a;通过行号&#xff08;数字&#xff09;来取行数据&#xff08;如取第二行的数据&#xff09;…

JAVA刷题之字符串的一些个人思路

感谢您的阅读&#xff01; ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯…

【Spring总结】基于配置的方式来写Spring

本篇文章是对这两天所学的内容做一个总结&#xff0c;涵盖我这两天写的所有笔记&#xff1a; 【Spring】 Spring中的IoC&#xff08;控制反转&#xff09;【Spring】Spring中的DI&#xff08;依赖注入&#xff09;Dependence Import【Spring】bean的基础配置【Spring】bean的实…

计算机msvcr120.dll丢失的解决方法,分享多种亲测可靠的方法

在使用计算机的过程中&#xff0c;我们有时可能会遇到一些技术问题&#xff0c;其中之一就是提示丢失msvcr120.dll文件。当计算机提示丢失msvcr120.dll文件时&#xff0c;可能是由于某些程序无法找到这个文件&#xff0c;从而导致程序无法正常运行。那么我们需要如何解决修复好…