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

📄 codec.c

📁 DSP 自适应语言滤波程序 调试成功的
💻 C
字号:
/*****************************************************************************/
/* Codec.c*/

/* Digital Loopback example*/

/*****************************************************************************/
#include "type.h"
#include "board.h"
#include "codec.h"
#include "mcbsp54.h"
#include "tms320.h"
#include "dsplib.h"
#include "setm.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.                                                   */
void delay(void);    //延迟
void update(DATA x[],DATA dk);
void initarray(DATA x[]);
/*****************************************************************************/
/* Global Variables                                                          */
/*****************************************************************************/

HANDLE hHandset;   //CODEC句柄
DATA bf1[5000];     //缓冲区
/*****************************************************************************/
/* MAIN*/
/*****************************************************************************/
DATA *dp_w = &dbuffer_w[0];
DATA *dp_h = &dbuffer_h[0]; 
void main() 
{
    s16 j;
    s16 m;
    s16 cnt=2;  //灯循环闪次数,初始化等待时钟周期数
    DATA dk,out_delay,yk;//ek          
    s16 mode=2;   //决定是否产生回波是否使用回波抵消
    s16 i;                                
    if (brd_init(100))               //板的初始化
           return;
    for (i=0; i<LENGTH_IN; i++) dbuffer_h[i] = 0;
    for (i=0;i<LENGTH_IN;i++) out_h[i] =0;	// clear output buffer (optional)   
    for (i=0;i<LENGTH_W;i++) coff_w[i] =0;	// clear coeff buffer (optional)
    for (i=0;i<LENGTH_IN;i++) out_w[i] =0;	// clear output buffer (optional)
	/* blink the leds a couple times */
	while ( cnt-- )              /*板子初始化,用灯闪来表示*/
	{
		brd_led_toggle(BRD_LED0);
		/* brd_delay_msec(1000); */
		delay();
		brd_led_toggle(BRD_LED1);
		/* brd_delay_msec(1000); */
		delay();
		brd_led_toggle(BRD_LED2);
		/* brd_delay_msec(1000); */
		delay();
	}    

    /* 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_8000);               /* 8KHz sampling rate */
    brd_led_toggle(BRD_LED0);
            
	initarray(x);      //初始化所有数组
 	  i=0;
 	  j=3000;
      m=1500;
    
        while(1)               //读数循环
         {
        while (!MCBSP_RRDY(HANDSET_CODEC)) {};
        dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); 
        // *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=dk;   //从ADC读数      
        update(x,dk);  
         
        if(mode==0)
        {
        *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=dk;
        }
        else if(mode==1)
        {     
        fir(x,coff_h,out_h,&dp_h,LENGTH_H,LENGTH_IN);  
        if(i==5000) i=0;        
        if(j==5000) j=0;
        if(m==5000) m=0;
        bf1[i]=out_h[0];i++;//放入缓冲区
                                            
        out_delay=0.5*bf1[i+1]+1.5*bf1[j++]+bf1[m++];       
        yk=dk+out_delay;          
        *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=yk;
        
        }
        else if(mode==2)
        {
        
        fir(x,coff_h,out_h,&dp_h,LENGTH_H,LENGTH_IN); 
        
        if(i==5000) i=0; 
        if(j==5000) j=0;
        if(m==5000) m=0;       
       
        bf1[i]=out_h[0];i++;  
         
        out_delay=0.5*bf1[i+1]+1.5*bf1[j++]+bf1[m++];    
        yk=dk+out_delay;   
        update(y,yk); 
                                 
        dlms(y,coff_w,out_w,&dp_w,out_h,STEP,LENGTH_W,LENGTH_IN);
        //ek=out_h[0]-out_w[0]; 
        *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=out_w[i];           
        }
        
         }                               
         
}
          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    
     
void delay(void) 
{ 
  long int j; 
  for(j=0; j<100000; j++) 
  asm("_nop");               
}

void update(DATA x[],DATA dk)
{
    s16 j,k;        
	for(j=1;j<LENGTH_IN;++j)
	{   
		k=LENGTH_IN-j;
		x[k]=x[k-1];		
	}
	x[0]=dk;
}
 
void initarray(DATA x[])
{
	 s16 i;
	 for(i=0;i<LENGTH_IN;++i)
	 {	
		x[i]=0;
     }
   
}





⌨️ 快捷键说明

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