多媒体综合实验报告
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)基础知识
数字音频设备(也称codec,PCM,DSP,ADC/DAC设备):播放或录制数字化的声音。它的指标主要有:采样速率(电话为8K,DVD为96K)、channel数目(单声道,立体声)、采样分辨率(8-bit,16-bit)。
mixer(混频器):用来控制多个输入、输出的音量,也控制输入(microphone,line-in,CD之间的切换。
注意,用户始终要读/写一个完整的采样。例如一个16-bit的立体声模式下,每个采样有4个字节,所以应用程序每次必须读/写4的倍数个字节。
另外,由于OSS是一个跨平台的音频接口,所以用户在编程的时候,要考虑到可移植性的问题,其中一个重要的方面是读/写时的字节顺序。
4)设置参数
设置采样格式
在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:
4.
CVSD增量调制是由PCM发展而来的模拟信号数字化的一种编码方式,它是PCM的一种特例。增量调制编码基本原理是指用一位编码,这一位码不是表示信号抽样值的大小,而是表示抽样幅度的增量特性,即采用一位二进制数码“1”或“0”来表示信号在抽样时刻的值相对于前一个抽样时刻的值是增大还是减小,增大则输出“1”码,减小则输出“0”码。输出的“1”,“0”只是表示信号相对于前一个时刻的增减,不表示信号的绝对值。
#define INPUTBUFSIZE RAWBUFSIZE * 2
/* The max amount of bytes of speech data to process at once */
#define ENCODEDBUFSIZE RAWBUFSIZE / 2
int initSoundDevice(int fd);
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>
#include <termios.h>
#include <errno.h>
(3)DPCM&ADPCM
降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。因为差分信号比原语音信号的动态范围和平均能量都小。这种编码叫Differential PCM,简称DPCM,即差分脉冲编码调制。
#define RECORD 0
#define PLAY 1
/* Number of samples to process at once */
#define NUMSAMPLES 80
/* Mono 16 bit */
#define RAWBUFSIZE NUMSAMPLES * 2
/* Stereo 16 bit */
ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。CCITT(国际电报电话咨询委员会)在1984年提出的32 kbps的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。这种ADPCM编码方案达到64 kbpsPCM的语音传输质量,并具有很好的抗误码性能。
3.
(1)简介
OSS(Open Sound System)是Linux平台上一个统一的音频接口,即只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。以前,每个Unix厂商都会提供一个自己专有的API,用来处理音频。这就意味着为一种Unix平台编写的音频处理应用程序,在移植到另外一种Unix平台上时,必须要重写。不仅如此,在一种平台上具备的功能,可能在另外一个平台上无法实现。但是,OSS出现以后情况就大不一样了,只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。因此,OSS提供了源代码级的可移植性。
int kbhit(void);
int channel = CHANNELS;
int rate = RATE;
unsigned char buf[INPUTBUFSIZE];
int record(int fd);
int play(int fd);
void VolUP();
void VolDOWN();
下面的mixer_fd是对mixer设备执行open操作返回的文件描述符。
1)调节音量
应用程序通过ioctl的SOUND_MIXER_READ和SOUND_MIXER_WIRTE功能号来读取/设置音量。在OSS中,音量的大小范围在0-100之间。使用方法如下:
SOUND_MIXER_MIC是通道参数,表示读microphone通道的音量,结果放置在vol中。如果通道是立体声,那么vol的最低有效字节为左声道的音量值,接着的字节为右声道的音量值,另外的两个字节不用。如果通道是单声道,vol中左声道与右声道具有相同的值。
一
1.使用DSP实现语音压缩和解压缩的基本算法,本次实验采用G.711语音压缩算法。
2.采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。
3.对语音信号进行回放。
4.在播放过程中能实现音量的控制与声道的转换。
5.扩展功能:使用cvsd增量调制编码算法实现语音编码与解码。
2.
(1)概念
语音编码一般分为两类:一类是波形编码,一类是被称为“声码器技术”的编码。PCM编码即脉冲编码调制。波形编码的最简单形式就是脉冲编码调制(Pulse code modulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
(2)量化
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:A律和u律,u律是最常用的一种。在美国,7位u律是长途电话质量的标准。而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
2)查询mixer的能力
SOUND_MIXER_READ_xxxx中的xxxx代表具体要查询的内容,比如检查可用的mixer通道用SOUND_MIXER_READ_DEVMASK;检查可用的录音设备,用SOUND_MIXER_READ_RECMASK;检查单声道/立体声,用SOUND_MIXER_READ_STEREODEVS;检查mixer的一般能力,用SOUND_MIXER_READ_CAPS等等。所有通道的查询的结果都放在mask中,所以要区分出特定通道的状况,使用mask&(1 << channel_no)。
int set();
int setchannel();
int setrate();
int soundfd;
int main()
在OSS中,主要有以下的几种设备文件:
/dev/mixer:访问声卡中内置的mixer,调整音量大小,选择音源。
/dev/sndstat:测试声卡,执行cat /dev/sndstat会显示声卡驱动的信息。
/dev/dsp、/dev/dspW、/dev/audio:读这个设备就相当于录音,写这个设备就相当于放音。/dev/dsp与/dev/audio之间的区别在于采样的编码不同,/dev/audio使用μ律编码,/dev/dsp使用8-bit(无符号)线性编码,/dev/dspW使用16-bit(有符号)线形编码。/dev/audio主要是为了与SunOS兼容,所以尽量不要使用。
3)选择mixer的录音通道
首先可以通过SOUND_MIXER_READ_RECMASK检查可用的录音通道,然后通过SOUND_MIXER_WRITE_RECSRC选择录音通道。可以随时通过SOUND_MIXER_READ_RECSRC查询当前声卡中已经被选择的录音通道。OSS建议把mixer的用户控制功能单独出来形成一个通用的程序。但前提是,在使用mixer之前,首先通过API的查询功能检查声卡的能力。在linux中,就有一个专门的mixer程序--aumix。
/dev/sequencer:访问声卡内置的,或者连接在MIDI接口的synthesizer。
(3)音频编程
1)打开音频设备
i.头文件Y,O_WRONLY和O_RDWR,分别表示只读、只写和读写。OSS建议尽量使用只读或只写,只有在全双工的情况下(即录音和放音同时)才使用读写模式。
synthesizer(合成器):通过一些预先定义好的波形来合成声音,有时用在游戏中声音效果的产生。
MIDI接口:MIDI接口是为了连接舞台上的synthesizer、键盘、道具、灯光控制器的一种串行接口。
在Linux系统中,所有的设备都被统一成文件,通过对文件的访问方式(首先open,然后read/write,同时可以使用ioctl读取/设置参数,最后close)来访问设备。
同时,很多Linux工作站中,只能提供录音与放音的功能。有了OSS后,给这些工作站带来了MIDI功能,加上音频流、语音识别/生成、计算机电话(CT)、JAVA以及其它的多媒体技术,在Linux工作站中,同样可以享受到同Windows、Macintosh环境一样的音频世界。另外,OSS还提供了与视频和动画播放同步的音频能力,这对实现动画、游戏提供了帮助。
二、实验目的
1.学会在Linux环境下进行简单应用程序的编写。
2.掌握在Linux环境下进行语音信号的编码与解码。
3.掌握增量调制编码(CVSD)的基本原理,并实现增量调制编码算法。
三、实验原理
1.
语音采集与输出模块采用的是一款高性能的立体声音频Codec芯片TLV320AIC33,支持MIC和LINE IN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。AD50的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。
设置通道数目
设置采样速率
(3)Mixer编程
对Mixer的控制,包括调节音量(volume)、选择录音音源(microphone,line-in)、查询mixer的功能和状态,主要是通过Mixer设备/dev/mixer的ioctl接口。相应的,ioctl接口提供的功能也分为三类:调节音量、查询mixer的能力、选择mixer的录音通道。下面分别介绍使用的方法:
/* Demo headers */
#include "rendezvous.h"
#include "pause.h"
#include "encode.h"
#define LENGTH 1
#define RATE 8000
#define SIZE AFMT_S16_LE
#define CHANNELS 2
四、实验器材
计算机,达芬奇实验板,虚拟机,耳机,音频线
五、实验代码
1.
/* Standard Linux headers */
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
增量调制编码基本原理是指用一位编码这一位码不是表示信号抽样值的大小而是表示抽样幅度的增量特性即采用一位二进制数码1或0来表示信号在抽样时刻的值相对于前一个抽样时刻的值是增大还是减小增大则输出1码减小则输出0码
多媒体综合实验
学院:信息与通信工程学院
班级:2008211101
姓名:高瑞
学号:08210022
2)录音
count为录音数据的字节个数(建议为2的指数),但不能超过audio_buffer的大小。从读字节的个数可以精确的测量时间,例如8kHZ 16-bit stereo的速率为8000*2*2=32000bytes/second,这是知道何时停止录音的唯一方法。
3)放音
放音实际上和录音很类似,只不过把read改成write即可,相应的audio_buffer中为音频数据,count为数据的长度。
数字音频设备(也称codec,PCM,DSP,ADC/DAC设备):播放或录制数字化的声音。它的指标主要有:采样速率(电话为8K,DVD为96K)、channel数目(单声道,立体声)、采样分辨率(8-bit,16-bit)。
mixer(混频器):用来控制多个输入、输出的音量,也控制输入(microphone,line-in,CD之间的切换。
注意,用户始终要读/写一个完整的采样。例如一个16-bit的立体声模式下,每个采样有4个字节,所以应用程序每次必须读/写4的倍数个字节。
另外,由于OSS是一个跨平台的音频接口,所以用户在编程的时候,要考虑到可移植性的问题,其中一个重要的方面是读/写时的字节顺序。
4)设置参数
设置采样格式
在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:
4.
CVSD增量调制是由PCM发展而来的模拟信号数字化的一种编码方式,它是PCM的一种特例。增量调制编码基本原理是指用一位编码,这一位码不是表示信号抽样值的大小,而是表示抽样幅度的增量特性,即采用一位二进制数码“1”或“0”来表示信号在抽样时刻的值相对于前一个抽样时刻的值是增大还是减小,增大则输出“1”码,减小则输出“0”码。输出的“1”,“0”只是表示信号相对于前一个时刻的增减,不表示信号的绝对值。
#define INPUTBUFSIZE RAWBUFSIZE * 2
/* The max amount of bytes of speech data to process at once */
#define ENCODEDBUFSIZE RAWBUFSIZE / 2
int initSoundDevice(int fd);
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>
#include <termios.h>
#include <errno.h>
(3)DPCM&ADPCM
降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。因为差分信号比原语音信号的动态范围和平均能量都小。这种编码叫Differential PCM,简称DPCM,即差分脉冲编码调制。
#define RECORD 0
#define PLAY 1
/* Number of samples to process at once */
#define NUMSAMPLES 80
/* Mono 16 bit */
#define RAWBUFSIZE NUMSAMPLES * 2
/* Stereo 16 bit */
ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。CCITT(国际电报电话咨询委员会)在1984年提出的32 kbps的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。这种ADPCM编码方案达到64 kbpsPCM的语音传输质量,并具有很好的抗误码性能。
3.
(1)简介
OSS(Open Sound System)是Linux平台上一个统一的音频接口,即只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。以前,每个Unix厂商都会提供一个自己专有的API,用来处理音频。这就意味着为一种Unix平台编写的音频处理应用程序,在移植到另外一种Unix平台上时,必须要重写。不仅如此,在一种平台上具备的功能,可能在另外一个平台上无法实现。但是,OSS出现以后情况就大不一样了,只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。因此,OSS提供了源代码级的可移植性。
int kbhit(void);
int channel = CHANNELS;
int rate = RATE;
unsigned char buf[INPUTBUFSIZE];
int record(int fd);
int play(int fd);
void VolUP();
void VolDOWN();
下面的mixer_fd是对mixer设备执行open操作返回的文件描述符。
1)调节音量
应用程序通过ioctl的SOUND_MIXER_READ和SOUND_MIXER_WIRTE功能号来读取/设置音量。在OSS中,音量的大小范围在0-100之间。使用方法如下:
SOUND_MIXER_MIC是通道参数,表示读microphone通道的音量,结果放置在vol中。如果通道是立体声,那么vol的最低有效字节为左声道的音量值,接着的字节为右声道的音量值,另外的两个字节不用。如果通道是单声道,vol中左声道与右声道具有相同的值。
一
1.使用DSP实现语音压缩和解压缩的基本算法,本次实验采用G.711语音压缩算法。
2.采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。
3.对语音信号进行回放。
4.在播放过程中能实现音量的控制与声道的转换。
5.扩展功能:使用cvsd增量调制编码算法实现语音编码与解码。
2.
(1)概念
语音编码一般分为两类:一类是波形编码,一类是被称为“声码器技术”的编码。PCM编码即脉冲编码调制。波形编码的最简单形式就是脉冲编码调制(Pulse code modulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
(2)量化
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:A律和u律,u律是最常用的一种。在美国,7位u律是长途电话质量的标准。而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
2)查询mixer的能力
SOUND_MIXER_READ_xxxx中的xxxx代表具体要查询的内容,比如检查可用的mixer通道用SOUND_MIXER_READ_DEVMASK;检查可用的录音设备,用SOUND_MIXER_READ_RECMASK;检查单声道/立体声,用SOUND_MIXER_READ_STEREODEVS;检查mixer的一般能力,用SOUND_MIXER_READ_CAPS等等。所有通道的查询的结果都放在mask中,所以要区分出特定通道的状况,使用mask&(1 << channel_no)。
int set();
int setchannel();
int setrate();
int soundfd;
int main()
在OSS中,主要有以下的几种设备文件:
/dev/mixer:访问声卡中内置的mixer,调整音量大小,选择音源。
/dev/sndstat:测试声卡,执行cat /dev/sndstat会显示声卡驱动的信息。
/dev/dsp、/dev/dspW、/dev/audio:读这个设备就相当于录音,写这个设备就相当于放音。/dev/dsp与/dev/audio之间的区别在于采样的编码不同,/dev/audio使用μ律编码,/dev/dsp使用8-bit(无符号)线性编码,/dev/dspW使用16-bit(有符号)线形编码。/dev/audio主要是为了与SunOS兼容,所以尽量不要使用。
3)选择mixer的录音通道
首先可以通过SOUND_MIXER_READ_RECMASK检查可用的录音通道,然后通过SOUND_MIXER_WRITE_RECSRC选择录音通道。可以随时通过SOUND_MIXER_READ_RECSRC查询当前声卡中已经被选择的录音通道。OSS建议把mixer的用户控制功能单独出来形成一个通用的程序。但前提是,在使用mixer之前,首先通过API的查询功能检查声卡的能力。在linux中,就有一个专门的mixer程序--aumix。
/dev/sequencer:访问声卡内置的,或者连接在MIDI接口的synthesizer。
(3)音频编程
1)打开音频设备
i.头文件Y,O_WRONLY和O_RDWR,分别表示只读、只写和读写。OSS建议尽量使用只读或只写,只有在全双工的情况下(即录音和放音同时)才使用读写模式。
synthesizer(合成器):通过一些预先定义好的波形来合成声音,有时用在游戏中声音效果的产生。
MIDI接口:MIDI接口是为了连接舞台上的synthesizer、键盘、道具、灯光控制器的一种串行接口。
在Linux系统中,所有的设备都被统一成文件,通过对文件的访问方式(首先open,然后read/write,同时可以使用ioctl读取/设置参数,最后close)来访问设备。
同时,很多Linux工作站中,只能提供录音与放音的功能。有了OSS后,给这些工作站带来了MIDI功能,加上音频流、语音识别/生成、计算机电话(CT)、JAVA以及其它的多媒体技术,在Linux工作站中,同样可以享受到同Windows、Macintosh环境一样的音频世界。另外,OSS还提供了与视频和动画播放同步的音频能力,这对实现动画、游戏提供了帮助。
二、实验目的
1.学会在Linux环境下进行简单应用程序的编写。
2.掌握在Linux环境下进行语音信号的编码与解码。
3.掌握增量调制编码(CVSD)的基本原理,并实现增量调制编码算法。
三、实验原理
1.
语音采集与输出模块采用的是一款高性能的立体声音频Codec芯片TLV320AIC33,支持MIC和LINE IN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。AD50的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。
设置通道数目
设置采样速率
(3)Mixer编程
对Mixer的控制,包括调节音量(volume)、选择录音音源(microphone,line-in)、查询mixer的功能和状态,主要是通过Mixer设备/dev/mixer的ioctl接口。相应的,ioctl接口提供的功能也分为三类:调节音量、查询mixer的能力、选择mixer的录音通道。下面分别介绍使用的方法:
/* Demo headers */
#include "rendezvous.h"
#include "pause.h"
#include "encode.h"
#define LENGTH 1
#define RATE 8000
#define SIZE AFMT_S16_LE
#define CHANNELS 2
四、实验器材
计算机,达芬奇实验板,虚拟机,耳机,音频线
五、实验代码
1.
/* Standard Linux headers */
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
增量调制编码基本原理是指用一位编码这一位码不是表示信号抽样值的大小而是表示抽样幅度的增量特性即采用一位二进制数码1或0来表示信号在抽样时刻的值相对于前一个抽样时刻的值是增大还是减小增大则输出1码减小则输出0码
多媒体综合实验
学院:信息与通信工程学院
班级:2008211101
姓名:高瑞
学号:08210022
2)录音
count为录音数据的字节个数(建议为2的指数),但不能超过audio_buffer的大小。从读字节的个数可以精确的测量时间,例如8kHZ 16-bit stereo的速率为8000*2*2=32000bytes/second,这是知道何时停止录音的唯一方法。
3)放音
放音实际上和录音很类似,只不过把read改成write即可,相应的audio_buffer中为音频数据,count为数据的长度。