离散余弦变换的函数如下:
void DCT(double *data,int len,double * dct,int dctnum)
{
//double temp[100];
//memset(temp,0,100*sizeof(double));
//memcpy(temp,data,len*sizeof(double));
double k = pow(2.0/(double)len,0.5);
for(int i=0;i<dctnum;i++)
{
for(int j=0;j<len;j++)
{
double d = data[j];
if(d > std::numeric_limits<double>::min())
{
double d1 = log(data[j]);
double d2 = cos(i*(j-0.5)*3.141592653589793/len);
double d3 = d1 * d2;
double d5 = dct[i];
d5 += d3;
dct[i] += d3;
}
//dct[i] += log(data[j])*cos(i*(j-0.5)*3.141592653589793/len);
}
double md = dct[i];
dct[i] *= k;
}
//double temp2[100];
//memset(temp2,0,100*sizeof(double));
//memcpy(temp2,dct,dctnum*sizeof(double));
//int n = 0;
}
在这个算法中输入源数据可能为0,这时log函数将溢出。所以先判断输入数据是否为0,判断的算法如下:
double d = data[j];
if(d > std::numeric_limits<double>::min())
if(d > std::numeric_limits<double>::min())
{
}
}
这里使用了一个c++标准库中的极小值,当一个double数大于他时就认为不是0。当数据有效是在处理,否则不处理。