民用航空导航信号的干扰浅析
【摘要】现代的民用机场有着飞行流量大以及航班密度高的特征,机场、无线电设备、导航台站、非无线电设备之间都会产生干扰,外来电磁信号对于民用航空系统的影响是极大的,为此,需要做好台站以及内部导航频率的检查工作,在电子设备的发展之下,这些干扰也越来越大,本文主要分析民用航空导航信号的干扰因素以及抗干扰措施。
【关键词】通信工程论文发表,民用航空导航信号,干扰因素,对策
在我国通信事业以及无线电技术的发展下,电磁环境变得越来越复杂,无线电干扰情况也越来越严重,这不仅对于无线电通信产生一定的影响,也严重影响了民航通信导航频率,做好民用航空导航信号的干扰工作十分的重要。
一、民航系统导航系统干扰分析
现代的民用机场有着飞行流量大以及航班密度高的特征,机场、无线电设备、导航台站、非无线电设备之间都会产生干扰,这也会在一定程度上影响导航台站的工作,严重的影响到飞行安全。
在电子设备的发展之下,这些干扰也越来越大,数据统计显示,对于民航系统干扰最大的为非航空干扰源,这主要包括以下几种类型:
第一,无线电通信设备,包括微波通信设备、短波电台、VHF超短波电台;
第二,用于监视飞机飞行状态的雷达;
第三,引导飞机降落和起飞的导航设备;
第三,用于记录雷达数据与数字记录的计算机管理系统;
第四,用于播放电视节目和航班信息的闭路电视系统;
以上设备多放置在一个机房之中,这就导致机房变成一个电磁辐射系统,若没有处理好其中的电磁兼容问题,就会影响系统的运行,情况严重时,甚至会威胁到飞机的飞行安全。
此外,通信导航站台与机场在运行过程中都有电磁辐射,这种电磁辐射是无法完全消除的,如果没有处理好设备兼容问题,都会在一定程度上影响导航系统的正常运行,为了消除这种干扰问题,需要从台站管理、设备布局、机房建设等角度进行分析,采取科学的应对措施,消除各种干扰,保障飞机的飞行安全。
二、减少民用航空导航信号的干扰措施
2.1 做好电磁环境的测试以及设备检测工作
一些没有经过相关部门审批的广播电台,其设备指标一般与国家标准不符合,而这些广播电台需要在大功率发射状态下进行工作,如果不开展设备检测工作就很容易出现干扰,为了避免该种问题的产生,需要做好电磁环境的测试以及设备检测工作。
在未来阶段下,无电线管理机构需要定期对广播电台进行检查,如果存在安全隐患要早发现、早处理,为了保障这项工作的顺利进行,需要制定出相应的设备年检制度,对广播发射机的天馈系统、频率、杂散、功率等指标进行分析,保障设备能够按照相关的参数进行工作。
2.2 治理内部环境
民航系统中内部干扰问题严重,管理部门必须要意识到这一问题的严重性,采取科学的`措施减少系统内部干扰,这不仅需要加强外部电磁环境的治理工作,还要对内部进行整顿。这可以采用如下的措施:
第一,合理使用通信导航站与机场设备
为了最大限度的消除干扰,需要对通信导航站以及机场的相关设备进行科学合理的布局,对于同一工作频率的天线和设备需要拉开距离,保障天线的隔离度。对于大功率的接收设备以及发射设备需要分开进行放置,避免将通信设备设置在有电磁辐射的房间中,在对机房进行布局时,需要深刻的分析电磁辐射情况,在必要的情况下,可以由上级部门开展检测工作,对于部分杂散设备,需要采取科学的屏蔽措施。
第二,做好台站、机房内部电磁环境的控制
一般情况下,台站、机房内部设备主要采用分批配置的方式,在这些设备安全与使用时,常常存在着一定的影响,一般情况下,如果不是出现特别严重的干扰,是不会对机房进行电磁检测的。此外,设备中的电磁干扰有着偶然性与随机性的特征,发生机理复杂,为了避免电磁环境影响飞机的正常飞行,需要做好台站、机房内部电磁环境的控制工作,及时消除其中的安全隐患。在新增台站时,也需要加强测试,避免新增设备影响飞机的正常飞行。
三、结束语
总而言之,外来电磁信号对于民用航空系统的影响是极大的,为此,需要做好台站以及内部导航频率的检查工作,这不仅是保障民航安全的重要措施,对于保障人民生命财产的安全也大有裨益。为此,需要注意净化各个频段的电磁环境,处理好电磁兼容问题,制定出完善的管理制度,加强对相关人员的培训与教育,将安全隐患扼杀在摇篮中,保障飞行安全。
论文: Characterizing signal propagation to close the performance gap in unnormalized ResNets
BatchNorm是深度学习中核心计算组件,大部分的SOTA图像模型都使用它,主要有以下几个优点:
然而,尽管BatchNorm很好,但还是有以下缺点:
目前,很多研究开始寻找替代BatchNorm的归一化层,但这些替代层要么表现不行,要么会带来新的问题,比如增加推理的计算消耗。而另外一些研究则尝试去掉归一化层,比如初始化残差分支的权值,使其输出为零,保证训练初期大部分的信息通过skip path进行传递。虽然能够训练很深的网络,但使用简单的初始化方法的网络的准确率较差,而且这样的初始化很难用于更复杂的网络中。 因此,论文希望找出一种有效地训练不含BatchNorm的深度残差网络的方法,而且测试集性能能够媲美当前的SOTA,论文主要贡献如下:
许多研究从理论上分析ResNet的信号传播,却很少会在设计或魔改网络的时候实地验证不同层数的特征缩放情况。实际上,用任意输入进行前向推理,然后记录网络不同位置特征的统计信息,可以很直观地了解信息传播状况并尽快发现隐藏的问题,不用经历漫长的失败训练。于是,论文提出了信号传播图(Signal Propagation Plots,SPPs),输入随机高斯输入或真实训练样本,然后分别统计每个残差block输出的以下信息:
论文对常见的BN-ReLU-Conv结构和不常见的ReLU-BN-Conv结构进行了实验统计,实验的网络为600层ResNet,采用He初始化,定义residual block为 ,从SPPs可以发现了以下现象:
假如直接去掉BatchNorm,Average Squared Channel Means和Average Channel Variance将会不断地增加,这也是深层网络难以训练的原因。所以要去掉BatchNorm,必须设法模拟BatchNorm的信号传递效果。
根据前面的SPPs,论文设计了新的redsidual block ,主要模拟BatchNorm在均值和方差上的表现,具体如下:
根据上面的设计,给定 和 ,可根据 直接计算第 个residual block的输出的方差。为了模拟ResNet中的累积方差在transition block处被重置,需要将transition block的skip path的输入缩小为 ,保证每个stage开头的transition block输出方差满足 。将上述简单缩放策略应用到残差网络并去掉BatchNorm层,就得到了Normalizer-Free ResNets(NF-ResNets)。
论文对使用He初始化的NF-ResNet进行SPPs分析,结果如图2,发现了两个比较意外的现象:
为了验证上述现象,论文将网络的ReLU去掉再进行SPPs分析。如图7所示,当去掉ReLU后,Average Channel Squared Mean接近于0,而且残差分支输出的接近1,这表明是ReLU导致了mean-shift现象。 论文也从理论的角度分析了这一现象,首先定义转化 , 为任意且固定的矩阵, 为作用于独立同分布输入 上的elememt-wise激活函数,所以 也是独立同分布的。假设每个维度 都有 以及 ,则输出 的均值和方差为:
其中, 和 为 的 行(fan-in)的均值和方差:
当 为ReLU激活函数时,则 ,意味着后续的线性层的输入都为正均值。如果 ,则 。由于 ,如果 也是非零,则 同样有非零均值。需要注意的是,即使 从均值为零的分布中采样而来,其实际的矩阵均值肯定不会为零,所以残差分支的任意维度的输出也不会为零,随着网络深度的增加,越来越难训练。
为了消除mean-shift现象以及保证残差分支 具有方差不变的特性,论文借鉴了Weight Standardization和Centered Weight Standardization,提出Scaled Weight Standardization(Scaled WS)方法,该方法对卷积层的权值重新进行如下的初始化:
和 为卷积核的fan-in的均值和方差,权值 初始为高斯权值, 为固定常量。代入公式1可以得出,对于 ,有 ,去除了mean-shift现象。另外,方差变为 , 值由使用的激活函数决定,可保持方差不变。 Scaled WS训练时增加的开销很少,而且与batch数据无关,在推理的时候更是无额外开销的。另外,训练和测试时的计算逻辑保持一致,对分布式训练也很友好。从图2的SPPs曲线可以看出,加入Scaled WS的NF-ResNet-600的表现跟ReLU-BN-Conv十分相似。
最后的因素是 值的确定,保证残差分支输出的方差在初始阶段接近1。 值由网络使用的非线性激活类型决定,假设非线性的输入 ,则ReLU输出 相当于从方差为 的高斯分布采样而来。由于 ,可设置 来保证 。虽然真实的输入不是完全符合 ,在实践中上述的 设定依然有不错的表现。 对于其他复杂的非线性激活,如SiLU和Swish,公式推导会涉及复杂的积分,甚至推出不出来。在这种情况下,可使用数值近似的方法。先从高斯分布中采样多个 维向量 ,计算每个向量的激活输出的实际方差 ,再取实际方差均值的平方根即可。
本文的核心在于保持正确的信息传递,所以许多常见的网络结构都要进行修改。如同选择 值一样,可通过分析或实践判断必要的修改。比如SE模块 ,输出需要与 的权值进行相乘,导致信息传递减弱,网络变得不稳定。使用上面提到的数值近似进行单独分析,发现期望方差为0.5,这意味着输出需要乘以2来恢复正确的信息传递。 实际上,有时相对简单的网络结构修改就可以保持很好的信息传递,而有时候即便网络结构不修改,网络本身也能够对网络结构导致的信息衰减有很好的鲁棒性。因此,论文也尝试在维持稳定训练的前提下,测试Scaled WS层的约束的最大放松程度。比如,为Scaled WS层恢复一些卷积的表达能力,加入可学习的缩放因子和偏置,分别用于权值相乘和非线性输出相加。当这些可学习参数没有任何约束时,训练的稳定性没有受到很大的影响,反而对大于150层的网络训练有一定的帮助。所以,NF-ResNet直接放松了约束,加入两个可学习参数。 论文的附录有详细的网络实现细节,有兴趣的可以去看看。
总结一下,Normalizer-Free ResNet的核心有以下几点:
对比RegNet的Normalizer-Free变种与其他方法的对比,相对于EfficientNet还是差点,但已经十分接近了。
论文提出NF-ResNet,根据网络的实际信号传递进行分析,模拟BatchNorm在均值和方差传递上的表现,进而代替BatchNorm。论文实验和分析十分足,出来的效果也很不错。一些初始化方法的理论效果是对的,但实际使用会有偏差,论文通过实践分析发现了这一点进行补充,贯彻了实践出真知的道理。
生物医学信号处理方法论文
生物医学信号处理是指据生物医学信号特点,应用信息科学的基本理论和方法,研究如何从扰和噪声淹没的观察记录中提取各种生物医学信号中所携带的信息,并对它们进步分析、解释和分类。以下是我精心准备的生物医学信号处理方法论文,大家可以参考以下内容哦!
摘 要: 生物医学信号是人体生命信息的集中体现,深入进行生物医学信号检测与处理的理论与方法的研究对于认识生命运动的规律、探索疾病预防与治疗的新方法都具有重要的意义。
关键词: 生物医学信号 信号检测 信号处理
1 概述
1。1 生物医学信号及其特点
生物医学信号是一种由复杂的生命体发出的不稳定的自然信号,属于强噪声背景下的低频微弱信号,信号本身特征、检测方式和处理技术,都不同于一般的信号。生物医学信号可以为源于一个生物系统的一类信号,这些信号通常含有与生物系统生理和结构状态相关的信息。生物医学信号种类繁多,其主要特点是:信号弱、随机性大、噪声背景比较强、频率范围一般较低,还有信号的统计特性随时间而变,而且还是非先验性的。
1。2 生物医学信号分类
按性质生物信号可分为生物电信号(Bioelectric Signals),如脑电、心电、肌电、胃电、视网膜电等;生物磁信号(Biomagnetic Signals),如心磁场、脑磁场、神经磁场;生物化学信号(Biochemical Signals),如血液的pH值、血气、呼吸气体等;生物力学信号(Biomechanical Signals),如血压、气血和消化道内压和心肌张力等;生物声学信号(Bioacoustic Signal),如心音、脉搏、心冲击等。
按来源生物医学信号可大致分为两类:(1)由生理过程自发产生的主动信号,例如心电(ECG)、脑电(EEG)、肌电(EMG)、眼电(EOG)、胃电(EGG)等电生理信号和体温、血压、脉博、呼吸等非电生信号;(2)外界施加于人体、把人体作为通道、用以进行探查的被动信号,如超声波、同位素、X射线等。
2 生物医学信号的检测及方法
生物医学信号检测是对生物体中包含的生命现象、状态、性质和成分等信息进行检测和量化的技术,涉及到人机接口技术、低噪声和抗干扰技术、信号拾取、分析与处理技术等工程领域,也依赖于生命科学研究的进展。信号检测一般需要通过以下步骤(见图1)。
①生物医学信号通过电极拾取或通过传感器转换成电信号;②放大器及预处理器进行信号放大和预处理;③经A/D转换器进行采样,将模拟信号转变为数字信号;④输入计算机;⑤通过各种数字信号处理算法进行信号分析处理,得到有意义的结果。
生物医学信号检测技术包括:(1)无创检测、微创检测、有创检测;(2)在体检测、离体检测;(3)直接检测、间接检测;(4)非接触检测、体表检测、体内检测;(5)生物电检测、生物非电量检测;(6)形态检测、功能检测;(7)处于拘束状态下的生物体检测、处于自然状态下的生物体检测;(8)透射法检测、反射法检测;(9)一维信号检测、多维信号检测;(10)遥感法检测、多维信号检测;(11)一次量检测、二次量分析检测;(12)分子级检测、细胞级检测、系统级检测。
3 生物医学信号的处理方法
生物医学信号处理是研究从扰和噪声淹没的信号中提取有用的生物医学信息的特征并作模式分类的方法。生物医学信号处理的目的是要区分正常信号与异常信号,在此基础上诊断疾病的存在。近年来随着计算机信息技术的飞速发展,对生物医学信号的处理广泛地采用了数字信号分析处理方法:如对信号时域分析的相干平均算法;对信号频域分析的快速傅立叶变换算法和各种数字滤波算法;对平稳随机信号分析的功率谱估计算法和参数模型方法;对非平稳随机信号分析的短时傅立叶变换、时频分布(维格纳分布)、小波变换、时变参数模型和自适应处理等算法;对信号的非线性处理方法如混沌与分形、人工神经网络算法等。下面介绍几种主要的处理方法。
3。1 频域分析法
信号的频域分析是采用傅立叶变换将时域信号x(t)变换为频域信号X(f),从而将时间变量转变成频率变量,帮助人们了解信号随频率的变化所表现出的特性。信号频谱X(f)描述了信号的频率结构以及在不同频率处分量成分的大小,直观地提供了从时域信号波形不易观察得到频率域信息。频域分析的'一个典型应用即是对信号进行傅立叶变换,研究信号所包含的各种频率成分,从而揭示信号的频谱、带宽,并用以指导最优滤波器的设计。
3。2 相干平均分析法
生物医学信号常被淹没在较强的噪声中,且具有很大的随机性,因此对这类信号的高效稳健提取比较困难。最常用的常规提取方法是相干平均法。相干平均(Coherent Average)主要应用于能多次重复出现的信号的提取。如果待检测的医学信号与噪声重叠在一起,信号如果可以重复出现,而噪声是随机信号,可用叠加法提高信噪比,从而提取有用的信号。这种方法不但用在诱发脑电的提取,也用在近年来发展的心电微电势(希氏束电、心室晚电位等)的提取中。
3。3 小波变换分析法
小波分析是传统傅里叶变换的继承和发展,是20世纪80年代末发展起来的一种新型的信号分析工具。目前,小波的研究受到广泛的关注,特别是在信号处理、图像处理、语音分析、模式识别、量子物理及众多非线性科学等应用领域,被认为是近年来在工具及方法上的重大突破。小波分析有许多特性:多分辨率特性,保证非常好的刻画信号的非平稳特征,如间断、尖峰、阶跃等;消失矩特性,保证了小波系数的稀疏性;紧支撑特性,保证了其良好的时频局部定位特性;对称性,保证了其相位的无损;去相关特性,保证了小波系数的弱相关性和噪声小波系数的白化性;正交性,保证了变换域的能量守恒性;所有上述特性使小波分析成为解决实际问题的一个有效的工具。小波变换在心电、脑电、脉搏波等信号的噪声去除、特征提取和自动分析识别中也已经取得了许多重要的研究成果。
3。4 人工神经网络
人工神经网络是一种模仿生物神经元结构和神经信息传递机理的信号处理方法。目前学者们提出的神经网络模型种类繁多。概括起来,其共性是由大量的简单基本单元(神经元)相互广泛联接构成的自适应非线性动态系统。其特点是:(1)并行计算,因此处理速度快;(2)分布式存贮,因此容错能力较好;(3)自适应学习(有监督的或无监督的自组织学习)。
参考文献
[1] 邢国泉,徐洪波。生物医学信号研究概况。咸宁学院学报(医学版),2006,20:459~460。
[2] 杨福生。论生物医学信号处理研究的学科发展战略。国外医学生物医学工程分册,1992,4(15):203~212。
相关论文:Vc++下如何利用Matlab工具箱进行数字信号处理摘要: 本文详述了在Vc环境下如何利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎、Matlab自身的编译器以及利用MathTools公司的Matcom进行对工具箱函数的调用。 关键词:Matlab M-文件 引擎 编译器 Matcom Vc++Matlab的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与系统,信号处理工具箱位于目录、Toolbox\Signal下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等。在其它的环境如Vc下如果能调用Matlab工具箱中的文件,会大大地加快一些算法的实现,同时其可靠性也很高。利用Matlab引擎 Matlab引擎采用客户和服务器计算方式,在运用中,Vc的C语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,它提供了下列几个函数: engOpen, engGetArray, engPutArray, engEvaString, engOutputBuffer ,engClose与客户机进行交互。下面例程是在Vc下建一个基于对话框的应用程序,在对话框中设置一个Button控件OnMatlabEngine.,在对话框 .cpp文件中加入”engine.h” 和“math.h” 头文件,下面给出部分程序清单。Void CtestmatlabDlg::OnMatlabEngine(){Engine *ep;mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL;double datax[1024];char buffer[1024];for(int j=0;j<1024;j++)//注:如通过采集卡采集数据可将采集的数据放在datax[]数组中,此循环就不需要{double samt=(double)(1.0/1024); datax[j]=sin(2.0*63.0*samt*3.1415926+1.15*3.1415926);}double *pPxx,*pFxx;if(!(ep=engOpen(" \0"))){//打开Matlab引擎,建立与本地Matlab的连接fprintf(stderr,"\n Can't start MATLAB engine\n");exit(-1);} double Fs[1]={1024};//因为Matlab所有参与运算的参数都是矩阵的形式,因而下列几行将参数转变double nfft[1]={1024};//成Matlab可接受的矩阵形式。T=mxCreateDoubleMatrix(1,1024,mxREAL);mnfft=mxCreateDoubleMatrix(1,1,mxREAL);mFs=mxCreateDoubleMatrix(1,1,mxREAL);mxSetName(T,"T");mxSetName(mnfft,"mnfft");mxSetName(mFs,"mFs");memcpy((char*)mxGetPr(T),(char*)datax, 1024*sizeof(double));memcpy((char*)mxGetPr(mnfft),(char*)nfft, sizeof(double));memcpy((char*)mxGetPr(mFs),(char*)Fs,1*sizeof(double));engPutArray(ep,T); //将转化的参数放入引擎中,此时可在Matlab command窗口下查看此参数engPutArray(ep,mnfft); engPutArray(ep,mFs);engEvalString(ep,"[pxx,fo]=psd(T,mnfft,mFs);"); //利用引擎执行工具箱中文件engOutputBuffer(ep,buffer,512); //如只想看显示图形,可将返回参数去掉,psd无返回参数缺省情况下会自动画图形result=engGetArray(ep,"pxx");//取出引擎中的数据放在所指的区域中供后续处理pPxx=mxGetPr(result); result=engGetArray(ep,"fo");pFxx=mxGetPr(result);engEvalString(ep,"plot(fo,10*log10(pxx));");//利用引擎画图engEvalString(ep,"title('功率谱分析');");engEvalString(ep,"xlabel('Hz');");engEvalString(ep,"ylable('db');");mxDestroyArray(T); //释放内存mxDestroyArray(mFs);mxDestroyArray(mnfft);mxDestroyArray(result);engEvalString(ep,"close;");engClose(ep);}上述程序在Vc下编译需要将 libeng.dll和libmx.dll两个动态库利用以下的命令:lib/def:<自己的Matlab的安装路径,下同>e:\ Matlab\extern\include\*.def /machine:ix86 /out:*.lib来生成程序所需的静态连接库libeng.lib和libmx.lib,将libeng.lib和libmx.lib所在的目录加入Vc++ project/link/object/library modules下即可。利用Matlab自身的编译器调用工具箱中的函数 Matlab的编译器可将Matlab的M文件转换为为C或C++的源代码以产生完全脱离Matlab运行环境的独立的运用程序,但Matlab本身的资料说明编译器如用来建立独立的运用程序,不能调用Matlab工具箱中的函数,这非常不利于搞一些特殊的算法。本人研究了一段时间发现,工具箱中的函数既然是M文件就一定可以用编译器来编译,以提供如Vc的调用函数,但是编译器只能编译一个独立的M文件,即这个 M文件不依赖于其他的M文件。如果M文件中又调用了其他的M文件,可将被调用的M文件拷贝到调用M文件的相应位置,作适当的改动就可以用于编译器编译。编译器不支持图形函数,所以M文件中如有图形函数需注释掉。当Matlab的编译器mcc加入适当的参数-e(mcc –e *.*)或-p(mcc –p *.*)就可生成将输入的M文件转换为适用于特定运用的C或C++源代码。这样如果要在Vc下编译通过,还需连入以下几个库libmmfile.dll, libmatlb.dll, libmcc.dll, libmat.dll. libmx.dll. mibut.dll 以及Matlab C MATH库,建议采用前述的方法将动态连接改为静态连接。对于C/C++编译环境的设置,在Matlab command窗口下运行mex –setup 然后依提示操作,而对于C/C++连接环境的设置,运行mbuild –setup依提示操作即可。下面给出利用编译器将Matlab工具箱中psd.m文件生成可供Vc调用的函数。将psd.m文件拷贝一份至Matlab\bin目录下,改写相应调用的M文件如nargchk.m, hanning.m等。为生成的代码简洁,对于采集数据处理输入参数很明了的情况下可作大量的删减,最终使psd.m成为一个不依赖于其他M文件的独立的M文件,注意千万注释掉作图代码,最终改成如下形式,限于篇幅给出关键的几步: function [Pxx,f]=psd(Fs,nfft,noverlap,x)window=o,5*(1-cos(2*pi*(1:nfft)’/(nffft+1)));//hanning 窗dflag=’none’;window=window(;)………………………………….以上只要稍懂Matlab语言和信号处理知识就可完成这项工作。假设上述代码重新存为testwin.m,在Matlab command 窗口下设置好环境参数运行mcc –e testwin,则可在Matlab\bin下生成testwin.c ,如运行mcc –p testwin 则生成testwin.cpp. Vc下建立一个基于对话框的文件,然后在对话框里加一个Button控件OnButtonPsd 将上述生成的.c文件的头文件加入到工程的.cpp中,且将#ifdef_cplusplus extern “c”{#end ifc代码声明加入Vc的包含文件和生成的.C的包含文件之间将#ifdef_cplusplus}#end if加入.cpp文件未尾为了简洁且便于处理将生成的c函数稍改动,给出部分代码如下: void CTestpsdwinDlg::OnButtonPsd(){mxArray* x_rhs_;//指向采集数据存放区Fs=23510;//数据采集的频率 nfft=1024;//1024点的fftdouble datax[1024]//采集的数据x_rhs_mxCreateDoubleMatrix(1,1024,mxReal);memcpy(mxGetPr(x_rhs_),datax,1024*sizeof(double));noverlap=512;……………….……………….mccCopy(&Pxx,&Spec);mccCopy(&f,&frevgg_vector);for(int j=0;j<(int)(nfft/2+1);j++){datap[j]=mccGetRealVectorElement(&Pxx, (j+1));//功率谱密度存于datap[]数组dataf[j]=mccGetRealVectorElement(&f, (j+1));//相应频率存于数组dataf[]中}mccFreeMatrix(&Pxx);……………….SendMessageBox(WM_PAINT,0,0);//利用Vc下的图形函数画图Return;}如上生成的程序可读性不太好,而生成的c++代码则可读性较好,但千万注意只能用 Matlab的MATH库,不可用c++的MATH库,否则编译会出错,限于篇幅在此不述。3)利用Matcom调用工具箱中的函数Matcom编译M文件,先将M文件按照与Matcom的cpp库的对应关系翻译为cpp源代码,然后用对应版本的c编译器将cpp文件编译成相应的exe或dll文件,所以第一次运行要指定c编译器的路径,否则无法编译,指定好的编译信息就写在Matcom\bin\matcom.ini文件中,不过这一步按装matcom时,它自动寻找编译器并将其写入matcom.ini文件中,matcom4.5版中使用TeeChart3.0 OCX控件,因而它支持图形操作。我们依然用上述的testwin.m文件,不要将图形函数注释掉,利用Mideva来生成可被Vc调用的信号处理程序。运行Mideva在主界面上直打开M文件,在菜单中选择compile to dll,输入testwin..在Matcom debug目录下可以找到这样的几个文件,testwin.c ,testwin.h,testwin.cpp,testwin.lib,testwin.dll,testwin.exp等。 将上述testwin.cpp和testwin.h加入工程中,project/add to project/files并且在相应的文件中加入”stdafx.h” 加连接库:Tools\option\directory\ , 选include选项,加入e:\matcom45\lib (包含matcom.h) library选项,加入e:\matcom45\lib4) project\add to project\files 文件类型选项选(.lib)将e:\matcom45\lib\v4501.lib加入工程中编译运行。相应代码如下:void CtestmatcomDlg::OnpsdButton(){double datap[512],dataf[512];initM(MATCOM_VERSION);//初始化matcom库Mm Fs,nfft,noverlap;//创建矩阵Mm x=zeros(1,1024);Fs=1024;nfft=1024;noverlap=128;dMm(Pxx_o);dMm(f_o);//创建并命名矩阵datax[];//数据采集的数据存于此数组中for(int i=1;i<=1024;i++){x.r(1,i)=datax[i+1];//给x阵赋值}testwin(Fs,nfft,noverlap,x,i_o,Pxx,f_o);//matcom生成的函数for(i=0;i<513;i++){//取出功率谱密度分析结果dataf[i]=f_o.r(i+1,1);datap[i]=Pxx_o.r(i+1,1);}exitM();return;}可见利用Matcom进行M文件转换非常的容易,生成的代码可读性很好,以上的转换同时生成了可供Vc调用的动态连接库,其使用和一般的动态库一样使用。同时需指明Matcom不仅可转换独立的不依赖于其它M文件的M文件,同时可转换调用其它M文件的M文件嵌套。条件是这此M文件在同一个目录下面,如前所述的psd.m可直接用上述方法转换,生成了多个重载形式的psd函数结论: 利用Mtlab引擎调用工具箱中的函数可节省大量的系统资源,应用程序整体性能较好,但不可脱离Matlab 的环境运行。用Matlab编译器进行工具箱函数的调用,须转换相应的M文件使其成为独立的M文件,且不支持图形函数,转换的代码可读性不太好。用Matcom 进行转换非常方便,生成的代码可读性很好,支持图形函数,且代码执行的速度比不转换平均要快1.5倍以上。以上程序在Vc++ 6.0,Matlab5.2,Matcom4.5中调试通过,以上方法在工程实践中已得到很好的运用。仅供参考,请自借鉴希望对您有帮助
131 浏览 2 回答
296 浏览 2 回答
290 浏览 4 回答
251 浏览 4 回答
310 浏览 3 回答
96 浏览 2 回答
329 浏览 7 回答
271 浏览 8 回答
215 浏览 3 回答
83 浏览 4 回答
133 浏览 2 回答
206 浏览 3 回答
163 浏览 4 回答
175 浏览 4 回答