用VC++实现对波形数据的频谱分析
2008-11-13 19:31:09 来源:WEB开发网时域信号的频谱分析
首先要将从外设输入或采集的时域波形数据经抽样量化后,通过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++;
}
……
更多精彩
赞助商链接