资源描述
沈阳理工大学信息科学与工程学院——DSP技术课程设计报告
摘 要
本文简要阐述了语音信号扩展U律的基本原理,可以将高位的数据扩展成低位的数据,它适用于声音信号的播放和传输系统,在设计中借助MATLAB信号处理工具箱FDAtool工具设计了语音信号扩展系数,然后在CCS中以TMS320C55x芯片的汇编语言编程实现了该语音信号扩展。利用MATLAB设计语音信号扩展,可以随时对比设计要求和语音信号扩展特性调整参数,直观简便,极大的减轻了工作量,有利于语音信号扩展设计的最优化。另外文中还介绍CCS开发环境。文中所给程序已经经过软件仿真验证,所设计的语音信号扩展符合设计要求。
关键词:DSP,语音信号扩展,MATLAB,Code Composer Studio(CCS),TMS320C55x
目 录
1 语音信号扩展U律设计任务及目的...............1
1.1 语音信号扩展U律设计任务………………………………………… 1
1.2 语音信号扩展U律设计目的 ………………………………………...1
1.3 语音信号扩展U律设计基本原理……………………………………… 1
1.3.1 语音信号扩展编码技术的发展 ……………………………………..1
1.3.2 DSP硬件实现数据扩展解压的简单流程 ………………………….1
1.3.3 U律语音信号扩展 ……………………………………………………2
2 TMS320C5X结构 …………………………………..4
2.1 C55X的CPU体系结构 …………………………………………………..4
2.2 指令缓冲单元(I)……………………………………………………. 4
2.3 程序流程单元(P)……………………………………………………. 4
2.4 地址程序单元(A)…………………………………………………….. 5
2.5 数据计算单元(D)…………………………………………………….. 5
3 语音信号扩展U律设计过程 .........................................6
4 语音信号U律设计软件程序 ........................................7
5 语音信号扩展U律设计的CCS实现.......... ........15
5.1 简述CCS环境 ………………………………………………15
5.1.1 CCS主要特点 …………………………………………………………15
5.1.2 DSP/BIOS和API函数以及RTDX插件……………………………….. 15
5.2 CCS配置 ………………………………………………………………...16
5.3 CCS环境中工程文件的使用 …………………………………………..16
5.3.1 建立工程文件 ……………………………………………………….16
5.3.2 创建新文件 ………………………………………………………….17
5.3.3 向工程项目中添加文件 ……………………………………………...17
5.4 编译链接和运行目标文件……………………………………………. 18
5.4.1 对程序进行编译链接并装载.out文件 ……………………………18
6 仿真结果及讨论 ............................................................19
结 论 ...................................................................................22
参考文献 ...............................................................................23
II
沈阳理工大学信息科学与工程学院——DSP技术课程设计报告
1 语音信号扩展U律设计任务及目的
1.1 语音信号扩展U律设计任务
(1)完成语音信号采集;
(2)对语音信号进行U律扩展;
(3)传输扩展后的信号
1.2 语音信号扩展U律设计目的
本设计的目的在于通过使用DSP的程序设计完成对语音信号的扩展,既可以通过软件实现,也可以通过硬件实现。进行程序的设计,并在CCS软件环境下进行调试,同时也加深学生对数字信号处理器的常用指标和设计过程的理解。
1.3 语音信号扩展U律设计基本原理
1.3.1 语音信号扩展编码技术的发展
随随着通信、计算机网络等技术的飞速发展,语音扩展编码技术得到了快速发展和广泛应用,尤其是最近20年,语音扩展编码技术在移动通信、卫星通信、多媒体技术以及IP电话通信中得到普遍应用,起着举足轻重的作用。
语音扩展编码技术的类别
语音编码就是将模拟语音信号数字化,数字化之后可以作为数字信号传输、存储或处理,可以充分利用数字信号处理的各种技术。为了减小存储空间或降低传输比特率节省带宽,还需要对数字化之后的语音信号进行扩展编码,这就是语音扩展编码技术。
语音的扩展编码方法归纳起来可以分为三大类:波形编码、参数编码和混合编码。
1.3.2 DSP硬件实现数据扩展解压的简单流程
DSP将传输来的扩展后的数据进行解压成16位或32位,而后对解压后的数据进行分析,处理,最后将处理后的数据按照要求扩展成8位的数据格式输出到相应设备以供读取:DR→RSR→RBR→解压→RJUST→DDR→DXR→扩展→XSR→DX
在进行扩展时,采样后的12位数据,默认其最高位为符号位,扩展时要保持最高位即符号位不变;原数据的后11位要扩展成7位。这7位码由3位段落码和4位段内码组成,具体扩展变换后的根据后11位数据大小决定。扩展后数据的最高位(第7位)表示符号,量阶分别为1,1,2,4,8,16,32,64,由扩展后数据的第6位到第4位决定,第3位到第0位是段内码,扩展后数据有一定的失真,有些数据不能表示出,只能取最接近该数据的扩展值。例如数据125,扩展后的值为00111111,意义如下:
从左往右,第一个0为符号位,表示为一个正数;后面的011为段落码,表示量阶为4,起始数据为64,后面的4个1111为段内码,表示值为15
最终结果为:64+4*15=124.
1.3.3 U律语音信号扩展
μ律算法:采用μ律算法对采集的语音数据进行处理,μ律编码是一种针对语音信号进行对数压缩非均匀量化的方案。采用μ律对信号进行对数形式的压缩,以便在不提高数据量的前提下提高信噪比,尽管量化的位数保持不变,但动态范围增加了。μ律压缩的语音信号一般用8比特抽样数据表示,携带小信号信息量比大信号信息量多。从统计意义上讲,有用信号更可能在小信号区间而非大信号区间。因此,在小信号区间需要更多的量化点数。
μ律算法公式:
其中Xmax是信号x(n)的最大幅度,u是控制压缩程序的参数,u越大压缩就越厉害
μ律查找表内共有256个数,分别用来获得0—7段量化电压,其由16×16组数组成。
由下表看大信号多数由第7段表示,三个指数位用来表示第0-7段,4个尾数位用于表示后4个有效位,还有一位符号位没有给出。16比特输入数据是由线性数据变换成8比
特μ律数据(模拟传输),然后再从μ律转成16比特的线性数据(模拟接收),再输出到编解码器
上图给出了按m律压扩算法的输入输出特性曲线,m为确定压缩量的参数,它反映最大量化间隔和最小量化间隔之比。由图可见,m值越大,压缩量越大。由于m 律压扩的输入和输出关系是对数函数关系,所以这种编码又称为对数PCM。
A律压扩与m律压扩相比,则压缩的动态范围略小些,小信号振幅时质量要比m律稍差。无论是A律还是m律算法,它们的特性在输入信号振幅小时都呈线性,在输入信号振幅大时呈对数压缩特性。
对于采样频率为8kHz,样本精度为16位的输入信号,使用A律压扩或m律压扩编码,经过PCM编码器之后每个样本的精度为8位,输出的数据率为64kb/s。这个数据就是CCITT ,(国际电话与电报顾问委员会)推荐的G.711标准:话音频率脉冲编码调制。
U律的扩展可定义为:
U律扩展的线性表如下:
扩展过的码字
偏值得输入
段值,量化值
比特 :6 5 4 3 2 1 x
比特:11 10 9 8 7 6 5 4 3 2 1 x
0 0 0 a b c d
0 0 0 0 0 0 x a b c d 1
0 0 1 a b c d
0 0 0 0 0 0 1 a b c d 1
0 1 0 a b c d
0 0 0 0 0 1 a b c d 1 x
0 1 1 a b c d
0 0 0 0 1 a b c d 1 x x
1 0 0 a b c d
0 0 0 1 a b c d 1 x x x
1 0 1 a b c d
0 0 1 a b c d 1 x x x x
1 1 0 a b c d
0 1 a b c d 1 x x x x x
1 1 1 a b c d
1 a b c d 1 x x x x x x
2 TMS320C5X的硬件结构
2.1 C55X的CPU体系结构
C55X有1条32位的程序数据总线(PB),5条16位数据总线(BB、CB、DB、EB、FB)和1条24位的程序地址总线及5条23位地址总线,这些总线分别与CPU相连。总线通过存储单元接口(M)与外部程序总线和数据总线相连,实现CPU对外部存储器的访问。这种并行的多总线结构,使CPU能在一个CPU周期内完成1次32位程序代码读、3次16位数据读和两次16位数据写。C55X根据功能的不同将CPU分为4个单元,指令缓冲单元(I)、程序流程单元(P)、地址流程单元(A)、和数据计算单元(D)。
读程序地址总线(PDA)上传送24位的程序代码地址,由读程序总线(PB)将32位的程序代码送入指令缓冲单元进行译码[1]。
2.2 指令缓冲单元(I)
C55X的指令缓冲单元有指令缓冲队列IBQ和指令译码器组成。在每个CPU周期内,I单元将从程序数据接收的4B程序代码放入指令缓冲队列,指令译码器从队列中取6B程序代码,根据指令的长度可对8位、16位、24位、32位和48位的变长指令进行译码,然后把译码数据送入P单元、A单元和D单元去执行。
2.3 程序流程单元(P)
程序流程单元有程序地址产生电路和寄存器组凑成。程序流程单元产生所有程序空间的地址,并控制指令的读取顺序。
程序地址产生逻辑电路的任务是产生读取空间的24位地址。一般情况下,它产生的是连续地址,如果指令要求读取非连续地址的程序代码时,程序地址产生逻辑电路能够接收来自I单元的立即数和来自D单元的寄存器值,并将产生的地址传送到PAB。
在P单元中使用的寄存器分为5种类型。
l 程序流寄存器:包括程序计数器、返回地址寄存器和控制流程关系寄存器。
l 块重复寄存器:包括块重复寄存器0和1(BRC0、BRC1)BRC1的保存寄存器(BRS1)、块重复起始地址寄存器0和1以及块重复结束地址寄存器0和1。
l 单重复寄存器:包括单重复寄存器和计算单重复寄存器。
l 中断寄存器:包括中断标志寄存器0和1、中断使能寄存器0和1以及调试中断使能寄存器0和1。
l 状态奇存期:包括状态寄存器0,1,2和3。
2.4 地址程序单元(A)
地址程序单元包括数据地址产生电路、算术逻辑电路和寄存器组构成。
数据地址产生电路能够接收来自I单元的立即数和来自A单元的寄存器产生读取数据空间的地址。对于使用间接寻址模式的指令,有P单元向DAGEN说明采用的寻址模式。
A单元包括一个16位的算术逻辑单元,它既可以接收来自I单元的立即数也可以与存储器、I/O空间、A单元寄存器、D单元寄存器和P单元寄存器进行双向通信。
A单元包括的寄存器有以下几种类型。
l 数据页寄存器:包括数据页寄存器和接口数据页寄存器;
l 指针:包括系数数据指针寄存器、堆栈针寄存器和8个辅助寄存器;
l 循环缓冲寄存器:包括循环缓冲大小寄存器、循环缓冲起始地址寄存器;
l 临时寄存器:包括临时寄存器。
2.5 数据计算单元(D)
数据计算单元由移位器、算数逻辑电路、乘法累加器和寄存器组构成。D单元包含了CPU的主要运算部件。
D单元移位器能够接收来自I单元的立即数,能够与存储器、I/O单元、A单元寄存器、D单元寄存器和P单元寄存器进行双向通信,此外,还可以向D单元的ALU和A单元的ALU提供移位后的数据。移位可以完成以下操作:
l 对40位的累加器可以完成向左最多32位的移位操作,移位数乐意从零食寄存器读取或由指令中的常数提供;
l 对于16位寄存器、存储器或I/O空间数据可完成左移31位或32位的移位操作;
l 对于16位立即数可完成向左移最多15位的移位操作。
3 语音信号扩展U律设计过程
设计步骤
(1)连接好DSP开发系统,运行CCS软件;
(2)设计程序或键入下面的参考程序并保存(文件名设为jia)
(3) 新建两个工程,分别添加jia以及链接命令文件(.cmd文件);
(4)向工程添加
(5)编译、链接工程,生成.Out文件;
(6)装载.out文件,运行;
(7)找错至无错误
(8)在view下运行两程序,出现结果框图。
(9)改变参数,重新设置其工作的参数,重复以上步骤并比较;
4 语音信号U律设计软件程序
存储器的分配(5402.cmd)
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
}
/*主程序设计*/
/*语音采集及回放程序*/
/*用U律进行扩展及解压*/
/*采用AD50进行A/D,D/A转换 */
/*灯循环闪烁程序开始*/
/*L0:录音*/
/*L1:放音*/
#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);
void flashenable(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
flashenable(); //选择片外FLASH为片外存储器
/*
delay(100);
brd_led_toggle(BRD_LED0);
for(i=0x9000;i<0xefff;i++)
{
REG_WRITE(i,*(volatile u16*)DRR1_ADDR(HANDSET_CODEC));
delay(20);
}
brd_led_toggle(BRD_LED1);
delay(200);
for(i=0x9000;i<0xefff;i++)
{
*(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=REG_READ(i);
delay(20);
}
brd_led_toggle(BRD_LED2);
*/
while (1)
{
while (!MCBSP_RRDY(HANDSET_CODEC)) {}; //等待接收handset处的采样
brd_led_toggle(BRD_LED0);
data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); //从handset处读取
采样
temp1=data2alaw(data); //对采样进行U律扩展
/* 把低地址数据放在高八位 高地址数据放在低八位 */
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]=abcdefghiabcdefghi*/
j++; //j加1
}
if(i>=40000)
{
i=0;
}
if(j>=20000)
{
j=0;
brd_led_disable(BRD_LED0);
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); // U律解压
while (!MCBSP_XRDY(HANDSET_CODEC)) {};
*(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = data1; //将数据写入D/A转换器
}
/* 放音结束 */
brd_led_toggle(BRD_LED0);
brd_led_toggle(BRD_LED1);
}
}
} //主程序结束
/* 子函数 */
/*******延时******/
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); //切换LED指示灯0的显示状态
delay(1000);
brd_led_toggle(BRD_LED1);
delay(1000);
brd_led_toggle(BRD_LED2);
delay(1000);
}
}
/*****初始化codec**/
void initcodec(void)
{
/* Open Handset Codec 获取设置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); // 8KHz sampling rate
}
/*****设置flash****/
void flashenable(void)
{
CPLD_CTRL2_REG|=0x0010;
CPLD_DMCTRL_REG|=0x0040;
}
/*****U律扩展******/
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;
}
seg = search(pcm_val, seg_end, 8);
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);
}
/*****U律解压******/
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);
}
/* 结束 */
5 语音信号扩
展开阅读全文