📄 zsy.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 + -