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

📄 pcm.c

📁 利用DSP实现PCM算法的语音压缩和识别的源程序
💻 C
字号:
/*																				*/
/*  Copyright 2004 by SEED Electronic Technology LTD.                           */
/*  All rights reserved. SEED Electronic Technology LTD.                        */
/*  Restricted rights to use, duplicate or disclose this code are               */
/*  granted through contract.    											    */
/*                                           									*/
/*  Authors: david																*/
/*  Data: 2006/10/28															*/
/********************************************************************************/
#include "type.h"
#include "codec.h"
#include "sysreg.h"
#include "mcbsp54.h"
#include "memory.h"
/********************************************************************************/
/*数据缓冲区的首址为0x8000,长度为0x8000*/
#define AUDIODATA 0x8000
/********************************************************************************/
#define  AUDIOTRY      0xAA0A//音频试听
#define  AUDIOPCM      0xAA09//音频PCM
//实验操控:
//选择TESTCOMMAND,1为试听;2为和声。
//选择CODECAGAIN,48-127之间。是调整增益的参数。
//最好在110-127之间,否则声音太小,难以听到。

#define TESTCOMMAND    2     //操作命令选择 
unsigned int  Command =0;
/////////////////////////////////////////////////////////////////////
HANDLE codec_command =0;
HANDLE codec_data=0;
/////////////////////////////////////////////////////////////////////
int audioleft, audioright;	
unsigned int i= 0;
/*********************************************************************/
void pcm();
/*********************************************************************/
main()
{	
	/*设置系统时钟*/
	sys_clk(CLK160);
#if TESTCOMMAND==1
	Command =AUDIOTRY;//试听 0xAA0A
#endif
#if TESTCOMMAND==2	
	Command =AUDIOPCM;//PCM 0xAA09
#endif
	/*打开codec数据接口*/
	codec_data = codec_open(CODEC_DATA);
	/*打开codec命令接口*/
	codec_command = codec_open(CODEC_COMMAND);
	/*选择麦克风作为输入 0x14,选择Line in作为输入 0x12*/
	codec_analog_mode(codec_command,0x12);
	/*设置波特率,输入与输出均为8K*/
	codec_sample_rate(codec_command,0xd);
	
	/*配置系统存储器*/	
	memory_set(0x80);	
	
	//设置增益	
	codec_headhponeout_gain(codec_command,127);	
	for(;;)
	{	
		switch(Command)
		{
			/*音频试听*/
			case AUDIOTRY:
				/* Wait for sample from handset */
				while (!MCBSP_RRDY(CODEC_DATA)) {};
				/* Read sample from and write back to handset codec */
					audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
				while (!MCBSP_RRDY(CODEC_DATA)) {};
				/* Read sample from and write back to handset codec */
					audioright = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
				
				while (!MCBSP_XRDY(CODEC_DATA)) {};
					*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioleft;
					
				while (!MCBSP_XRDY(CODEC_DATA)) {};
					*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioright;
			break;					
			/*音频PCM*/	
			case AUDIOPCM:
				pcm();				
			break;							
			default:
			break;
		} 		
	}							     
}
/***********************************************************************************/
/*函数名:pcm()																	   */
/***********************************************************************************/
void pcm()
{
	int *pAudio;
    int sign, segment;
    int temp, quant;
    char seg;
    unsigned int absol, tem;
    int *pWork,nAudioCount;
    unsigned int uWork;
    unsigned char cWork;
    int output;
    
   	pAudio=pWork=(int *)AUDIODATA;
	nAudioCount=0;
    for ( i=0;i<1024;i++,pWork++ ) (*pWork)=0;
    pWork=pAudio;
	
	do{    
    	/* Wait for sample from handset */
		while (!MCBSP_RRDY(CODEC_DATA)) {};
		/* Read sample from and write back to handset codec */
			audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
		while (!MCBSP_RRDY(CODEC_DATA)) {};
		/* Read sample from and write back to handset codec */
			audioright= *(volatile u16*)DRR1_ADDR(CODEC_DATA);	
		/*取右道的数据做为运算的数据*/
		tem=absol=abs(audioleft);
	    sign=(audioleft >= 0)?1:0;
        for(i=0;i<16;i++)
	    {
	        output=tem&0x8000;
	        if(output)
	             break;
	         tem<<=1;
        }
        seg=11-i;
	    if(seg<=0)
        {
            seg=0;
            quant=(absol>>1)&0x0F;
        }
        else
	        quant=(absol>>seg)&0x0F;
        seg<<=4;
        output=seg+quant;
        if(absol>4095) 
            output=0x7F;
        if(sign)
	        output^=0xD5;
        else
	        output^=0x55;
        uWork=(unsigned char)output;
	      /*inttoa函数完结*/
       	uWork<<=8;
         /*以下为inttoa函数:uWork|=inttoa(right);*/
        tem=absol=abs(audioright);
	    sign=(audioright >= 0)?1:0;
        for(i=0;i<16;i++)
	    {
	        output=tem&0x8000;
	        if(output)
	            break;
	        tem<<=1;
	    }
	    seg=11-i;
        if(seg<=0)
        {
            seg=0;
            quant=(absol>>1)&0x0F;
        }
        else
            quant=(absol>>seg)&0x0F;
        seg<<=4;
        output=seg+quant;
        if(absol>4095) 
            output=0x7F;
        if(sign)
	        output^=0xD5;
        else
	        output^=0x55;
        uWork|=(unsigned char)output;
       /*inttoa函数完结*/
       	(*pWork)=uWork;
       	cWork=uWork>>8;
       	/*以下为atoint函数:left=atoint(cWork);*/
       	temp=cWork^0xD5;
       	sign=(temp&0x80)>>7;
       	segment=(temp&0x70)>>4;
       	quant=temp&0x0F;
       	quant<<=1;
       	if(!segment)
	        quant+=1;
        else
	    {
            quant+=33;
            quant<<=segment-1;
        }
        if ( sign )
            audioleft=-quant;
        else
            audioleft=quant;
        /*atoint函数完结*/  
        cWork=uWork&0x0ff;
       	/*以下为atoint函数:right=atoint(cWork); */
       	temp=cWork^0xD5;
       	sign=(temp&0x80)>>7;
       	segment=(temp&0x70)>>4;
       	quant=temp&0x0F;
       	quant<<=1;
       	if(!segment)
	         quant+=1;
	    else
        {
            quant+=33;
            quant<<=segment-1;
        }
        if ( sign )
            audioright=-quant;
        else
            audioright=quant;
	        /*atoint函数完结*/   
		/* Wait for sample from handset */
		while (!MCBSP_XRDY(CODEC_DATA)) {};
			*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioright;
		while (!MCBSP_XRDY(CODEC_DATA)) {};
			*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioleft;
		nAudioCount++; pWork++;
        if ( nAudioCount>=1024 )
        {
        	nAudioCount=0;
        	pWork=pAudio;
        }
    }
    while(Command==0xaa09); 
}


⌨️ 快捷键说明

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