//附件中白色曲线为原始信号
//红色为加过干扰的信号
//黄色为小波滤波后的结果
//绿色为对小波滤波后的信号进行拟合的结果
//本代码在C、C++、CVI、Keil C51下通过,占用一定的空间,但速度快。在C51下建议适当减少数组长度。
//QXNH:曲线拟合函数
//x:Double 形一维数组 横坐标 input
//y:Double 形一维数组 纵坐标 input
//n:整形 数组中要进行运算的元素个 input
//index:整形 需要进行拟合的维数 input
//a:Double 形一维数组 多项式系数 长度为index+1 output
//afa:Double 形一维数组 x平均值 长度为index+1 output
//beida:Double 形一维数组 修正系数 长度为index+1 output
//公式为:Yn=a[0]-beida[0]+a[1]*(Xn-afa[1])-beida[1]+a[2]*(Xn-afa[2])*(Xn-afa[2])-beida[2]……
//如进行一维拟合即index=1;Yn=a[0]+a[1]*(Xn-afa[1])-beida[1]
//如进行二维拟合即index=2;
// Yn=a[0]-beida[0]+a[1]*(Xn-afa[1])-beida[1]+a[2]*(Xn-afa[2])*(Xn-afa[2])-beida[2]
//另,本函数有数组长度限制为100,如需加大可改变fai[100][100]及xfai[100]的声明
int QXNH(double *x,double *y,int n,int index,double *a,double *afa,double *beida) ;
//DB4DLiftWT:提升算法的DB4一维小波变换
//inputArray:Double 形一维数组 input
//outputArray:Double 形一维数组 output
//pS:Double 形一维数组 临时数组 不必赋值 长度与inputArray相同 input
//pD:Double 形一维数组 临时数组 不必赋值 长度与inputArray相同 input
//num:整形 inputArray的数组长度 input
int DB4DLiftWT(double *inputArray,double *outputArray,double *pS,double *pD,int num);
double neiji(double *b,double *c,int loop)
{
int p;
double nj=0;
for (p=0;p<loop;p++)
nj+=c[p]*b[p];
return nj;
}
int QXNH(double *x,double *y,int n,int index,double *a,double *afa,double *beida)
{
int i,j,k,flag;
double fai[100][100],xfai[100];
pcpfh=0;
afa[1]=0;
a[0]=0;
if(n>100) n=100;
if(index>20) index=10;
for(i=0;i<n;i++)
{
afa[1]+=x[i];
a[0]+=y[i];
fai[0][i]=1;
}
afa[1]=afa[1]/n;
a[0]=a[0]/n;
for (i=0;i<n;i++)
{
fai[1][i]=x[i]-afa[1];
}
a[1]=neiji(fai[1],y,n)/neiji(fai[1],fai[1],n);
for(k=1;k<index;k++)
{
for(i=0;i<n;i++)
xfai[i]=x[i]*fai[k][i];
afa[k+1]=neiji(fai[k],xfai,n)/neiji(fai[k],fai[k],n);
beida[k]=neiji(fai[k],fai[k],n)/neiji(fai[k-1],fai[k-1],n);
for(j=0;j<n;j++)
fai[k+1][j]=(x[j]-afa[k+1])*fai[k][j]-beida[k]*fai[k-1][j];
a[k+1]=neiji(fai[k+1],y,n)/neiji(fai[k+1],fai[k+1],n);
}
return 0;
}
int DB4DLiftWT(double *inputArray,double *outputArray,double *pS,double *pD,int num)
{
int i,half=num>>1;
for(i=0;i<half;i++)
{
pS[i]=inputArray[2*i];
pS[half+i]=inputArray[2*i+1];
pD[i]=inputArray[2*i+1];
pD[i+half]=inputArray[2*i];
}
for(i=0;i<half;i++)
{
pS[i]=pS[i]+pD[i]*sqrt(3);
pS[i+half]=pS[i+half]+pD[i+half]*sqrt(3);
}
for(i=0;i<half;i++)
{
pD[i]=pD[i]-sqrt(3)*pS[i]/4-(sqrt(3)-2)*pS[(i-1)>=0?(i-1):(half+i-1)]/4;
pD[i+half]=pD[i+half]-sqrt(3)*pS[i+half]/4-(sqrt(3)-2)*pS[(i-1+half)>=half?(i-1+half):(half+half+i-1)]/4;
}
for(i=0;i<half;i++)
{
pS[i]=pS[i]-pD[(i+1)%half];
pS[i+half]=pS[i+half]-pD[(i+1+half)%half];
}
for(i=0;i<half;i++)
{
pS[i]=(sqrt(3)-1)*pS[i]/sqrt(3);
pD[i]=(sqrt(3)+1)*pD[i]/sqrt(3.5);
pD[i+half]=(sqrt(3)+1)*pD[i+half]/sqrt(3.5);
}
for(i=0;i<half;i++)
{
outputArray[2*i]=inputArray[2*i]+pD[i];
outputArray[2*i+1]=inputArray[2*i+1]+pD[i+half];
}
outputArray[0]=inputArray[0];
outputArray[1]=inputArray[1];
outputArray[num-1]=inputArray[num-1];
return 0;
}