语音压缩、存储与回放 王哲 09211114
}
}
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; } while(!MCBSP_xrdy(hMcbsp)) {}; TempData=alaw2data(temp2); MCBSP_write16(hMcbsp,TempData); n++; } } } break; default: break; } } }
/****************************************************************************/ /* 子函数 */ /****************************************************************************/
/*******延时******/ void delay(int period) {
int i, j;
第 14页 共 20 页
语音压缩、存储与回放 王哲 09211114
for(i=0; i for(j=0; j /*****a律压缩******/ unsigned char data2alaw(signed 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); } } static int search(int val,short *table,int size) { 第 15页 共 20 页 语音压缩、存储与回放 王哲 09211114 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); } /*****u律压缩******/ Uint8 data2ulaw(signed pcm_val) { int mask; int seg; unsigned char uval; Uint8 i,output; Uint16 absol,temp; 第 16页 共 20 页 语音压缩、存储与回放 王哲 09211114 if (pcm_val >= 0) { mask = 1; // 标记 (7th) bit = 1 } else { mask = 0; // 标记 bit = 0 pcm_val = -pcm_val; } absol=pcm_val+33; temp=absol; for (i=0;i<16;i++) { output=temp&0x8000; //确定temp中出现1的最高位 if(output) //temp 左移i位后最高位为1 break; temp<<=1; } seg=11-i; uval=(absol>>seg)&0x0f; //量化值 seg--; //段值 seg<<=4; output=seg+uval; //输出值的绝对值 if(absol>8191) //超过最大值8191,输出最大值0x7f output=0x7f; if(mask) return (output^=0xFF); //返回含有符号信息的输出值 else return (output^=0x7F); } int ulaw2data(Uint8 input) { int mask; int seg; unsigned char uval; Uint32 temp; int data1; temp=input^0xff; //得到含有符号信息的压缩值 mask=(temp&0x80)>>7; //符号位 seg=(temp&0x70)>>4; //段值 uval=temp&0x0f; //量化值 data1=uval<<1; data1+=33; //扩展后数值中的6位非零值 data1<<=seg; 第 17页 共 20 页 语音压缩、存储与回放 王哲 09211114 if(mask) return (33-data1); //有符号的扩展值 else return (data1-33); } /*****************************************************************************/ // No more /*****************************************************************************/ 3. 存储器配置程序(.cmd文件) .cmd是链接器命令文件,用于存储器配置。.cmd由两条链接伪指令来描 述:MEMORY 和SECTIONS,其中:MEMORY定义用户目标系统存储器的配置; SECTIONS控制段的构建和存储器的分配。存储器空间是需要配置的,因为 DSP不同的空间占用相同的地址,因此需要人工分配。 /**********************************************************/ /* */ /* LINKER command file for SDRAM memory map */ /* */ /**********************************************************/ MEMORY { MMR : origin = 0000000h, length = 00000c0h SPRAM : origin = 00000c0h, length = 0000040 VECS : origin = 0000100h, length = 0000100h DARAM0 : origin = 0000200h, length = 0007E00h DARAM1 : origin = 0008000h, length = 0008000h CE0 : origin = 0010000h, length = 03f0000h /* 对应ZBTRAM空间 */ FLASH : origin = 0400000h, length = 0100000h /* Flash 空间 */ /* FLASH : origin = 0410000h, length = 00f0000h*/ EXTEND: origin = 0500000h, length = 0300000h /* 状态/控制寄存器、UARTA、UARTB、USB、和扩展总线所对应的空间 */ SDRAM : origin = 0800000h, length = 03FFFFCh /* SDRAM 空间*/ CE3 : origin = 0c00000h, length = 03f8000h /* SDRAM 空间*/ PDROM : origin = 0ff8000h, length = 07f00h 第 18页 共 20 页