语音压缩、存储与回放 王哲 09211114 五. 程序设计、调试与结果分析
1. 程序流程图
2. 源程序
/*****************************************************************************/ /* 文件名: CODEC.c */ /* 创建时间:29/06/2012 */ /* 功能描述:DSP课程设计 语音压缩,存储并回放 */ /* 作者: 王哲 09211114 通信0909 */ /*****************************************************************************/ #include
#include
#include \
#include \#include \
#undef CODEC_ADDR #define CODEC_ADDR 0x1A
Uint32 SourData[5][65536]={0};
signed data; Uint16 temp1; Uint8 temp2;
第 9页 共 20 页
语音压缩、存储与回放 王哲 09211114
/*****************************************************************************/ /* 函数声明 */ /*****************************************************************************/
unsigned char data2alaw(signed pcm_val); int alaw2data(unsigned char a_val);
static int search(int val,short *table,int size); void delay(int period);
static short seg_end[8]={0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF}; Uint8 data2ulaw(signed pcm_val); int ulaw2data(Uint8 input);
#pragma DATA_SECTION (SourData,\
/* 宏定义 */
#define u_law 0xAA0A//u律压缩 #define A_law 0xAA07//A律压缩
#define TESTCOMMAND 1 //操作命令选择
#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. */
// 定义McBSP的句柄 MCBSP_Handle hMcbsp;
/*------------------------------------------------------------------------------------*/ //
// FUNCTION: MAIN //
/*------------------------------------------------------------------------------------*/ void main(void) {
Uint16 i,j,n;
Uint16 TempData;
Uint16 TestCommand =0;
第 10页 共 20 页
语音压缩、存储与回放 王哲 09211114
// Initialize CSL library - This is REQUIRED !!! CSL_init(); #if TESTCOMMAND==1 TestCommand =u_law;//u律压缩 #endif #if TESTCOMMAND==2 TestCommand =A_law;//A律压缩 #endif
// The main frequency of system is 240MHz
// 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数 PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0);
//EMIF初始化 Emif_Config();
// Open McBSP port 1 and get a McBSP type handle hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
// Config McBSP port 1 by use previously defined structure Mcbsp_Config(hMcbsp);
//I2C初始化 I2C_cofig();
//CODEC寄存器初始化(此例采样率为32KHz,详情见AIC23.c) inti_AIC();
/*------------------------------------------------------------------------------------*/
// Receive the ADC output data of CODEC
// Then output the received data to DAC of CODEC
/*------------------------------------------------------------------------------------*/ while(1) { switch(TestCommand) {
/************************************************************************/ /* u律压缩、储存与回放 */
/************************************************************************/
第 11页 共 20 页
语音压缩、存储与回放 王哲 09211114
case u_law: asm(\ delay(3000);
asm(\ delay(3000);
asm(\ for(j=0;j<5;j++){
for(i=0;i<65535;i++) {
n=0; while(n<4) { while(!MCBSP_rrdy(hMcbsp)){}; TempData=MCBSP_read16(hMcbsp); temp1=data2ulaw(TempData); switch(n) { case 0:SourData[j][i]=(temp1<<=24);break; case 1:SourData[j][i]=(SourData[j][i]|(temp1<<=16));break; case 2:SourData[j][i]=(SourData[j][i]|(temp1<<=8));break; case 3:SourData[j][i]=(SourData[j][i]|temp1);break; default: break; } n++; } }
}
asm(\ delay(3000);
asm(\
for(j=0;j<5;j++){ for(i=0;i<65535;i++) { n=0; while(n<4){ switch(n) { case 0: temp2=(SourData[j][i]>>24)&0x0ff; case 1: temp2=(SourData[j][i]>>16)&0x0ff; case 2: temp2=(SourData[j][i]>>8)&0x0ff; case 3: temp2=SourData[j][i]&0x0ff;
第 12页 共 20 页
语音压缩、存储与回放 王哲 09211114
} while(!MCBSP_xrdy(hMcbsp)) {}; TempData=ulaw2data(temp2); MCBSP_write16(hMcbsp,TempData); n++; } } }
break;
/**********************************************************************/ /* A律压缩、储存与回放 */
/**********************************************************************/ case A_law: asm(\ delay(3000);
asm(\ delay(3000);
asm(\
for(j=0;j<5;j++){ for(i=0;i<65535;i++) {
n=0; while(n<4) { while(!MCBSP_rrdy(hMcbsp)){}; TempData=MCBSP_read16(hMcbsp); temp1=data2alaw(TempData); switch(n) { case 0:SourData[j][i]=(temp1<<=24);break; case 1:SourData[j][i]=(SourData[j][i]|(temp1<<=16));break; case 2:SourData[j][i]=(SourData[j][i]|(temp1<<=8));break; case 3:SourData[j][i]=(SourData[j][i]|temp1);break; default: break; } n++; }
第 13页 共 20 页