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

📄 yuyin.txt

📁 dsp语音设计源代码
💻 TXT
字号:
dsp语音设计源代码,功能:录入语音经A律编码解码重新回放


MEMORY
{
   PAGE 0: VECS:     origin = 0080h, length = 0080h  /* Internal Program RAM */
           PRAM:     origin = 7600h, length = 8000h  /* Internal Program RAM */

   PAGE 1: SCRATCH:  origin = 0060h, length = 0020h  /* Scratch Pad Data RAM */
           DMARAM:   origin = 0C00h, length = 0300h  /* DMA buffer */
           DATA:     origin = 1100h, length = 0080h  /* Internal Data RAM    */
           STACK:    origin = 1180h, length = 0560h  /* Stack Memory Space   */
           INRAM:    origin = 1900h, length = 0100h  /* Internal Data RAM    */
           HPRAM0:   origin = 1A00h, length = 0002h  /* HPI memory accessible by Host and DSP */
           HPRAM1:   origin = 1A02h, length = 0280h  /* HPI memory accessible by Host and DSP */
           HPRAM2:   origin = 1C82h, length = 0280h  /* HPI memory accessible by Host and DSP */
           EXRAM:    origin = 1F10h, length = 9000h  /* External Data RAM    */
}


SECTIONS
{
   .cinit    > PRAM  PAGE 0
   .text     > PRAM  PAGE 0
   .vectors  > VECS  PAGE 0
    
   init_var  > PRAM  PAGE 0
   detect    > PRAM  PAGE 0
   vrcprg	 > PRAM  PAGE 0
   matprg	 > PRAM  PAGE 0
   	
   .stack    > STACK PAGE 1
   .trap     > SCRATCH PAGE 1

   .const    > EXRAM PAGE 1
   .data     > EXRAM PAGE 1
   .bss      > EXRAM PAGE 1
   .cio      > EXRAM PAGE 1

   .switch   > EXRAM PAGE 1
   
   tables    > EXRAM PAGE 1
   var       > EXRAM PAGE 1
   svctab    > EXRAM PAGE 1         /* SS_V LSP table */
   vctab     > EXRAM PAGE 1         /* V LSP table */
   uvctab    > EXRAM PAGE 1         /* UV LSP table */
   cuvtab    > EXRAM PAGE 1         /* Stochastic codebook */
   cdbktab   > EXRAM PAGE 1         /* various codebook tables*/
   
   logtab    > EXRAM PAGE 1          /* table for log2 */
   powtab    > EXRAM PAGE 1          /* table for pow2 */
   hamtab    > EXRAM PAGE 1          /* table for hamming */
   lgwtab    > EXRAM PAGE 1          /* table for lag window */
   acostab   > EXRAM PAGE 1          /* table for arccos */
   sqrtab    > EXRAM PAGE 1          /* table for square root */
   acbtab    > EXRAM PAGE 1          /* table for thresholds in acb */
   pm03tab   > EXRAM PAGE 1          /* table for x^(-0.3) computation */
   costab    > EXRAM PAGE 1          /* table for cosine */

   V23       > INRAM PAGE 1
   FSK       > INRAM PAGE 1

   hpibuff0  > HPRAM0 PAGE 1
   hpibuff1  > HPRAM1 PAGE 1
   hpibuff2  > HPRAM2 PAGE 1
   dma_buff  > DMARAM PAGE 1
}

4、总程序:


/*****************************************************************************/
/*                             .h文件                                      */
/*****************************************************************************/
#include <type.h>
#include <board.h>
#include <codec.h>
#include <mcbsp54.h>
/*****************************************************************************/
/*                             变量宏定义                                    */
/*****************************************************************************/
#define	SIGN_BIT	(0x80)		/* Sign bit for a A-law byte. */
#define	QUANT_MASK	(0xf)		/* Quantization field mask. */
#define	NSEGS		(8)		    /* Number of A-law segments. */
#define	SEG_SHIFT	(4)		    /* Left shift for segment number. */
#define	SEG_MASK	(0x70)		/* Segment field mask. */
/*****************************************************************************/
/*                              函数声明                                     */
/*****************************************************************************/


void delay(s16 period);
void led(s16 cnt);
void initcodec(void);
unsigned char data2alaw(s16 pcm_val);
int alaw2data(unsigned char	a_val);
static int search(int val,short	*table,int size);
/*****************************************************************************/
/*                              全局变量                                     */
/*****************************************************************************/

HANDLE hHandset;
s16 data;
s16 data1;
u16 i=0;
u16 temp1;
u16 j=0;
u16 k,l=0;
u8 temp2;
u16 buffer[20000];
static short seg_end[8]={0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF};

/*****************************************************************************/
/*                              主函数                                       */
/*****************************************************************************/

void main()
{
    if (brd_init(100))
        return;
    led(2);                  //闪灯两次
    initcodec();             //初始化codec

   while (1)
    {
       while (!MCBSP_RRDY(HANDSET_CODEC)) {};       //等待接收handset处的采样
       data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC);  //从handset处读取采样
       temp1=data2alaw(data);                            //对采样进行a律压缩
     /**************************************************************************/
     /*      把低地址数据放在高八位 高地址数据放在第八位                     */
     /**************************************************************************/      
       i=i+1;          
	   if(i%2==1)
	   		{
				buffer[j]=(temp1<<=8);       
				/*奇数数据左移8位  temp1=abcdefgh00000000
				buffer[j]=temp1*/
	   		}
	   else
    		{
 		    	buffer[j]=(buffer[j]|temp1);  
		    	/*偶数数据与temp1取或 组成新的数据
                            buffer[j]=abcdefghiabcdefg*/
       			j++;   //j加1
       		}
       		
       if(i>=40000) 
       		{
				i=0;
	   		}
	   		
	   if(j>=20000)
	   		{
	   			j=0;
	   			brd_led_toggle(BRD_LED1);         //点亮二极管1 
                                                  
		    	delay(1000);                  //延时1000 
		   		brd_led_toggle(BRD_LED1);     
                                                   //熄灭二极管1 表示放音开始
       /************************************************************************/
       /*                             放音部分                                 */
       /************************************************************************/  		
	   			for(k=0;k<40000;k++)
	   			{
	   				if(k%2==0)
	   				{
	   					temp2=(buffer[l]>>8)&0x0ff;
	   				}
	   				else
	   				{
	   					temp2=buffer[l]&0x0ff;
	   					l++;
	   				}
				if(l>=20000)
	   					l=0;
	   			data1=alaw2data(temp2);
	   			while (!MCBSP_XRDY(HANDSET_CODEC)) {};    
	   			*(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = data1;
	   	   		}
       /************************************************************************/
       /*                                放音结束                              */
       /************************************************************************/
	   	   	   if(k>=39999)
	   	   	   {
	   	   	     brd_led_toggle(BRD_LED0); //点亮二极管0     
	   	   	     delay(1000);               //延时1000 
	   	   	     brd_led_toggle(BRD_LED0); //熄灭二极管0 表示录音开始
	   	   	   }
      	    }
    }       
 
}                                               //主程序结束



/*********************************************************************************/                                                                                        
/*                              子函数                                       */                                                                        
/*********************************************************************************/


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

/*******闪灯******/
void led(s16 cnt)
{

	while ( cnt-- )
	{
		brd_led_toggle(BRD_LED0);
		delay(1000);
		brd_led_toggle(BRD_LED1);
		delay(1000);
		brd_led_toggle(BRD_LED2);
		delay(1000);
	}
}

/*****初始化codec**/
void initcodec(void)
{
    /* 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);                 // 16KHz sampling rate 
}

/*****a律压缩******/
unsigned char data2alaw(s16 pcm_val)	     
{
	int		mask;
	int		seg;
	unsigned char	aval;

	if (pcm_val >= 0) 
	{
		mask = 0xD5;		                   // 标记 (7th) bit = 1
	} 
	else 
	{
		mask = 0x55;		                         // 标记 bit = 0 
		pcm_val = -pcm_val;
	}
		// Convert the scaled magnitude to segment number. 
	seg = search(pcm_val, seg_end, 8);           

        // Combine the sign, segment, and quantization bits. 
    if (seg >= 8)	                            // out of range, 返回最大数. 
		return (0x7F ^ mask);
	else 
	{
		aval = seg << SEG_SHIFT;
		if (seg < 2)
			aval |= (pcm_val >> 1) & QUANT_MASK;
		else
			aval |= (pcm_val >>seg) & QUANT_MASK;

		return (aval ^ mask);
	}
}

/****alaw的子程序**/
static int search(int val,short	*table,int size)
{
	int		i;

	for (i = 0; i < size; i++) 
	{
		if (val <= *table++)
		return (i);
	}
	return (size);
}

/*****a律解压******/
int alaw2data(unsigned char	a_val)
{
	int		t;
	int		seg;

	a_val ^= 0x55;
    t = (a_val & QUANT_MASK) << 4;
	seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
	if(seg==0) 
	{
	 	t += 8;
	 	t=(t>>3);
	}
	if((seg<4)&&(seg>0)) 
	{
	 	t +=0x108;
	 	t=(t>>(4-seg));
	}
	if(seg>3)
	{
		t+=0x108;
		t=(t<<=(seg-4));
	}
return ((a_val & SIGN_BIT) ? t : -t);
}
/********************************************************************************/
/*                                   结束                                       */
/********************************************************************************/

⌨️ 快捷键说明

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