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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

要计算一个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-08

100.00 9.67593E-04 9.67531E-04 6.14332E-08

200.00 8.75203E-04 8.75150E-04 6.25092E-08

300.00 7.36904E-04 7.36849E-04 6.39413E-08

400.00 5.72852E-04 5.72787E-04 6.52926E-08

500.00 4.05351E-04 4.05285E-04 6.61362E-08

600.00 2.54638E-04 2.54572E-04 6.61847E-08

700.00 1.35403E-04 1.35338E-04 6.53870E-08

800.00 5.47602E-05 5.46963E-05 6.39612E-08

900.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-08

2700.009.16539E-069.09679E-06 6.86075E-08

2800.00 4.53216E-06 4.46500E-06 6.71550E-08

2900.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实现数字波形显示程序减小字体增大字体作者:佚名来源:本站

相关文档
最新文档