信号处理中的小提升法小波变换与曲线拟合


//附件中白色曲线为原始信号
//红色为加过干扰的信号
//黄色为小波滤波后的结果
//绿色为对小波滤波后的信号进行拟合的结果
//本代码在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;
}

你可能感兴趣的:(c,算法,ini)