搜档网
当前位置:搜档网 › MATLAB音频文件处理

MATLAB音频文件处理

实验报告

课程名称数字音视频原理

实验题目MATLAB音频文件处理专业电子信息工程

班级3班

学号

学生姓名

实验成绩

指导教师

2012年3月

一、实验目的

1、掌握录制语音信号的基本过程;

2、掌握MATLAB编程对语音信号进行简单处理的方法并分析结果。

二、实验要求

上机完成实验题目,独立完成实验报告。

三、实验内容

1、问题的提出:数字语音是信号的一种,我们处理数字语音信号,也就是对一种信号的处理,那信号是什么呢?

信号是传递信息的函数。离散时间信号(序列)——可以用图形来表示。

按信号特点的不同,信号可表示成一个或几个独立变量的函数。例如,图像信号就是空间位置(二元变量)的亮度函数。一维变量可以是时间,也可以是其他参量,习惯上将其看成时间。信号有以下几种:

(1)连续时间信号:在连续时间范围内定义的信号,但信号的幅值可以是连续数值,也可以是离散数值。当幅值为连续这一特点情况下又常称为模拟信号。实际上连续时间信号与模拟信号常常通用,用以说明同一信号。

(2)离散时间信号:时间为离散变量的信号,即独立变量时间被量化了。而幅度仍是连续变化的。

(3)数字信号:时间离散而幅度量化的信号。

语音信号是基于时间轴上的一维数字信号,在这里主要是对语音信号进行频域上的分析。在信号分析中,频域往往包含了更多的信息。对于频域来说,大概有8种波形可以让我们分析:矩形方波,锯齿波,梯形波,临界阻尼指数脉冲波形,三角波,余弦波,余弦平方波,高斯波。对于各种波形,我们都可以用一种方法来分析,就是傅立叶变换:将时域的波形转化到频域来分析。

2、设计方案:

首先要对声音信号进行采集,Windows自带的录音机程序可驱动声卡来采集语音信号,并能保存成.WAV格式文件,供MATLAB相关函数直接读取、写入或播放。

利用MATLAB中的wavread命令来读入(采集)语音信号,将它赋值给某一向量。再将该向量看作一个普通的信号,对其进行FFT变换实现频谱分析,再依

据实际情况对它进行滤波。对于波形图与频谱图(包括滤波前后的对比图)都可以用 MATLAB画出。我们还可以通过sound/wavplay命令来对语音信号进行回放,以便在听觉上来感受声音的变化。

3、主体部分:

(1)语音的录入与打开:

[x,fs,bits]=wavread('d:\1.wav');%用于读取语音,采样值放在向量x中,fs 表示采样频率(Hz),bits表示量化位数。

sound(x,fs,bits); 用于对声音的回放。向量x则代表了一个信号(也即一个复杂的“函数表达式”)也就是说可以像处理一个信号表达式一样处理这个声音信号。

(2)FFT的MATLAB实现:在MATLAB的信号处理工具箱中函数FFT和IFFT 用于快速傅立叶变换和逆变换。

函数FFT用于序列快速傅立叶变换。函数的一种调用格式为 y=fft(x)。其中,x是序列,y是序列的FFT,x可以为一向量或矩阵,若x为一向量,y是x 的FFT,且和x相同长度。若x为一矩阵,则y是对矩阵的每一列向量进行FFT。

经函数fft求得的序列y一般是复序列,通常要求其幅值和相位。MATLAB 提供求复数的幅值和相位函数:abs,angle,这些函数一般和FFT同时使用。用MATLAB工具箱函数fft进行频谱分析时需注意:

a、函数fft返回值y的数据结构对称性;

b、频率计算

若N点序列x(n)(n=0,1,…,N-1)是在采样频率f下获得的。它的FFT也是N点序列,即X(k)(k=0,1,2,…,N-1),则第k点所对应实际频率值为f=k*f /N。

(3)下面的一段程序是语音信号在MATLAB中的最简单表现,它实现了语音的读入打开,以及绘出了语音信号的波形频谱图。

[x,fs,bits]=wavread(' d:\1.wav ');

sound(x,fs,bits);

X=fft(x);

magX=abs(X);

subplot(211);plot(x);title('原始信号波形');

subplot(212);plot(magX);title('原始信号幅值');

运行结果如图:

(4)定点分析:已知一个语音信号,数据采样频率为100Hz,试分别绘制N =128点FFT的幅频图和N=1024点FFT幅频图。

编程如下:

x=wavread(' d:\1.wav ');

sound(x);

fs=100;N=128;

y=fft(x,N);

magy=abs(y);

f=(0:length(y)-1)*fs/length(y);

subplot(221);plot(f,magy);

xlabel('频率(Hz)');ylabel('幅值');

title('N=128(a)');grid

subplot(222);plot(f(1:N/2),magy(1:N/2)); xlabel('频率(Hz)');ylabel('幅值');

title('N=128(b)');grid

fs=100;N=1024;

y=fft(x,N);

magy=abs(y);

f=(0:length(y)-1)*fs/length(y);

subplot(223);plot(f,magy);

xlabel('频率(Hz)');ylabel('幅值');

title('N=1024(c)');grid

subplot(224);plot(f(1:N/2),magy(1:N/2));

xlabel('频率(Hz)');ylabel('幅值');

title('N=1024(d)');grid

运行结果如图:

上图(a)、(b)为N=128点幅频谱图,(c)、(d)为N=1024点幅频谱图。由于采样频率f =100Hz,故Nyquist频率为 50Hz。(a)、(c)是0~100Hz频谱图,(b)、(d)是0~50Hz频谱图。由(a)或(c)可见,整个频谱图是以Nyquist频率为轴对称的。因此利用fft对信号作频谱分析,只要考察0~Nyquist频率(采样频率一半)范围的幅频特性。比较(a)和(c)或(b)和(d)可见,幅值大小与fft选用点

数N有关,但只要点数N足够不影响研究结果。

(5)音量最大化处理

录制声音过程中需对声音电平进行量化处理,最理想的量化是最大电平对应最高量化比特,但实际却很难做到,常有轻音问题。利用MATLAB很容易实现音量标准化,即最大电平对应最高量化比特。基本步骤是:先用wavread函数将.wav 文件转换成列数组变量;再求出数组变量的极值并对所有元素作归一化处理;最后用wavwrite函数还原成音量标准化的.wav文件。

%音量标准化

clear;close all;clc;

[y,fs,bits]=wavread(' d:\1.wav ');

fs,bits;

ym=max(max(max(y)),max(abs(min(y))));

x=y/ym;

wavwrite(x,fs,bits,'2.wav');

处理后音量增大。

运行结果如图:

四、作业

1、写出读入、写出、播放语音信号的函数;

[x,fs,bits]=wavread('d:\1.wav') 读入语音信号的函数

wavwrite(x,fs,bits,'2.wav') 写出语音信号的函数

sound(x,fs,bits) 播放语音信号的函数

2、用200Hz的采样频率对语音信号进行处理时,利用fft对信号作频谱分析,考察的幅频特性频率范围一般是多少?为什么选择这个范围?

考察的幅频特性频率范围是0-100HZ。由于采样频率f =200Hz,故Nyquist 频率为100Hz,整个频谱图是以Nyquist频率为轴对称的。因此利用fft对信号作频谱分析,只要考察0~Nyquist频率(采样频率一半)范围的幅频特性。

五、实验心得

通过这次实验我又学到了许多新的知识,我发现我越来越喜欢这个实验了。

指导教师签字:

年月日

相关主题