一、学习计划
1、Background of sound
2、Sound wav
3、ADC/DAC
4、Sample rate and Bit depth …
5、Audio Standards
6、PCM
7、IIS
8、AC97
二 基础知识
1、wav文件
wave是录音时用的标准wundows文件格式,文件扩展名为wav,数据本身的格式为pcm或压缩型。所有的wav都至少有一个42字节的文件头。
WAVE的基本结构 WAVEFORMATEX 结构定义如下:
typedef struct
{
word wFormatag; //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
4 WORD nChannls; //声道数,单声道为1,双声道为2;
5
6 DWORD nSamplesPerSec; //采样频率;
7
8 DWORD nAvgBytesperSec; //每秒的数据量;
9
10 WORD nBlockAlign; //块对齐;
11
12 WORD wBitsPerSample; //WAVE文件的采样大小;
13
14 WORD cbSize; // The count in bytes of the size of extra
15 // information(after cbSize). PCM中忽略此值
16 } WAVEFORMATEX; IMAADPC
1、采样率和比特深度
采样率: 声音信号在“模数”转换过程中单位时间内采样的次数,要求,每次震动至少要求两次采样,才能够复原波形。
采样数据记录的是振幅,采样精度取决于存储空间的大小。1字节(也就是8bit)能够将振幅划分为256等分,能记录256个数。
采样大小: 获得该频率的能量值并量化,用于表示信号强度。量化电平数为2的整数次幂。假设对一个波进行8次采样,采样点分别对应的能量值分别为A1-A8,但我们只使用2bit的采样大小,结果我们只能保留A1-A8中4个点的 值而舍弃另外4个。如果我们进行3bit的采样大小,则刚好记录下8个点的所有信息。
比特率:比特率就一般是128kbps,反映每秒所使用的空间大小。立体声16位44KHZ声音的比特率为 44100*16*2=1411200bps;b是比特的意思,ps是每秒。
采样率和采样大小的值越大,记录的波形更接近原始信号。
就可以根据一个wav文件的大小、采样率、和采样大小估算wav文件的播放长度:播放时间= 文件大小/比特率。
较高的采样率只有相对模拟信号的时候才有用,如果被采样的信号是数字的,请不要去尝试提高采样率。
2、ADC/DAC转换
数模转换、模数转换:
ADC:1、逐次逼近法。2、双积分法
DAC: 1、电压输出型,电流输出型。
3、pcm、iis、AC97
数字音频常用到音频协议有PCM,I2S,AC97,其中:
PCM主要用于语音通信,一般采样频率为8K.
I2s 是芯片之间的协议,主要为AP到codec之间,I2S常用的3根线:
MCLK:称为主时钟,也叫系统时钟(Sys Clock),是采样频率的256倍,384倍或512倍。
BCLK:串行时钟SCLK,也叫位时钟
LRCK:帧时钟,用于切换左右声道的数据。LRCK为“1”表示正在传输的是左声道的数据,为“0”则表示正在传输的是右声道的数据。LRCK的频率等于采样频率。MCLK是用给系统使用的,SMCLK用给高速外设使用的,而ACLK主要用给低速外设使用
AC97则多数用于PC方面,自身包含控制信号,不像I2S需要额外的控制信号例如I2C
通常所说的audio codec(如:UDA1341)的编码器的输出/解码器的输入是线性PCM格式
pcm, 一般是语音信号
i2s 一般是audio信号 用于AP和codec之间
ac97用于AP和codec AC97本身有控制信号而I2S则需要外加的控制信号例如I2C
1)pcm:PCM (Pulse Code Modulation 脉波编码调变)依照数字讯号压缩方式不同,可分为μ-low(mu low)及a-low,μ-low主要为美国及日本所使用,而a-low则是欧洲或其它地区所使用,负责数字音讯传输处理。
PCM是一种四线式的音讯接口,采用特殊的调变、解调变方式实现多声道功能,将讯号的强度依照同样的间距分成数段,然后再采用特殊的数字符号来量化(Quantization),PCM通常被应用于数字电信系统上,PCM主要可分三个过程,取样、量化及解碼
功能介绍
PCM串行协议分析使用了四条讯号线做为传输媒介,分别是
SCLK : 同步频率
FS : 帧同步频率(包含了FSO/FSI)
DR : 输入数据
DX : 输出数据
PCM串行协议分析一般速率为64Kbps,是对语音讯号直接取样量化的一种编码方式,一个取样点速率约为8KHz,每个取样点以8bits/16bits(二进制)方式显示。
算一个PCM音频流的码率是一件很轻松的事情,采样率值×采样大小值×声道数 bps。一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的WAV文件,它的数据速率则为 44.1K×16×2 =1411.2 Kbps。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。
pcm数据格式: 一帧pcm数据由2048次采样构成。
pcm文件所占容量的公式:存储量=(采样频率*采样位数*声道)*时间/8
2)i2s总线:
I2S(InterIC Sound Bus)是飞利浦公司针对数字音频设备之间的音频数据传输而制定的一种总线标准,采用沿独立的导线传输时钟与数据信号的设计,通过分离数据和时钟信号,避免了时差诱发的失真。I2S总线简单有效,可以有效提升输出数据的质量。
I2S为三线总线,3个信号分别为:
① 串行时钟SCK,也叫位时钟(BCK)。即每发送1位数字音频数据,SCK上都有1个脉冲。SCK的频率=2×采样频率×采样位数。在数据传输过程中,I2S总线的发送器和接收器都可以作为系统的主机来提供系统的时钟频率。
② 帧时钟WS,即命令(声道)选择,用于切换左右声道的数据。WS的频率等于采样频率,由系统主机提供。WS为“1”表示传输的是左声道的数据,WS为“0”表示传输的是右声道的数据。
③ 串行数据信号SD,用于传输二进制补码表示的音频数据。
I2S格式的信号无论有多少位有效数据,数据位的最高位(MSB)总是被最先传输,1次能够发送的数据决定于I2S格式的有效位数。
1个典型的I2S信号时序如图1所示
软件模拟I2S引脚的定义如下:
#define I2S_WS GPIO_PIN_5//模拟I2S声道选择时钟控制位
#define I2S_BCK GPIO_PIN_6//模拟I2S位时钟控制位
#define I2S_DATA GPIO_PIN_7//模拟I2S数据传送位
根据MS6336的I2S总线格式以及数据发送流程,软件模拟I2S总线的步骤如下:
① 根据语音数据采样率及采样位数计算得到SCK的值和WS的值(WS的值等于采样频率)。
系统采样率为44.1 kHz,则SCK=2×44.1 kHz×103×16=1 411 200 Hz,WS=44 100 Hz。1个SCK时钟周期T=1/SCK=07 μs。采用延时程序模拟SCK时钟周期需要应用示波器来精确延时时间。本系统中一个SCK周期的延时为delayI2S(2)。
② 将WS、BCK和DATA均置为高电平。
③ 选择左右声道。首先发送左声道数据,将WS置低(若发送右声道数据则将WS置高)。
for(ChannelCnt=0;ChannelCnt<2;ChannelCnt++){//双声道选择播放
if(ChannelCnt==0){//右声道选择信号为高电平
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS << 2))) = ~I2S_WS;
}
else{//左声道选择信号为低电平
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS << 2))) = I2S_WS;
}
……
}
④ 选择高低字节。将左声道数据以高低字节的顺序发送,在发送高字节第1位数据之前先发送1个周期的串行时钟。
for(HorLCnt=0;HorLCnt<2;HorLCnt++){//声道数据高低字节选择
if(ChannelCnt==1){//左声道
if(HorLCnt==0){//低字节
c=*(SampleData+1);//SampleData指向音频数据缓冲区首地址,即左声道低字节
delayI2S(2);//发送第一个数据位之前需要延迟一个位时钟周期
}
else{//低字节
c=*SampleData;
}
}
……
}
⑤ 开始传输音频数据(音频数据的传输在SCK下降沿准备数据,在SCK的上升沿发
送给数据接收端)。将采样点左声道数据的高字节最高位送给SD,设置SCK为低电平,此时为SCK的下降沿,数据准备好。延时半个SCK周期以后将SCK置为高电平,此时SD线上的数据发送给数据接收端,延时半个SCK周期。依次将左声道剩余位数据按照最高位的方式发送出去。
for(BitCnt=0;BitCnt<8;BitCnt++){//1次传送的数据长度为8位,先传送高字节再传送低字节置时钟线SCK为低,开始准备数据位
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_BCK << 2))) = ~I2S_BCK;
if((c<<BitCnt)&0x80) {
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_DATA << 2))) = I2S_DATA;
}
else{
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_DATA << 2))) = ~I2S_DATA;
}
delayI2S(1); //延时半个SCK时钟周期置时钟线为高,开始传输数据位
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_BCK << 2))) = I2S_BCK;
delayI2S(1);//延时半个时钟周期
}
⑥ 当将1个采样点的左声道的数据发送完以后,延时2个SCK周期,然后发送右声道的数据(同左声道数据的发送过程)。
根据以上的过程对每个采样点的数据进行处理,就可以实现通过软件模拟I2S总线传输音频数据了。以上实现的是典型I2S时序模拟,而左对齐和右对齐2种格式只是时序稍有差异,模拟实现过程同典型I2S总线模拟实现过程基本相同。