adaptivelms.txt

来自「用自适应数字滤波器进行谱线增强,噪声信号是均值为零,方差为1的高斯白噪声」· 文本 代码 · 共 89 行

TXT
89
字号
double gauss(mean,sigma,s)
double mean,sigma;
long int *s;
{int i;double x,y;
  double uniform();
  for(x=0,i=0;i<12;i++)
    x+=uniform(0.0,1.0,s);
  x=x-6.0;
  y=mean+x*sigma;
  return(y);
}

double uniform(a,b,seed)
double a,b;
long int *seed;
{double t;
   *seed=2045*(*seed)+1;
   *seed=*seed-(*seed/1048576)*1048576;
   t=(*seed)/1048576.0;
   t=a+(b-a)*t;
   return(t);
}

void lms(x,d,y,n,w,m,mu)
int m,n;
double mu,d[],x[],y[],w[];
{int i,k;
 double e;
 for(i=0;i<m;i++)
    {w[i]=0.0;}
 for(k=0;k<m;k++)
    {y[k]=0.0;
    for(i=0;i<=k;i++)
      {y[k]+=x[k-i]*w[i];}
    e=d[k]-y[k];
    for(i=0;i<=k;i++)
       {w[i]+=2.0*mu*e*x[k-i];}
   }
 for(k=m;k<n;k++)
   {y[k]=0.0;
     for(i=0;i<m;i++)
        {y[k]+=x[k-i]*w[i];}
     e=d[k]-y[k];
     for(i=0;i<m;i++)
       {w[i]+=2.0*mu*e*x[k-i];}
    }
  }
  
  
#include"stdio.h"
#include"math.h"
main()
{int i,m,n;
  long seed;
  double mu,pi,mean,sigma;
  static double d[501],x[501],y[501],w[501];
  FILE *fp;
  pi=4.0*atan(1.0);
  mean=0.0;
  sigma=0.0;
  seed=13579l;
  n=500;
  for(i=0;i<n;i++)
    { d[i]=sqrt(2.0)*sin(2*pi*i/20.0);
      d[i]+=gauss(mean,sigma,&seed);
    }
  for(i=0;i<(n-1);i++)
     { x[i+1]=d[i];}
  fp=fopen("lmsd.dat","w");
  for(i=0;i<n;i++)
      {printf("%d %lf\n",i,d[i]);}
   fclose(fp);
   m=20;
   mu=0.0005;
   lms(x,d,y,n,w,m,mu);
   printf("\n The Coefficients of Adaptive Filter\n");
   for(i=0;i<m;i+=4)
     {printf("       %10.7f      %10.7f",w[i],w[i+1]);
      printf("       %10.7f      %10.7f",w[i+2],w[i+3]);
      printf("\n");
     }
   fp=fopen("lmsy.dat","w");
   for(i=0;i<n;i++)
      {fprintf(fp,"%d   %lf\n",i,y[i]);}
   fclose(fp);
 }
      

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?