📄 dataprocessing.c
字号:
#include "talkthrough.h"
int InReal[FFT_TAPS];//输入序列的实部
int InImage[FFT_TAPS];//输入序列的虚部
static section("section_OutReal") int OutReal[FFT_TAPS];
//输出频谱的实部
static section("section_OutImage") int OutImage[FFT_TAPS];
//输出频谱的虚部
float Magnitude[FFT_TAPS];//输出频谱的幅度
int Window;//窗函数状态标志:0--矩形窗,1--汉明窗
float W[FFT_TAPS];//窗函数
int OutBuf[FFT_TAPS/2];
/****************初始化缓冲区******************/
void InitInput(void)
{
int i;
for (i=0;i<FFT_TAPS;i++)
{
InImage[i]=0;//将输入序列的虚部清零
}
}
/****************初始化窗函数******************/
void InitWindow(void)
{
int i;
if (Window==0) for(i=0;i<FFT_TAPS;i++)
W[i]=1.0;//产生矩形窗
if (Window==1) for(i=0;i<FFT_TAPS;i++)
W[i]=0.54-0.46*cos(2*PI*i/(FFT_TAPS-1));//产生汉明窗
}
/***************信号处理程序部分*******************/
void ProcessData(void)
{
int i;
float *fptr;
float MinNum,MaxNum,AvgNum,NumRange;
if(Ready2FFT)//如果数据块采集满就进行FFT
{
for(i=0;i<FFT_TAPS;i++)
InReal[i]=(int)((float)InReal[i]*W[i]);
fft64(InReal,InImage,OutReal,OutImage);//调用库函数完成FFT运算
for(i=0;i<FFT_TAPS;i++)//计算频谱的幅度
Magnitude[i]=sqrt((float)OutReal[i]*(float)OutReal[i]+(float)OutImage[i]*(float)OutImage[i]);
///////////对结果进行对数量化/////////
for(i=0;i<FFT_TAPS;i++)//计算频谱的幅度的对数值
Magnitude[i]=20*log10(Magnitude[i]);
MinNum = 32767;MaxNum = -32768;//量化为D/A格式
AvgNum = 0;
fptr = &Magnitude[0];
for( i=0 ; i<FFT_TAPS ; i++ )
{
MaxNum = MaxNum > *fptr ? MaxNum : *fptr;
MinNum = MinNum < *fptr ? MinNum : *fptr;
AvgNum += *fptr;
fptr++;
}
AvgNum=AvgNum/FFT_TAPS;
NumRange=MaxNum-MinNum;
for(i=0;i<FFT_TAPS/2;i++)
OutBuf[i]=(int)(32768*(Magnitude[i]-AvgNum)/NumRange);
OutBuf[0]=0;//不显示直流分量
////////////量化结束////////////
Ready2FFT=0;//启动新数据块的采集
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -