用CVI编写个小东西时,发现曲线的拟合已经到了1秒多才能完成一次曲线的拟合。
代码如下:
static void curveFitt (double *pdst,const double *psrc,int len)
{
const double wind_w=0.4;
double mypower = pow(10,wind_w/2);
memcpy(pdst,psrc,len*sizeof(double));
//DEBUG("MYPOWER[%f]",mypower);
for(int i=(int)mypower+1; i<= len-1 ; i++)
{
int index_start = (int)( ((double)i/mypower)+(double)1.0);
int index_end = (int)((double)i*mypower)+1;
index_end = (index_end>=(len-1))?(len-1):index_end;
*(pdst+i)= mysum(psrc,index_start,index_end)/(index_end-index_start+1);
//DEBUG("i[%d],START[%d],end[%d]\n\r",i,index_start,index_end);
}
return ;
}
//主函数调用处:
{
……
//曲线拟合
long time_s = GetTickCount();
curveFitt(myFFTHdr.p_fftResult_im,myFFTHdr.p_fftResult_re,ifftPoint>>1);
long time_e = GetTickCount();
DEBUG("curve Fitt diffTime:%d\n\r",time_e-time_s);
……
}
实际效果如下(绿线是经过拟合的):
执行时间如下:
优化方向:
1.减少计算的点数,代码如下:
typedef struct __curveData__ {
int len;//点数
double *pX;//x坐标数组
double *pY;//Y坐标数组
}curveData;
//曲线平滑//
#define nPointOfCurveFitt 256 //平滑处理时建议的点数(最终并不一定取到)
#define wideOfFitt 0.4
static void curveFitt (curveData *pdst,curveData *psrc)
{
double wind_w , wind_w2, mypower;
int index_start,index_end;
int i,j,i_tmp;
wind_w = 0.4 ; //平滑窗的大小
wind_w2 = log10(psrc->len)/nPointOfCurveFitt; //点数窗
mypower = pow(10,wind_w/2);
//mypower2 = pow(10,wind_w);
j=0;
//DEBUG("wind_w[%f],mypower[%f],\n\rdst_len[%d],src_len[%d]\n\r",wind_w,mypower,pdst->len,psrc->len);
for(i=(int)mypower+1; i<= psrc->len-1 ;)
{
index_start = (int)( ((double)i/mypower)+(double)1.0);
index_end = (int)((double)i*mypower)+1;
index_end = (index_end>=(psrc->len-1))?(psrc->len-1):index_end;
*(pdst->pX+j)= *(psrc->pX+(int)(index_end+index_start)/2);
*(pdst->pY+j)= mysum(psrc->pY,index_start,index_end)/(index_end-index_start+1);
i_tmp = (int)(pow(10,(log10(i)+wind_w2))+0.5);
//DEBUG("i[%d],j[%d],i_tmp[%d],pdst->x[%f],pdst->y[%f]\n\r",i,j,i_tmp,*(pdst->pX+j),*(pdst->pY+j));
//Sleep(1000);
i=(i_tmp>i)?i_tmp:(i+1);
j++;
j=(j>=nPointOfCurveFitt)?nPointOfCurveFitt-1:j;
}
//DEBUG("%s\n\r",__func__);
pdst->len = j;
return ;
}
实际测试:
运行时间:
------
基本上256点都是在ms级,可以接受。【期待:录音采集在100ms采集一次并运算一次】