⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rls.c

📁 用c编的一个RLS自适应滤波功能验证程序
💻 C
字号:
#include "stdio.h"
#include "math.h"
#include<stdlib.h>
#define pi 3.1415926
#define delta 0.001
#define Lambda 0.98



double uniform(double a,double 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);
}


double gauss(double mean,double sigma,long int *s)
{
int i;
double x,y;
x=0.0;
for(i=0;i<12;i++)
x+=uniform(0.0,1.0,s);
x=x-6.0;;
y=mean+x*sigma;
return(y);
}
void data_save(FILE* fp,double *data,int M)
{
	int i;
	if((fp=fopen("RLS","wb"))==NULL)
	{
		printf("cannot open file\n");
		return;
	}
	for(i=0;i<M;i++)
		if(fwrite(&data[i],sizeof(double),1,fp)!=1)
			printf("file write error\n");
	fclose(fp);
}
void main()	
{

int i,j;
       //时域抽头RLS算法滤波器阶数
double *d;
double *w;
double *x;
double *error;
double *g;
double *p;
double *u;
double *z;
double *y;
long int s=13579;
FILE *fp;

int N=2048;   //输入信号抽样点数
int k=64; 

d=(double *)malloc(N*sizeof(double));
error=(double *)malloc(N*sizeof(double));
x=(double *)malloc(N*sizeof(double));
g=(double *)malloc(k*sizeof(double));
w=(double *)malloc(k*sizeof(double));
p=(double *)malloc(k*k*sizeof(double));
y=(double *)malloc(N*sizeof(double));
u=(double *)malloc(k*sizeof(double));
z=(double *)malloc(k*sizeof(double));
for(i=0;i<N;i++)
{
d[i]=sin(0.05*pi*i);
x[i]=d[i]+gauss(0.0,0.3,&s);
error[i]=0;
if(i>=k)y[i]=0;
}
for(i=0;i<k;i++)
{
for(j=0;j<k;j++)
{
	if(i==j)
p[i*k+j]=delta;
	else
		p[i*k+j]=0;
}
}
for(i=0;i<k;i++)
{
	y[i]=x[i];
    w[i]=0;
    g[i]=0;
	z[i]=0;
	u[i]=0;
}           for(i=k-1;i<=N-1;i++)
			{

int c;
double f;
double tt;

c=0;
for(j=i;j>=i-k+1;j--) 
{
	u[c]=x[j];
	c=c+1;
}

tt=0;
for(c=0;c<k;c++)
{
	
tt=tt+w[c]*u[c];
}
y[i]=tt;
    for(c=0;c<k;c=c+1)
	{
		z[c]=0;
		for(j=0;j<k;j=j+1)
		{
			z[c]=z[c]+u[j]*p[k*j+c];
		}
	}
	f=0;
    for(c=0;c<k;c++)
	{
		
    f=f+z[c]*u[c];
	}
	f=f+Lambda;
   for(c=0;c<k;c++)
   {
      g[c]=z[c]/f;
   }
error[i]=d[i]-y[i];
printf("%f\n",error[i]);
for(c=0;c<k;c++)
{
w[c]=w[c]+g[c]*error[i];
}

for(j=0;j<k;j++)
{
	for(c=0;c<k;c++)
	{

    p[j*k+c]=(p[j*k+c]-g[j]*z[c])/Lambda;
	}
}

			}

data_save(fp,error,N);			
free(d);
free(w);
free(x);
free(error);
free(g);
free(p);
free(u);
free(z);
free(y);	
}

⌨️ 快捷键说明

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