VC编程实现对波形数据的频谱分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
V C编程实现对波形数据
的频谱分析
Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】
法在实际运用中无法保证当点数较大时的运算速度,无法满足对信号的实时处理。
根据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次运算,改善比。
N=2048时:DFT需4194304次运算,FFT仅需11264次运算,改善比达到。
三、 "时间抽选奇偶分解快速离散傅立叶变换"的程序实现
当采样点数较多时,如变换前和变换后的序列都按自然顺序排列,则中间运算过程会占用大量的中间存储单元,造成效率的低下和存储单元的浪费。根据FFT的实现原理我们可以对采样序列进行逐次奇偶抽选,打乱以前的次序重新排序,然后按此顺序参加运算,可以实现"即位运算"提高存储单元的利用率。
(一)复数的描述方法
进行傅立叶变换时不可避免的要用到复数,而在VC中并没有现成的可用于表示复数的数据类型,可以自己定义一个含有两个成员变量的数据结构来表示复数,这两个成员变量可分别用于表示复数的实部与虚部:
注:在此,FFT运算结果都倍乘了系数10毫秒(秒)。
在分析结果中产生了误差,是由于待分析的连续时间信号不具备离散性或周期性,也可能有无限长度。为了适应FFT方法的需要,对波形进行了抽样和截断,这样再用程序分析采样数据必然会引入误差,从分析结果可以看出,频率越高,误差波动也越大,此分析结果产生的误差在允许范围之内,是一个可以满意的近似。实践证明,本程序的算法是正确可靠的。
小结:
DFT尤其是FFT的应用已遍及各个科学领域,"DFT的应用"与 "FFT的应用"几乎成为同义语。通过本文介绍和程序示例可以清楚的看到FFT方法在直接处理离散信号数据的作用,而且也可以很好的用于对连续时间信号分析的逼近。本程序在Windows 2000 Professional下、由Microsoft Visual C++ 编译通过
用VB实现数字波形显示程序减小字体增大字体作者:佚名来源:本站整理发布时间:2009-07-15 18:03:17
id=126063>
摘要:本文详细介绍了在VB集成环境下数字波形高速显示的方法,同时对双通道波形显示和数字滤波方法也进行了介绍。
关键词:数字;波形;显示;滤波
1 前言:
随着计算机技术及电子技术的发展,数字采集技术在检测领域的应用越来越广泛,检测速度越来越高,检测的数据量越来越大,特别是在无损检测领域,将检测数据通过计算机处理后绘制出波形,并实时显示,对及时发现伤损、分析伤损具有重要意义。
2 波形显示
检测数据通常是离散的数据,将离散的数据绘制出波形,可通过在两点间连接线段的方法实现。
用Line方法显示波形
VB提供了Line画直线方法,可在窗体上增加一个图片框控件,适当设置
图片的大小和背景颜色,用Line方法将离散数据按检测顺序连接成线段,即可将波形显示在图片框中。但该方法显示波形速度较慢,不适合高速显示的应用。
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, i, Mwave(i ), LpPoint1)
zz = LineTo, i, Mwave(i+1))
实时波形显示界面
通常计算机需要接收外部实时发送的数据并用十分形象的方式显示出来。例如柱状图、饼图等等。本应用程序则采用波形的形式显示,并接将之设计为可以接收多路数据的波形显示界面。本应用程序在VS2008环境下调试通过,源码下载连接如下。
一.程序界面
点击该图放大
上图中显示了两路波形即三角波和正弦波,当然这两路波形是由程序计算出来的并不是从外部接收的。实际工作中则可以配合串口通讯设备接收它发来的数据并显示出来。
二.波形控件类介绍
本程序的实现主要依赖于那个波形显示控件。从下载连接那里可以下载该源码,里面的文件中,和即是该控件的类的定义文件和实现文件。分析之后得到该类的一些信息。其成员函数包括:
程序代码:
COLORREF m_crTextColor;用编程
运用该控件在VS2008环境下的编程步骤如下:
1.建立一个对话框的MFC工程,在对话框上按照上图所示的界面布置控件。其中波形控件那里布置一个Picture Control控件将其Modal Frame和Type均属性设置为true,其他均设置为False。注意给Picture Control取的ID!后面编程将会用到。
2.将波形控件类的定义文件和实现文件拷贝至你的工程目录下。但这实际上并没有将该类真正添加到你的工程下,需手动添加类。常规操作,不详述。
3.在对话框的定义和实现文件中分别添加如下代码:
程序代码:
#include ""
4.在对话框定义文件中(我给的供下载的例程中的是这个文件)中定义一个该控件类的变量:
程序代码:
private:C2DPushGraph m_PushGraph;
5.在对话框的实现文件中(我给的供下载的例程中的是这个文件)的对话框初始化函数中添加如下代码: