WEB开发网
开发学院软件开发VC 用VC++实现对波形数据的频谱分析 阅读

用VC++实现对波形数据的频谱分析

 2008-11-13 19:31:09 来源:WEB开发网   
核心提示: 时域信号的频谱分析首先要将从外设输入或采集的时域波形数据经抽样量化后,通过CFile类的Open(……)、Read(……)等成员函数将其读取到缓存中,用VC++实现对波形数据的频谱分析(3),并将其转化为复变量存放于复变量数组A中,同

时域信号的频谱分析

首先要将从外设输入或采集的时域波形数据经抽样量化后,通过CFile类的Open(……)、Read(……)等成员函数将其读取到缓存中,并将其转化为复变量存放于复变量数组A中。同时需要验证数据量的长度是否为2的整数次幂,如不是则用0来补齐,否则无法用“蝴蝶图”进行分解运算。下面代码用于完成对原始采样时域序列的快速傅立叶变换,A、M分别表示指向原始采样数据数组的指针和序列长度的2的整数次幂:

……

Complex U,W,T;
int LE,LE1,I,J,IP;
int N=(int)pow(2,M);
//由于采用时间抽选奇偶分解方式,所以在参加运算前首先要对时间序列进行倒序
ReverseOrder(A,N);
int L=1;
while(L<=M)
{
LE=(int)pow(2,L);
LE1=LE/2;
U.Re=1.0f;
U.Im=0.0f;
//计算W算子的值
W.Re=(float)cos(PI/(1.0*LE1));
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<=N)
{
IP=I+LE1;
//复数运算A×U
T.Re=(float)A[IP-1].Re*U.Re-A
[IP-1].Im*U.Im;
T.Im=(float)A[IP-1].Re*U.Im+A
[IP-1].Im*U.Re;
//复数运算A-T
A[IP-1].Re=(float)A[I-1].Re-
T.Re;
A[IP-1].Im=(float)A[I-1].Im-
T.Im;
//复数运算A+T
A[I-1].Re+=T.Re;
A[I-1].Im+=T.Im;
I+=LE;
}
float temp=U.Re;
//复数运算U×W
U.Re=(float)U.Re*W.Re-U.Im*
W.Im;
U.Im=(float)temp*W.Im+U.Im*
W.Re;
J++;
}
L++;
}
……

上一页  1 2 3 4  下一页

Tags:VC 实现 波形

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接