VC++编程实现对波形数据的频谱分析教学教材.doc
《VC++编程实现对波形数据的频谱分析教学教材.doc》由会员分享,可在线阅读,更多相关《VC++编程实现对波形数据的频谱分析教学教材.doc(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。VC+编程实现对波形数据的频谱分析-VC+编程实现对波形数据的频谱分析-摘要:本文介绍了采用离散傅立叶变换(DFT)实现对采样得到的波形数据文件进行频谱分析的一般方法,并且为了提高运算效率、节省中间存储单元,最终采用了时间抽选奇偶分解的库利-图基算法实现快速离散傅立叶变换,对采样数据进行了高效的频谱分析,并用MicrosoftVisualC+6.0编写实现。关键字:MicrosoftVisualC+6.0、离散傅立叶变换、快速傅立叶变换、采样一、引言频谱分析是电子工程上一个非常重要的手段,许多计算机辅助
2、电路分析(CAA)类软件都具备这种分析能力,以便电子工程师能清楚的看到某波形的频谱分布情况。而要对一个输入信号源作频谱分析,将其由时域信号转变为频域信号,就必然要用到傅立叶分析,而无论是在时域还是在频域,都要对连续函数进行积分运算。很显然,要通过计算机实现此变换必须预先通过抽样将原始的连续数据转变为离散数据,并将计算范围收缩到一个有限区间。因此在允许一定程度近似的条件下,可以使用离散傅立叶变换(DFT)对波形数据进行频谱分析。二、快速傅立叶变换(FFT)算法构成原理要计算一个N点的离散傅立叶变换需要同一个N*N点的W矩阵(关于W矩阵请参阅信号与系统方面的书籍)相运算,随着N值的增大,运算次数显
3、著上升,当点数达到1024时,需要进行复数乘法运算1,048,576次,显然这种算法在实际运用中无法保证当点数较大时的运算速度,无法满足对信号的实时处理。根据W矩阵中W元素的周期性和对称性我们可以将一个N点的DFT运算分解为两组N/2点的DFT运算,然后取和即可,为进一步提高效率,将上述两个矩阵按奇偶顺序逐级分解下去。当采样点数为2的指数次方M时,可分解为M级子矩阵运算,全部工作量仅为:复数乘法:M*N/2次复数加法:N*M次而直接DFT需要的运算量为:复数乘法:N*N次复数加法:N*(N-1)次当点数N为几十个点时FFT的优势还不明显,而一旦达到几千、几百个点时优势是十分明显的:N=1024
4、时:DFT需1048576次运算,FFT仅需5120次运算,改善比204.8。N=2048时:DFT需4194304次运算,FFT仅需11264次运算,改善比达到372.4。三、时间抽选奇偶分解快速离散傅立叶变换的程序实现当采样点数较多时,如变换前和变换后的序列都按自然顺序排列,则中间运算过程会占用大量的中间存储单元,造成效率的低下和存储单元的浪费。根据FFT的实现原理我们可以对采样序列进行逐次奇偶抽选,打乱以前的次序重新排序,然后按此顺序参加运算,可以实现即位运算提高存储单元的利用率。(一)复数的描述方法进行傅立叶变换时不可避免的要用到复数,而在VC中并没有现成的可用于表示复数的数据类型,可
5、以自己定义一个含有两个成员变量的数据结构来表示复数,这两个成员变量可分别用于表示复数的实部与虚部:typedefstructtagComplexfloatRe;/复数的实部floatIm;/复数的虚部Complex;(二)倒序的实现在进行快速傅立叶变换时,可以将输入的时域序列和输出的频域序列都按照自然顺序排列;也可以按照蝴蝶图所描述的计算方法对输入的时域序列按奇偶分解后的序列排序而输出的频域序列仍是按自然顺序排列的;还有一中方式是输入的时域序列是不进行抽选的自然序列,而输出的频域序列则是按奇偶分解后的顺序排列的。这三种方式各有优点,第一种对输入、输出不需要进一步排序,但由于自然排序不符合蝴蝶图
6、运算规律,会占用大量中间存储单元。而后两种则无须中间存储单元,但需要倒一次序。权衡利弊,当采样点较多时还是采用后两种方式好,多一次倒序运算对现在的高性能计算机而言并不是什么负担。下面代码用于对原始采样序列的时间抽选奇偶分解工作,其中A、N分别表示指向采样序列复数数组的指针和序列的长度。intNV2=N/2;intNM1=N-1;intI,J,K=0;ComplexT;/用于中介的复数变量TI=J=1;while(I=NM1)if(IJ)T=AJ-1;/将AJ-1的内容和AI-1的内容互换,借助于中间变量TAJ-1=AI-1;AI-1=T;K=NV2;while(KJ)J-=K;K/=2;J+=
7、K;I+;(三)时域信号的频谱分析首先要将从外设输入或采集的时域波形数据经抽样量化后,通过CFile类的Open()、Read()等成员函数将其读取到缓存中,并将其转化为复变量存放于复变量数组A中,同时需要验证以下数据量的长度是否为2的整数次幂,如若不是则必须用0来补齐,否则无法用蝴蝶图进行分解运算。下面代码用于完成对原始采样时域序列的快速傅立叶变换,A、M分别表示指向原始采样数据数组的指针和序列长度的2的整数次幂:ComplexU,W,T;intLE,LE1,I,J,IP;intN=(int)pow(2,M);/在此采用的是时间抽选奇偶分解方式,所以在参加运算前首先要对时间序列进行倒序Rev
8、erseOrder(A,N);intL=1;while(L=M)LE=(int)pow(2,L);LE1=LE/2;U.Re=1.0f;U.Im=0.0f;W.Re=(float)cos(PI/(1.0*LE1);/计算W算子的值W.Im=(float)-1.0*sin(PI/(1.0*LE1);if(abs(W.Re)1.0e-12)W.Re=0.0f;if(abs(W.Im)1.0e-12)W.Im=0.0f;J=1;while(J=LE1)I=J;while(I摘要:本文详细介绍了在VB集成环境下数字波形高速显示的方法,同时对双通道波形显示和数字滤波方法也进行了介绍。关键词:数字;波形;
9、显示;滤波1前言:随着计算机技术及电子技术的发展,数字采集技术在检测领域的应用越来越广泛,检测速度越来越高,检测的数据量越来越大,特别是在无损检测领域,将检测数据通过计算机处理后绘制出波形,并实时显示,对及时发现伤损、分析伤损具有重要意义。2波形显示检测数据通常是离散的数据,将离散的数据绘制出波形,可通过在两点间连接线段的方法实现。2.1用Line方法显示波形VB提供了Line画直线方法,可在窗体上增加一个图片框控件,适当设置图片的大小和背景颜色,用Line方法将离散数据按检测顺序连接成线段,即可将波形显示在图片框中。但该方法显示波形速度较慢,不适合高速显示的应用。2.2WindowsAPI函
10、数显示波形在VB中两点间连线的另一种方法是用WindowsAPI函数,Win32API提供了以下两个函数,联合使用可实现波形的快速显示,经过测试,显示速度比使用Line方法快70%以上。LineTo函数:函数功能:画出由数组定义的点连接的一系列线段。函数原型:BOOLLineTo(HDChdc,intnXEnd,intnYEnd);参数:hdc:设备环境句柄。nXEnd:定义线段终点的X坐标。nYEnd:定义线段终点的Y坐标。返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。MoveToEx函数:函数功能:将当前位置更新为指定的点,并有选择的返回原先的位置。函数原型:BOOL
11、MoveToEx(HDChdc,intX,intY,LPPOINTlpPoint);参数:hdc:设备环境句柄。X:定义新位置的X坐标(逻辑坐标)。Y:定义新位置的Y坐标(逻辑坐标)。lpPoint:指向一个POINT结构,结构中存放原先的位置。若此参数为NULL,则不返回原先的位置返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。在连接线段时,首先将检测数据放入一个数组中,用MoveToEx函数定位画线的起始点坐标,然后用LineTo函数画出起始点至下一个点之间的线段,再用MoveToEx将画线的起始点定位到下一个点,继续用LineTo函数画线,如此循环,即可将离散点连接成
12、波形。例:zz=MoveToEx(Picture1.hdc,i,Mwave(i),LpPoint1)zz=LineTo(Picture1.hdc,i,Mwave(i+1)实时波形显示界面通常计算机需要接收外部实时发送的数据并用十分形象的方式显示出来。例如柱状图、饼图等等。本应用程序则采用波形的形式显示,并接将之设计为可以接收多路数据的波形显示界面。本应用程序在VS2008环境下调试通过,源码下载连接如下点击该图放大上图中显示了两路波形即三角波和正弦波,当然这两路波形是由程序计算出来的并不是从外部接收的。实际工作中则可以配合串口通讯设备接收它发来的数据并显示出来。二.波形控件类介绍本程序的实现主
13、要依赖于那个波形显示控件。从下载连接那里可以下载该源码,里面的文件中,2DPushGraph.h和2DPushGraph.cpp即是该控件的类的定义文件和实现文件。分析之后得到该类的一些信息。其成员函数包括:程序代码:COLORREFm_crTextColor;/标签文字颜色COLORREFm_crBGColor;/背景颜色COLORREFm_crGridColor;/栅格颜色CStringm_strMaxLabel;/最大值之处的标签CStringm_strMinLabel;/最小值之处的标签boolm_bShowMinMax;/最小最大值显示boolm_bShowGrid;/是否显示栅格b
14、oolm_bStylesModified;/是否被修改intm_nMoveOffset;/偏移intm_nMaxCoords;/最大缓冲intm_nMaxPeek;/显示数据的最大值intm_nMinPeek;/显示数据的最小值intm_nGridSize;/栅格间距intm_nPeekOffset;/峰值偏移其实现方法包括:程序代码:boolCreateFromStatic(UINTnStaticID,CWnd*pParent);/该方法用于创建控件实例,通常在对话框初始化函数中调用,nStaticID为控件ID,pPatent为创建在那个窗口中的ID。LPCTSTRGetLabelForM
15、ax()const;/获取最大值处的标签LPCTSTRGetLabelForMin()const;/获取最大值处的标签COLORREFGetBGColor()const;/获得背景色COLORREFGetGridColor()const;/获得栅格颜色voidSetBGColor(COLORREFcrColor);voidSetGridColor(COLORREFcrColor);voidSetTextColor(COLORREFcrColor);COLORREFGetLineColor(UINTuiLineID);/该方法用于获得ID号为uiLineID的波形的线条颜色,因为要在波形控件中画
16、线必须先调用boolAddLine(UINTuiLineID,COLORREFcrColor);创建一个波形,ID号为uiLineID。boolSetLineColor(COLORREFcrColor,UINTuiLineID);COLORREFGetTextColor()const;/获得标签文本的颜色intGetGridSize()const;/获得栅格间隔voidSetGridSize(unsignedshortusWidthAndHeight);intGetMaxPeek()const;/获得最大值纵坐标intGetMinPeek()const;/获得最小值纵坐标voidSetPeek
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 编程 实现 波形 数据 频谱 分析 教学 教材
限制150内