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);
}
}
/*****初始化co