打印

怎样计算谐波???

[复制链接]
2143|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我通过NI-6221采集了一个1KHz的正弦波信号,现在要通过FFT变换后计算其THDN,但结果总不对,不知是什么问题.
请大家指点下,我现在贴出相关代码:


//采样频率   
#define SCANFREQ     210000  
//采样点数
#define SCANCOUNT    4096
#define PI
   3.1415926535897932384626433832795028841971         
//定义圆周率值


/*********************************************/
// FFT 变量声明
/*********************************************/
//系数
#define
FFTOUTCOEF
(SCANCOUNT / 2) / 1.4142
//??此处为什么要除以1.4142??
//中间数据的实部
double xr[SCANCOUNT];
//中间数据的虚部
double xi[SCANCOUNT];
//旋转因子的实部
double rCf[SCANCOUNT];
//旋转因子的虚部
double iCf[SCANCOUNT];
double v_iOutaver;


/*********************************************/
// FFT 函数声明
/*********************************************/
void  Calculcf();
// 计算旋转因子
void  ChangeOrder(double *,double *,int);
//数据作蝶形排列
void  Fft(double *,int );
void  FftConvert(double *,int );


/*********************************************/
// 计算旋转因子
/*********************************************/


void Calculcf()
{

long int itemp;

for(itemp=0;itemp<SCANCOUNT;itemp++)

{

rCf[itemp]=cos(itemp*PI*2/SCANCOUNT);

iCf[itemp]=sin(itemp*PI*2/SCANCOUNT);

}     
}


/*********************************************/
// 数据作蝶形排列
/*********************************************/


void ChangeOrder(double xr[], double xi[], int N)


{

int LH,N1,I,J,K;

double T;

LH= N/2;J=LH;N1=N-2;

for(I=1;I<=N1;I++)

{

if(I<J)

{

T=xr[I]; xr[I]=xr[J];xr[J]=T;

T=xi[I]; xi[I]=xi[J];xi[J]=T;

}



K=LH;

while(J>=K)

{

J=J-K;

K=(int) (K/2+0.5);

}

J=J+K;

}
}








/*********************************************/
// FFT函数实现
/*********************************************/


void Fft(double xr[],int npoint)
{

int L,B,J,P,k,N,M;

int iloop;



double rPartKB,iPartKB;

N=1;

M=0;



for(iloop=0;iloop<npoint;iloop++)   xi[iloop]=0;







do{

   N=2*N;

   M++;

}while(N<npoint);





ChangeOrder(xr,xi,N);


   for(L=1;L<=M;L++)


   {

B=(int)(pow(2,(L-1))+0.5);

for(J=0;J<=B-1;J++)

{

P=J*((int)(pow(2,(M-L))+0.5));

for(k=J;k<=N-1;k+=(int)(pow(2,L)+0.5))

{

rPartKB=xr[k+B]*rCf[P]-xi[k+B]*iCf[P];

iPartKB=xi[k+B]*rCf[P]+xr[k+B]*iCf[P];

xr[k+B]=xr[k]-rPartKB;

xi[k+B]=xi[k]-iPartKB;

xr[k]=xr[k]+rPartKB;

xi[k]=xi[k]+iPartKB;

}



}



}
}


/*********************************************/
// FFT函数调用
/*********************************************/
void  FftConvert(double xrt[],int npoint )


{
    int iloop;


    Calculcf();


    for(iloop=0;iloop<npoint;iloop++)  xr[iloop]=xrt[iloop];  



Fft(xr,npoint);


    for(iloop=0;iloop<npoint;iloop++)
    xr[iloop]=sqrt(xr[iloop]*xr[iloop]+xi[iloop]*xi[iloop]) / FFTOUTCOEF;
//此处为什么要除以FFTOUTCOEF???


}




/*********************************************/
// 计算THD+N
/*********************************************/
double WINAPI PXI_THD(double *VarrayThd) //数组VarrayThd存放的是6221采集的数据
{

static double THDN;

v_iOutaver=0;



for(ii=0;ii<SCANCOUNT;ii++)

{

v_iOutaver += VarrayThd[ii];

}



v_iOutaver/=SCANCOUNT;







for(ii=0; ii<SCANCOUNT; ii++)

{

VarrayThd[ii] -= v_iOutaver;



}







FftConvert(VarrayThd,SCANCOUNT);




/*********************************************/

// 计算失真度,10个谐波

/*********************************************/



THDN=0;

for( ii=1; ii<=HarmonicNum; ii++)

{

THDN=THDN+xr[20+20*ii]*xr[20+20*ii]; //????为什么要取步长为20???

}



THDN=sqrt(THDN)/xr[20];
//????xr[20]应该为基波,为什么基波不是xr[1]呢,xr[0]为直流分量



return THDN;

}

相关帖子

沙发
zhoucool|  楼主 | 2012-8-7 09:18 | 只看该作者
自己先顶一下,高手在哪里呢?

使用特权

评论回复
板凳
lhkjg| | 2012-8-9 09:26 | 只看该作者
基波应该是XR[1]啊!0是直流分量没有错。
谐波分量里面应该不需要在做平方计算了吧,你只需要吧FFT结果里面的奇次数组处【1】外的值加起来就是谐波分量的

使用特权

评论回复
地板
zhoucool|  楼主 | 2012-8-9 10:40 | 只看该作者
本帖最后由 zhoucool 于 2012-8-9 12:10 编辑

3Q. 1.我查过资料的,求谐波时,要用各次谐波(除基波外)分量的平方和再开平方除以基波,结果就是THD了.公式见附件.
2.我计算多次谐波,为什么只需把"奇次数组处【1】外的值加起来就是谐波分量的"呢,不是数组0为直流分量,数组1为基波分量,数组2为二次谐波,数组3为三次谐波吗...,依次类推.
3.若奇次数组相加,那步长为2,有的资料上又不是2,我都快被搞晕了.
烦请解惑下,再次3Q!!!
[local]1[/local]

谐波公式.jpg (11.32 KB )

谐波公式.jpg

使用特权

评论回复
5
GavinZ| | 2012-8-27 21:20 | 只看该作者
labview里应该有现成的函数,为什么还有搞C语言呢。

使用特权

评论回复
6
zhoucool|  楼主 | 2012-8-28 09:25 | 只看该作者
5# GavinZ
我们公司那个项目就是用vc6.0开发的,THDN当然也是用VC的了.

使用特权

评论回复
7
nethopper| | 2016-5-4 12:22 | 只看该作者
能保证整周期采样吗?否则泄漏灰常滴大

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

4

帖子

0

粉丝