当前位置:文档之家› VC编程实现对波形数据的频谱分析

VC编程实现对波形数据的频谱分析

要计算一个N点的离散傅立叶变换需要同一个N*N点的W矩阵(关于W矩阵请参阅信号与系统方面的书籍)相运算,随着N值的增大,运算次数显着上升,当点数达到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时:DFT需1048576次运算,FFT仅需5120次运算,改善比204.8。

N=2048时:DFT需4194304次运算,FFT仅需11264次运算,改善比达到372.4。

三、"时间抽选奇偶分解快速离散傅立叶变换"的程序实现当采样点数较多时,如变换前和变换后的序列都按自然顺序排列,则中间运算过程会占用大量的中间存储单元,造成效率的低下和存储单元的浪费。

根据FFT的实现原理我们可以对采样序列进行逐次奇偶抽选,打乱以前的次序重新排序,然后按此顺序参加运算,可以实现"即位运算"提高存储单元的利用率。

(一)复数的描述方法进行傅立叶变换时不可避免的要用到复数,而在VC中并没有现成的可用于表示复数的数据类型,可以自己定义一个含有两个成员变量的数据结构来表示复数,这两个成员变量可分别用于表示复数的实部与虚部:来,也可以将其存成数据文件,以备进一步使用。

四、测试及运算结果分析编译运行程序,打开一三角脉冲的数据文件,并将分析结果保存,该三角脉冲幅度为1,持续时间2毫秒,采样时抽样时间间隔是20微秒,延拓周期(数据记录长度)为10毫秒,采样点数目500点,取2的整数次幂512个样点。

下附该三角脉冲频谱的计算结果及误差分析:频率(Hz)FFT求得X(f)误差0.00 1.00006E-03 1.00000E-03 6.10352E-08100.00 9.67593E-04 9.67531E-04 6.14332E-08200.00 8.75203E-04 8.75150E-04 6.25092E-08300.00 7.36904E-04 7.36849E-04 6.39413E-08400.00 5.72852E-04 5.72787E-04 6.52926E-08500.00 4.05351E-04 4.05285E-04 6.61362E-08600.00 2.54638E-04 2.54572E-04 6.61847E-08700.00 1.35403E-04 1.35338E-04 6.53870E-08800.00 5.47602E-05 5.46963E-05 6.39612E-08900.00 1.20072E-05 1.19448E-05 6.23453E-08 1000.00 6.10719E-08 1.17757E-32 6.53870E-08 1100.008.05672E-067.99613E-06 6.05985E-08 1200.00 2.43706E-05 2.43095E-05 6.11450E-08 1300.00 3.93026E-05 3.92400E-05 6.25965E-08 1400.00 4.68226E-05 4.67581E-05 6.45128E-08 1500.00 4.50979E-05 4.50316E-05 6.62543E-08 1600.00 3.58664E-05 3.57992E-05 6.71930E-08 1700.00 2.30135E-05 2.29466E-05 6.69399E-08 1800.00 1.08697E-05 1.08042E-05 6.55073E-08 1900.00 2.74348E-06 2.68014E-05 6.33390E-08 2000.00 6.11826E-08 1.17757E-32 6.11826E-08 2100.00 2.25379E-06 2.19395E-06 5.98376E-08 2200.007.29243E-067.23256E-06 5.98625E-08 2300.00 1.25974E-05 1.25360E-05 6.13467E-08 2400.00 1.59746E-05 1.59107E-05 6.38421E-08 2500.00 1.62779E-05 1.62114E-05 6.64915E-08 2600.00 1.36254E-05 1.35571E-05 6.83226E-082700.009.16539E-069.09679E-06 6.86075E-082800.00 4.53216E-06 4.46500E-06 6.71550E-082900.00 1.21487E-06 1.15945E-06 6.44190E-08注:在此,FFT运算结果都倍乘了系数10毫秒(0.01秒)。

在分析结果中产生了误差,是由于待分析的连续时间信号不具备离散性或周期性,也可能有无限长度。

为了适应FFT方法的需要,对波形进行了抽样和截断,这样再用程序分析采样数据必然会引入误差,从分析结果可以看出,频率越高,误差波动也越大,此分析结果产生的误差在允许范围之内,是一个可以满意的近似。

实践证明,本程序的算法是正确可靠的。

小结:DFT尤其是FFT的应用已遍及各个科学领域,"DFT的应用"与"FFT 的应用"几乎成为同义语。

通过本文介绍和程序示例可以清楚的看到FFT方法在直接处理离散信号数据的作用,而且也可以很好的用于对连续时间信号分析的逼近。

本程序在Windows 2000 Professional下、由Microsoft Visual C++ 6.0编译通过用VB实现数字波形显示程序减小字体增大字体作者:佚名来源:本站整理发布时间:2009-07-15 18:03:17id=126063>摘要:本文详细介绍了在VB集成环境下数字波形高速显示的方法,同时对双通道波形显示和数字滤波方法也进行了介绍。

关键词:数字;波形;显示;滤波1 前言:随着计算机技术及电子技术的发展,数字采集技术在检测领域的应用越来越广泛,检测速度越来越高,检测的数据量越来越大,特别是在无损检测领域,将检测数据通过计算机处理后绘制出波形,并实时显示,对及时发现伤损、分析伤损具有重要意义。

2 波形显示检测数据通常是离散的数据,将离散的数据绘制出波形,可通过在两点间连接线段的方法实现。

2.1 用Line方法显示波形VB提供了Line画直线方法,可在窗体上增加一个图片框控件,适当设置图片的大小和背景颜色,用Line方法将离散数据按检测顺序连接成线段,即可将波形显示在图片框中。

但该方法显示波形速度较慢,不适合高速显示的应用。

2.2 Windows API函数显示波形在VB中两点间连线的另一种方法是用Windows API函数,Win32 API 提供了以下两个函数,联合使用可实现波形的快速显示,经过测试,显示速度比使用Line方法快70%以上。

LineTo函数:函数功能:画出由数组定义的点连接的一系列线段。

函数原型:BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);参数:hdc:设备环境句柄。

nXEnd:定义线段终点的X坐标。

nYEnd:定义线段终点的Y坐标。

返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。

MoveToEx函数:函数功能:将当前位置更新为指定的点,并有选择的返回原先的位置。

函数原型:BOOL MoveToEx (HDC hdc,int X,int Y,LPPOINT lpPoint);参数:hdc:设备环境句柄。

X:定义新位置的X坐标(逻辑坐标)。

Y:定义新位置的Y坐标(逻辑坐标)。

lpPoint:指向一个POINT结构,结构中存放原先的位置。

若此参数为NULL,则不返回原先的位置返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。

在连接线段时,首先将检测数据放入一个数组中,用MoveToEx函数定位画线的起始点坐标,然后用LineTo函数画出起始点至下一个点之间的线段,再用MoveToEx将画线的起始点定位到下一个点,继续用LineTo函数画线,如此循环,即可将离散点连接成波形。

例:zz = MoveToEx(Picture1.hdc, i, Mwave(i ), LpPoint1)zz = LineTo(Picture1.hdc, i, Mwave(i+1))实时波形显示界面程序代码:COLORREF m_crTextColor;//标签文字颜色COLORREF m_crBGColor;//背景颜色COLORREF m_crGridColor;//栅格颜色CString m_strMaxLabel;//最大值之处的标签CString m_strMinLabel;//最小值之处的标签bool m_bShowMinMax;//最小最大值显示bool m_bShowGrid;//是否显示栅格bool m_bStylesModified;//是否被修改int m_nMoveOffset;//偏移int m_nMaxCoords;//最大缓冲int m_nMaxPeek;//显示数据的最大值int m_nMinPeek;//显示数据的最小值int m_nGridSize;//栅格间距int m_nPeekOffset;//峰值偏移其实现方法包括:程序代码:bool CreateFromStatic( UINT nStaticID, CWnd* pParent );//该方法用于创建控件实例,通常在对话框初始化函数中调用,nStaticID为控件ID,pPatent为创建在那个窗口中的ID。

LPCTSTR GetLabelForMax() const;//获取最大值处的标签LPCTSTR GetLabelForMin() const; //获取最大值处的标签COLORREF GetBGColor() const;//获得背景色COLORREF GetGridColor() const;//获得栅格颜色void SetBGColor(COLORREF crColor);void SetGridColor(COLORREF crColor);void SetTextColor(COLORREF crColor);COLORREF GetLineColor( UINT uiLineID );//该方法用于获得ID号为uiLineID的波形的线条颜色,因为要在波形控件中画线必须先调用bool AddLine( UINT uiLineID, COLORREF crColor );创建一个波形,ID 号为uiLineID。

相关主题