金牌会员
 
- 积分
- 1020
- 金钱
- 1020
- 注册时间
- 2014-9-4
- 在线时间
- 199 小时
|
发表于 2015-5-24 21:35:02
|
显示全部楼层
做过的东西:
g_DSO为结构体,下面为它的部分成员,_usFFTPoints为点数(64/256/1024)
uint32_t FFTIN [1024];
uint32_t FFTOUT[1024];
uint16_t FFTMAG[512];
uint32_t FFTPHASE[512];
cr4_fft_1024_stm32(g_DSO.FFTOUT,g_DSO.FFTIN,_usFFTPoints);
/******************************************************************************************
* 每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)
* 进行FFT变换,并计算各次谐波相位
* The phase value is in the range [-pi: pi].
*******************************************************************************************/
void  ower_Phase_Radians(uint16_t _usFFTPoints)
{
int16_t lX,lY;
uint16_t i;
for (i=0; i <(_usFFTPoints >> 1); i++)
{
lX= (g_DSO.FFTOUT<<16)>>16; /* 虚部 取低16bit,sine_cosine --> cos */
lY= (g_DSO.FFTOUT >> 16); /* 实部 取高16bit,sine_cosine --> sin */
{
float X = (float)lX;
float Y = (float)lY;
float phase = atan2(X,Y);
if (X>0)
{
// if (X>=0);
// //phase+=PI2;
// else
// phase+=PI;
}
else
{
// if (Y>=0)
// phase+=PI2;
// else
// {
// phase = -phase;
phase+=PI2;
// }
}
g_DSO.FFTPHASE = phase* 180.0/PI;
}
}
}
/******************************************************************************************
* 每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)
* 进行FFT变换,并计算各次谐波幅值
*******************************************************************************************/
void  owerMag(uint16_t _usFFTPoints)
{
int16_t lX,lY;
uint16_t i;
if(_usFFTPoints == 1024)
{
_usFFTPoints = 512;
}
else if(_usFFTPoints == 256)
{
_usFFTPoints = 256;
}
else
{
_usFFTPoints = 64;
}
/* 计算幅值 */
for (i=0; i < _usFFTPoints; i++)
{
lX= (g_DSO.FFTOUT<<16)>>16; /* sine_cosine --> cos */
lY= (g_DSO.FFTOUT>> 16); /* sine_cosine --> sin */
{
// float X= 1024*((float)lX)/32768;
// float Y = 1024*((float)lY)/32768;
// float Mag = sqrt(X*X+ Y*Y)/1024;
float X= (float)lX/32;
float Y = (float)lY/32;
float Mag = sqrt(X*X+ Y*Y)/1024;
g_DSO.FFTMAG= (uint32_t)(Mag*65536);
}
}
} |
|