matlab和c语言联合编程_学习记录_8月13日.doc_第1页
matlab和c语言联合编程_学习记录_8月13日.doc_第2页
matlab和c语言联合编程_学习记录_8月13日.doc_第3页
matlab和c语言联合编程_学习记录_8月13日.doc_第4页
matlab和c语言联合编程_学习记录_8月13日.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

此文档收集于网络,如有侵权,请联系网站删除Matlab和C语言联合编程_学习记录2014年8月13日1 概述为了提高Matlab对IQ数据计算的速度,决定采用Matlab调用C语言编写的核心算法的方法,来提高速度。在学习中,主要参考了精通Matlab与C/C+混合程序设计(第3版),刘维编著,第80页第180页的内容。C程序在“H:QXLDNJU_CPolMatlab敏视达雷达IQ数据的信号处理C” 目录下,其主程序是mexFun_Radar_Data_DSP.c,其它几个C文件是子函数。程序是参照了Fun_Radar_Data_DSP.m 和以前写过的PDRadarDSP.cpp。为了提高速度,程序大量采用了Intel 的IPP 算法库和32bit的浮点运算。程序中的各种信号处理算法,以及其中的各种系数,是完全按照Fun_Radar_Data_DSP.m 程序写的(但没有数据显示的功能,并且双重频处理、高阶的MultiLag算法等,暂时没有实现)。考虑到充分发挥Matlab和C语言各自的优势,因此并没有把全部的Matlab程序都改用C语言来实现,而仅仅把耗时最长的Fun_Radar_Data_DSP.m用C语言实现了。今后,可以将GMAP等先进的算法也用C语言来实现,因为这些算法用Matlab编写时,难以实现“向量化计算”,造成计算速度很慢。而用C语言编写就不存在“向量化”的难题,计算速度应该很快。2 编程方法2.1 编译器的设置先在matlab下执行:mex -setup进行C语言编译器的设定。注意要选择VC2010作为编译器(不要采用Matlab自带的编译器)。并且要注意:如果要把编译好的程序在没有VC2010的电脑上运行,则要安装VC2010的可发行包。然后,运行:mex CmexFun_Radar_Data_DSP.c 就可以将 C 目录下的“” 文件,编译为“mexFun_Radar_Data_DSP.mexw32”,就可以被matlab直接调用了。如果采用了-g选项,即运行:mex CmexFun_Radar_Data_DSP.c -g就不但可以生成 mexFun_Radar_Data_DSP.mexw32文件,还能生成“mexFun_Radar_Data_DSP.mexw32.pdb” 文件,用于断点调试。注意:如果在Win7 64bit下运行,则需要重新编译一下,生成“mexFun_Radar_Data_DSP.mexw64”,才能在64bit 的matlab下调用。2.2 IPP的编译需要先安装IPP的开发包,在“Y:SETUPDevTools各种软件开发工具包Intel算法库IPP6.1” 目录下,安装到C盘的默认目录下。需要用到intel_TBE (2).lic文件进行安装。在C程序的开头,需要加入:#include C:Program FilesIntelIPP6.1.2.041ia32includeipp.h #pragma comment( lib,C:Program FilesIntelIPP6.1.2.041ia32libippcorel.lib) #pragma comment( lib,C:Program FilesIntelIPP6.1.2.041ia32libippsemerged.lib)#pragma comment( lib,C:Program FilesIntelIPP6.1.2.041ia32libippsmerged.lib)注意:经测试发现,使用支持多线程并行计算的静态库,没有加速效果(实际运行时,仍然是单线程)。因此,就决定只采用单线程的库了。具体使用方法详见“C:Program FilesIntelIPP6.1.2.041ia32doc”目录下的userguide_win_ia32.pdf。2.3 在64bit 操作系统下的编译注意:在64bit操作系统下,需要安装IPP 6.0的64bit版本(没有6.1的64bit 版本)。然后,在C程序的开头,需要加入:#include C:Program FilesIntelIPP6.0.0.062em64tincludeipp.h #pragma comment( lib,C:Program FilesIntelIPP6.0.0.062em64tlibippcoreem64tl.lib)#pragma comment( lib,C:Program FilesIntelIPP6.0.0.062em64tlibippsmergedem64t.lib)#pragma comment( lib,C:Program FilesIntelIPP6.0.0.062em64tlibippsemergedem64t.lib)具体使用方法详见“doc”目录下的userguide_win_ em64t.pdf。3 速度测试3.1 计算机配置在CJJ的电脑上测量,配置如下:l CPU:I5l 主频:3.2GHzl 内存:4GBl 操作系统:Win7 32bitl mex 用 -g 的编译选项。如果去掉-g,则还可以快约20%l 基数据和IQ数据都保存在一个直接和计算机SATA接口相连的容量为2TB 机械硬盘上,硬盘没有采用Windows提供的压缩功能。3.2 处理一个完整的体扫的IQ数据的速度基数据在“H:QXLDNJU_CPolBaseData_Select用于C程序测试的数据_20140813”目录下,基数据为:NJU.20140704.203525.AR2。对应的IQ数据在“H:QXLDNJU_CPolIQData用于C程序测试的数据_20140813”目录下,共15个IQ文件。3.2.1 Matlab读取IQ数据的速度不执行任何信号处理程序(实际上只执行了一个空的mex_Fun_Radar_Data_DSP函数,以便对基数据进行赋值),只把IQ数据读取出来,则处理全部的体扫IQ数据,耗时:151.44 s。这些IQ数据文件的总的大小为:4440 MB。因此,每秒的读取速度为:29.4MB/s。可见,由于采用了Matlab程序来读取和解析IQ数据,速度比较慢,是一个瓶颈。今后要想办法用C语言来读取和解析,并且采用高速磁盘阵列进行数据的存储,速度应该能更快一点。3.2.2 Matlab的Fun_Radar_Data_DSP 函数的处理时间用Matlab的Fun_Radar_Data_DSP 函数,计算全部的体扫IQ数据,耗时:560.25s。注意:这个时间,包括了IQ数据读取的时间(需要耗费151.44s)。因此,如果扣除了IQ数据读取的时间,则Matlab的Fun_Radar_Data_DSP 函数耗时408.81s。3.2.3 用C语言编写的mexFun_Radar_Data_DSP 函数的处理时间(采用-g 编译)而用C语言编写的mex Fun_Radar_Data_DSP 函数,计算全部的体扫IQ数据,耗时277.75s。注意:这个时间,包括了IQ数据读取的时间(需要耗费151.44s)。因此,如果扣除了IQ数据读取的时间,则C语言的 函数耗时126.31s3.2.4 用C语言编写的mexFun_Radar_Data_DSP 函数的处理时间(不采用-g 编译)而用C语言编写的mex Fun_Radar_Data_DSP 函数,计算全部的体扫IQ数据,耗时256.33s。注意:这个时间,包括了IQ数据读取的时间(需要耗费151.44s)。因此,如果扣除了IQ数据读取的时间,则C语言的 函数耗时104.89s。3.2.5 结果对比全部耗时扣除了IQ数据读取的耗时Matlab的Fun_Radar_Data_DSP 函数的处理时间560.25s408.81s用C语言编写的mex_Fun_Radar_Data_DSP 函数的处理时间(采用-g 编译)277.75126.31用C语言编写的mex_Fun_Radar_Data_DSP 函数的处理时间(不采用-g 编译)256.33s104.89由于天线一个体扫模式(共15个仰角层面),共耗费404s。因此,从表中可以看出, 采用C语言对Matlab程序进行优化之后,就能实时实现各种处理算法了。3.3 mexFun_Radar_Data_DSP 函数中,各个子函数的速度测试数据为64个相关脉冲(即方位上的积累数),距离库为1933个,库长为75m。测试方法是通过1000次循环,然后平均得到的。函数功能(采用-g 编译)(ms)(不采用-g 编译)(ms)累计耗时单独耗时累计耗时单独耗时只有数据的输入和输出,即只执行了 Get_DSP_Setup、Get_CorrelationData、Set_RayRecord 3个函数,用于和Matlab空间的数据交互1.791.791.001.00增加了Fun_PreProcess.c 函数6.274.485.054.05增加了Fun_ClutterFilter.c函数16.8810.6113.328.27增加了Fun_CorrCalc21.114.2317.464.14增加了Fun_ParameterCalc22.291.1818.100.64增加了Fun_ChannelCorrect22.19-0.118.160.06增加了Fun_ZDR_KDP_Calc23.351.1618.890.73增加了Fun_FormatChange23.670.3219.200.31增加了Fun_Thresholding23.57-0.119.02-0.18增加了Fun_SpeckleFilter23.750.1819.360.34注意:上表中,有些函数的耗时为负数,表示这段程序耗时非常小,由于测量误差造成的。注意:经测试,对于同样的IQ数据,Matlab的Fun_Radar_Data_DSP 函数的执行时间为:99.86ms 。可见,C语言编写的函数,其执行时间仅为Matlab耗时的1/41/5。 3.4 在X1笔记本电脑上的计算速度该笔记本电脑的配置为:l CPU:I7l 主频:2.0GHzl 内存:8GBl 操作系统:Win7 64bit基数据和IQ数据都保存在笔记本电脑的SSD硬盘上,SSD没有采用Windows提供的压缩功能。经测试,读取全部的体扫IQ数据,耗时:s。速度测试结果如下:全部耗时扣除了IQ数据读取的耗时Matlab的Fun_Radar_Data_DSP 函数的处理时间694.65s用C语言编写的mex_Fun_Radar_Data_DSP 函数的处理时间(不采用-g 编译)299.59s可见,在笔记本电脑上,由于CPU的主频比较慢,因此计算速度比台式机要慢很多。3.5 多个Matlab进程同时运行经测试,多个Matlab同时运行,全局变量不会在不同进程间共享,从而不会对计算结果造成影响。也就是说,可以同时开几个matlab进程进行计算,分别计算不同目录下的IQ数据。下面是同时运行2个matlab进行计算的任务管理器的截屏。从中可以看出,每个Matlab各自在一个CPU核上运行。需要注意:如果硬盘的读写速度比较慢,就会造成IQ数据读取需要耗费大量的时间,就体现不出多个Matlab同时运行的好处了。4 经验和教训在编程中,有以下一些经验和教训要吸取:l C语言中,所有的变量要在函数的一开头进行定义,而不能像C+ 语言一样(只要在用之前定义即可)。l 占用内存比较大的变量(如保存IQ数据的变量),必须要定义成全局变量。否则,编译会报错(堆栈的空间不够)。l 注意:要用fabs,而不能用abs! 因为C语言中的abs是整数取绝对值!l 经过Matlab和IPP中的窗函数对比发现,两者有点差别。因此,这里要将matlab的窗函数人工写出来,而不能直接采用matlab提供的,如hamming、hanning的函数,以便和IPP中的完全一致l 在反异步的程序中,原来的C语言代码有缺陷。当判断出当前距离单元是异步干扰信号时,不能将Abs的结果清零,而只能先将IQ清零。等到反异步结束之后,再从IQ重新计算出 Abs的结果。5 下一步工作5.1 对所有的IQ数据,重新计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论