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

📄 zsy.c

📁 基于TI C5402芯片的的自适应滤波器的源代码。相关的头文件需要手动加载。
💻 C
字号:
#include "stdio.h"
#include "math.h"
#include <type.h>
#include <board.h>
#include <codec.h>
#include <mcbsp54.h>

#include <tms320.h>
#include <dsplib.h>

/*****************************************************************************/
/* Function Prototypes														 */
/*****************************************************************************/

/* This delay routine does not conflict with DSP/BIOS.  It is used in this  */
/* example rather than brd_delay_msec which causes DSP/BIOS conflicts just  */
/* because of this.  If you are not using DSP/BIOS, you can change the code */
/* to use brd_delay_msec.                                                   */
/*****************************************************************************/
/* Global Variables                                                          */
/*****************************************************************************/

HANDLE hHandset;
s16 data;

int i,m/*阶数*/,n/*抽样点数*/;
 long seed;
 double mu/*u*/,pi,mean,sigma;
 static double l[1001]/*input */,x[1001]/*input*/,y[1001]/*output*/,h[50];/*fir xishu*/
 static int num[1001];/*store info from generator*/
 FILE *fp;

void delay(s16 period);
double gauss(double mean,double sigma,long int *seed);/*random signal*/     
void lms(double x[],double l[],double  y[],int n,double h[],int m,double mu);

void main()                            
{                    
   s16 cnt=2;

    if (brd_init(100))
        return;

 pi=2.0*asin(1.0);
 mean=0.0;
 sigma=1.0;
 seed=13579;
 n=800;
 
/* blink the leds a couple timesd */
	while ( cnt-- )
	{
		brd_led_toggle(BRD_LED0);
		/* brd_delay_msec(1000); */
		delay(1000);
		brd_led_toggle(BRD_LED1);
		/* brd_delay_msec(1000); */
		delay(1000);
		brd_led_toggle(BRD_LED2);
		/* brd_delay_msec(1000); */
		delay(1000);
	}


    /* Open Handset Codec */
    hHandset = codec_open(HANDSET_CODEC);               /* Acquire handle to codec */

    /* Set codec parameters */
    codec_dac_mode(hHandset, CODEC_DAC_15BIT);          /* DAC in 15-bit mode */
    codec_adc_mode(hHandset, CODEC_ADC_15BIT);          /* ADC in 15-bit mode */
    codec_ain_gain(hHandset, CODEC_AIN_6dB);            /* 6dB gain on analog input to ADC */
    codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB);    /* -6dB gain on analog output from DAC */
    codec_sample_rate(hHandset,SR_16000);               /* 16KHz sampling rate */

i=0;
    /* Polling and digital loopback */
    while (1)
    {
       /* Wait for sample from handset */
       while (!MCBSP_RRDY(HANDSET_CODEC)) {};

       /* Read sample from and write back to handset codec */
      l[i] = *(volatile s16*)DRR1_ADDR(HANDSET_CODEC);
       
       
 
 //trans Q15 to float      
       
       l[i]=l[i]/32768;
       i++;
       if(i>n)break;
    }
 
 fp=fopen("lmsl.dat","w");
 for(i=0;i<n;i++)fprintf(fp,"%d %lf",i,l[i]);  /*将期望的信号l[i]写入文件*/
 fclose(fp);
 
 
 for(i=0;i<n;i++)
 { 
  //l[i]=1.4*sin(2*pi*i/20.0);/**/               
  l[i]+=gauss(mean,sigma,&seed);/**/   
            /* l[i]变成了受高斯噪声影响的信号*/
    }
 
 
 
 
 
 for(i=0;i<n-1;i++)x[i+1]=l[i];              /* 将l[i]延时作为输入信号*/
 fp=fopen("lmsx.dat","w");
 for(i=0;i<n;i++)fprintf(fp,"%d %lf",i,x[i]);  /*将x[i]写入文件*/
 fclose(fp);
  m=30;mu=0.001;
 lms(x,l,y,n,h,m,mu);                        /*用自适应算法处理信号*/
 for(i=0;i<m;i+=5)
 {printf("   %10.7f   %10.7f",h[i],h[i+1]);
  printf("   %10.7f   %10.7f",h[i+2],h[i+3]);
  printf("   %10.7f",h[i+4]);
  printf("\n");
 }
 fp=fopen("lmsy.dat","w");
 for(i=0;i<n;i++)fprintf(fp,"%lf,",y[i]);   /*将输出序列写入文件*/
 fclose(fp);
  //return 0;
}


void lms(double x[],double l[],double y[],int n,double h[],int m,double mu)          /*自适应算法*/
                                         /*  x为输入,y为输出,d为期望输出,h为滤波器系数,m为滤波器阶数,mu为收敛因子*/
{
 int i,k;
 double e;
 x[0]=0.0;
 for(i=0;i<m;i++)
 h[i]=0.0;                /* 初始化滤波器系数*/
 for(k=0;k<m;k++)                          /* k<m时求y */                         
  {
  y[k]=0.0;
  for(i=0;i<=k;i++)y[k]+=x[k-i]*h[i];       /* 用卷积求得输出响应*/
  e=l[k]-y[k];                              /* 求得实际输出与期望响应的差值*/    
  for(i=0;i<=k;i++)h[i]+=2.0*mu*e*x[k-i];   /* 根据差值调整滤波器系数*/
  }
  for(k=m;k<n;k++)                           /*  k>=m时求y */
  {
  y[k]=0.0;
  for(i=0;i<m;i++)y[k]+=x[k-i]*h[i];
  e=l[k]-y[k];
  for(i=0;i<m;i++)h[i]+=2.0*mu*e*x[k-i];
  }
}

double gauss(double mean,double sigma,long int *seed)   /*产生正态分布序列*/
                                    /*为正态分布的的均值,为正态分布的均方差*/
{
 int i;
 double x,y,t;
 double a=0.0,b=1.0;
 for(x=0,i=0;i<12;i++)
   {*seed=2045*(*seed)+1;
    *seed=*seed-(*seed/1048576)*1048576;        /* 求余 */
    t=(*seed/1048576.0);
    t=a+(b-a)*t;                              /*产生[a,b]区间的随机数*/ 
                     /*产生[0,1]区间分布的随机数*/
    x+=t;
   }
 x=x-6.0;
 y=mean+x*sigma;
 return(y);
}

void delay(s16 period)
{
    int i, j;
    
    for(i=0; i<period; i++)
    {
        for(j=0; j<period>>1; j++);
    }
}

⌨️ 快捷键说明

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