资源描述
实验一:声音处理技术基础
实验目的:
1、 掌握声音录制的基本方法。
2、 掌握MATLAB波形声音操作的函数,可以对声音进行简单的处理。
实验环境:
硬件,P4计算机,软件,winxp操作系统,MATLAB软件。
实验知识准备:
一、声音的数字化过程:声音是连续信号,以连续波的形式传播。而计算机只能处理数字信号,为使计算机能处理音频信号,必须对音频信号数字化。模拟信号数字化的步骤:采样、量化、编码。采样将连续信号离散化,即按一定的时间间隔取值。 ADC (Analogue Digital Converter)。每秒钟的采样次数即采样频率与声音的质量关系最为紧密。采样频率越高,声音质量越接近原始声音,所需的存储量便越多。标准的采样频率有:44.1KHz,22.05kHz,11.025kHz,8KHz等。根据奈奎斯特理论(Nyquist Theory),数字采样频率的大小由声音信号本身的最高频率决定。进行无损的数字化转换,采样频率至少是所采信号所含最高频率的2倍。为了把采样序列存入计算机,必须将样值量化为一个有限个幅度值的集合。通常用二进制数字表示量化后的样值。量化的过程:先将整个幅度划分为有限个小幅度(量化阶距)的集合,把落入某个阶距内的样值归为一类,并赋予相同的量化值。量化位数/采样字长,表示采样值的二进制位数(比特数),决定了采样值的精度。例如,量化位数16 bit,可以表示65536个不同量化值,精度(阶距)1/ 65536。量化位数8 bit,可以表示256个不同量化值,精度(阶距)1/ 256。
二、声音文件大小的计算:数据量(字节/秒)=采样频率 * 采样字长 * 声道数)/8,如每秒CD音质所对应的数据量为:(44.1K*16*2/8) = 176400 Byte。
三、声音录制的几种类型:录制麦克风的声音,首先设置系统的录音属性,选择录音控制对话框中的“麦克风”选项。同时需要将麦克风插入声卡的输入接口。
录制CD播放的声音时选择CD唱机,如下图
可以是录制,播放器软件播放的声音,可选择“Mono Mix”(单声道)或“Stereo Mix”(双声道)
也可以是线路输入的声音。
四、MATLAB软件简介:MATLAB名字由MATrix和 LABoratory 两词的前三个字母组合而成。在欧美大学里,诸如应用代数、数理统计、自动控制、数字信号处理、模拟与数字通信、时间序列分析、动态系统仿真等课程的教科书都把MATLAB作为内容。在国际学术界,在设计研究单位和工业部门,MATLAB被认作进行高效研究、开发的首选软件工具。MATLAB自问世起,就抱定一个宗旨,其所有数值计算算法都必须是国际公认的、最先进的、可靠算法;其程序由世界一流专家编制,并经高度优化;而执行算法的指令形式则必须简单、易读易用。MATLAB正是仰赖这些高质量的数值计算函数赢得了声誉。MATLAB数值计算函数库的另一特点是其内容的基础性和通用性。它正由于这一特点,而适应了诸如自动控制、信号处理、动力工程、电力系统等应用学科的需要,并进而开发出一系列应用工具包。我们今天使用了MATLAB中WAVE (.wav)格式声音文件的几个功能函数。
实验内容:
一、 使用winxp录音机:打开录音机程序,设置好录音属性,点击红色按钮即可。
录制声音的采样频率和量化位数可以选择,方法是执行菜单命令“文件”→“属性”,打开
如图所示对话框。可以在对话框中看到默认的录制格式,单击“开始转换”弹出录制格式对话框,在这个对话框中,“名称”下面的列表框中预置了几种声音格式可以选择,也可以从“属性”列表中选择一个合适的录制格式。录制完成后可以执行菜单“文件”→“保存”把
文件保存为WAV文件。选择不同的采样频率和量化位数,体验声音的质量。可以使用编辑菜单,对文件进行简单的编辑。
二、使用MATLAB进行操作。MATLAB提供的WAVE (.wav)格式声音文件操作的几个功能函数。如下:
1、wavread 读取微软 WAVE (.wav)音频文件。
语法:
y = wavread('filename')
[y,Fs,bits] = wavread('filename')
[...] = wavread('filename',N)
[...] = wavread('filename',[N1 N2])
[...] = wavread('filename','size')
描述:
wavread支持读取多通道数据,每个采样数据可以是32位,并支持读取24位和32位wav 文件。
y = wavread('filename')加载文件名为filename的 WAVE文件,将采样数据获得给y. 如果在没有给出扩展名的情况下 以.wav 为扩展名。幅度值在[-1,+1]范围内。
[y,Fs,bits] = wavread('filename') 返回文件中数据编码的采样频率Fs(Hz)和每个样本值的位数。
[...] = wavread('filename',N) 只返回文件中每个通道的前N个样本值。
[...] = wavread('filename',[N1 N2]) 返回文件中每个通道的N1到N2样本值。
siz = wavread('filename','size')返回文件中音频数据的尺寸来替代实际的音频数据,返回向量 siz = [samples channels].
2、Wavrecord:通过计算机上的音频输入设备来录制音频。
语法:
y = wavrecord(n,Fs)
y = wavrecord(...,ch)
y = wavrecord(...,'dtype')
描述:
y = wavrecord(n,Fs) 以采样频率为Fs(Hz)来录制音频信号的n个样本值。Fs 的缺省值大小为11025 Hz。
y = wavrecord(...,ch) 使用一品设备的ch输入通道来录制。Ch是1或2, 可以是单声道或双声道。Ch默认值是1.。
y = wavrecord(...,'dtype') 使用字符'dtype'定义的数据类型来录制声音。字符'dtype' 可以是下列之一:
l 'double' (default value), 16 bits/sample
l 'single', 16 bits/sample
l 'int16', 16 bits/sample
l 'uint8', 8 bits/sample
注释:
PC机音频硬件的标准采样频率为 8000, 11025, 2250, and 44100 Hz。立体声信号返回包含两列数据的矩阵。第一列对应了左声道的数据, 第二列对应右声道数据。
例子:
采样频率大小为11025 Hz ,样本精度为16-bit 录制5秒钟音频数据. 然后可以使用wavplay命令进行回放。 在wavrecord命令运行时提供声音输入信号。示例代码如下:
Fs = 11025;
y = wavrecord(5*Fs,Fs,'int16');
wavplay(y,Fs);
3、wavplay :
通过PC输出设备播放已经录制的声音。
语法:
wavplay(y,Fs)
wavplay(...,'mode')
描述:
wavplay(y,Fs) 通过PC输出设备播放向量y中的声音数据。可以指定Fs大小来确定声音信号的取样频率。默认值的大小为11025 Hz (samples per second)。Wavplay支持一个通道或两个通道(单声道或双声道)的声音信号。
wavplay(...,'mode')指定以'mode'方式播放。字符 'mode' 可以是:'async' (异步,默认值),'sync': 声音信号y 以下四种数据类型。 量化的位数播放样本数据依赖于数据类型。
数据类型
量化精度
Double-precision(default value)
16 bits/sample
Single-precision
16 bits/sample
16-bit signed integer
16 bits/sample
8-bit unsigned integer
8 bits/sample
注释:
如果y 是两列矩阵可以立体声方式播放。
例子:
文件gong.mat and chirp.mat 都包含了声音数据y和采样频率Fs。载入播放铜锣和唧唧声。load chirp;
y1 = y; Fs1 = Fs;
load gong;
wavplay(y1,Fs1,'sync') % The chirp signal finishes before the
wavplay(y,Fs) % gong signal begins playing.
4、wavwrite :
写微软WAVE (.wav)格式声音文件。
语法:
wavwrite(y,'filename')
wavwrite(y,Fs,'filename')
wavwrite(y,Fs,N,'filename')
描述:
wavwrite 支持写多通道 WAVE数据, 每个采样数据可以是32位,并支持写24位和32位 .wav文件。wavwrite(y,'filename') 写一个以字符filename为文件名的WAVE文件。 数据以每列一个通道方式来组织。在写之前振幅值超出[-1,+1]的部分被忽略掉。
wavwrite(y,Fs,'filename') 定义数据采样频率为 Fs, .
wavwrite(y,Fs,N,'filename') N <= 32.定义书写文件时每个样本的位数(精度)。
实验要求
1、 使用winxp录音机,进行文件的声音的录制,并保存成WAV文件。
2、 使用MATLAB提供的函数对该文件进行读取、观察波形信号、进行回放。
3、 使用MATLAB提供的函数进行声音的录制,并将其写成一个WAV文件。
4、 试分析一段语音的频谱分布
clear
[y,Fs,bits] = wavread('E:\music.wav');
wavplay(y(1:100000),Fs)
T = 1/Fs;
L = 100000;
t = (0:L-1)*T;
plot(Fs*t(1:50),y(1:50))
NFFT = 2^nextpow2(L);
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2);
plot(f,2*abs(Y(1:NFFT/2)))
for n=1:L-99
y1(n)=sum(y(n:n+99))/100;
end
wavplay(y1,Fs)
subplot(2,1,1,'r'),plot(y(1:L))
subplot(2,1,2,'r'),plot(y1)
展开阅读全文