实验一 Matlab语音处理基本指令

简介: 实验一 Matlab语音处理基本指令

实验一 Matlab语音处理基本指令

1.实验目的

1.学习与掌握如何使用Matlab对语音信号进行数字信号处理和分析。

2.掌握Matlab语音处理的基本指令。


2.实验设备及软件

应用软件Matlab2018a


3.实验原理

(1)语音信号的采集

采样定理,在进行模拟/数字信号的转换过程中,当采样频率大于信号中最高频率的2倍时,采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的5~10倍。采样定理又称奈奎斯特定理。

采样位数。采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。

采样频率。样频率是指计算机每秒钟采样多少个声音样本,是描述声音文件的音质、音调,衡量声卡、声音文件的质量标准。采样频率越高,即采样的间隔时间越短,则在单位时间内计算机得到的声音样本数据就越多,对声音波形的表示也越精确。采样频率与声音频率之间有一定的关系,根据奈奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。这就是说采样频率是衡量声卡采集、记录和还原声音文件的质量标准。
采样位数与采样频率的关系。采样位数和采样率对于音频接口来说是最为重要的两个指标,也是选择音频接口的两个重要标准。无论采样频率如何,理论上来说采样的位数决定了音频数据最大的力度,每增加一个采样位数相当于力度范围增加了6dB,采样位数越多则捕捉到
的信号越精确,对于采样率来说你可以想象它类似于一个照相机,44.1khz意味着音频流进入计算机时计算机每秒会对其拍照达441000次。显然采样率越高,计算机提取的图片越多,对于原始音频的还原也越加精确。

语音信号是一种模拟信号,首先须经过采样将其转换为数字信号,实质是把连续信号变为脉冲或数字序列。 我们可以用录音软件先录一段wav格式的音频。然后用matlab的audioread函数采集,记住采样频率和采样点。然后用sound函数来使用。

(2)MatLab软件基本介绍

MATLAB产生于1982年,是一种效率高、功能强的数值计算和可视化计算机高级语言,它将信号处理、数值分析和图形显示结合一体,形成了一个极其方便又强大的操作环境,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言的编辑模式,代表了当今国际科学计算软件的先进水平。

(3)MatLab与语音处理的关系

MATLAB软件以其强大的运算能力可以很好的完成对语音信号的处理。通过MATLAB可以对数字化的语音信号进行时频域分析,方便地展现语音信号的时域及频域曲线,并且根据语音的特性对语音进行分析。例如,请浊音的幅度差别、语音信号的端点、信号在频域中的共振峰频率、加不同窗和不同窗长对信号的影响、LPC分析、频谱分析等。 同时,通过MATLAB可以对数字化的语音信号进行估计和判别。例如,根据语音信号的短时参数,一级不同语音信号的短时参数的性质对一段给定的信号进行有无声和请浊音的判断、对语音信号的基音周期进行估计等。另外,通过利用MATLAB编程可以对语音信号进行各种处理。由于MATLAB是一种面向科学和工程计算的高级语言,允许用数学形式的语言编程,又有大量的库函数,所以编程简单、编程效率高、易学易懂,我们可以对信号进行加噪去噪、滤波、截取语音等,也可进行语音编码、语音识别、语音合成的处理等。总之,对于语音信号进行分析处理,MATLAB软件是当今比较高效的平台。

(4)Matlab语音处理基本指令语法说明

①audioread指令

wavread - Read WAVE (.wav) sound file
y = wavread(filename); %加载一个由字符串文件名指定的波形文件,返回y中的采样数据。
[y, Fs] = wavread(filename)
[y, Fs, nbits] = wavread(filename)
[y, Fs, nbits, opts] = wavread(filename)
[___] = wavread(filename, N)
[___] = wavread(filename, [N1 N2])
[___] = wavread(___, fmt)
siz = wavread(filename,'size')
audioread - Read audio file
[y,Fs] = audioread(filename) ; %从名为 filename 的文件中读取数据,并返回样本数据 y 以及该数据的采样率 Fs。
[y,Fs] = audioread(filename,samples); % 读取文件中所选范围的音频样本,其中 samples 是 [start,finish] 格式的向量。
[y,Fs] = audioread(___,dataType) ; %返回数据范围内与 dataType('native' 或 'double')对应的采样数据,可以包含先前语法中的任何输入

②load

load(filename); %从 filename 加载数据。如果 filename 是 MAT 文件,load(filename) 会将 MAT 文件中的变量加载到 MATLAB工作区。如果 filename 是 ASCII 文件,load(filename) 会创建一个包含该文件数据的双精度数组。

load(filename,variables) ; %加载 MAT 文件 filename 中的指定变量。
load(filename,'-ascii') ; %将 filename 视为 ASCII 文件,而不管文件扩展名如何。
load(filename,'-mat'); % 将 filename 视为 MAT 文件,而不管文件扩展名如何。
load(filename,'-mat',variables) ;%加载 filename 中的指定变量。
S = load(___); % 使用前面语法组中的任意输入参数将数据加载到 S 中。如果 filename 是 MAT 文件,则 S 是结构数组。

③write指令

wavwrite(y,'filename'); %将 y 中的数据写入wav文件,其中y 的每一列对应一个声道。要求 y 中的数据在 [-1, 1]。超出这个范围的都被截断。采样率默认为 8000Hz。16 位格式。
wavwrite(y,Fs,'filename'); %Fs 用来设定采样率。
wavwrite(y,Fs,N,'filename'); %N 指定数据的位数,可以为 8、16、24和32。当 N !=32时,wav文件按照PCM 码来存储。当N=32时,数据按照浮点数格式存储。

④plot指令

plot(X,Y) ; %创建 Y 中数据对 X 中对应值的二维线图。
plot(X,Y,LineSpec); % 设置线型、标记符号和颜色。
plot(Y); % 创建 Y 中数据对每个值索引的二维线图。
plot(Y,LineSpec) ; %设置线型、标记符号和颜色。
plot(___,Name,Value) ; %使用一个或多个 Name,Value 对组参数指定线条属性。
h = plot(___); % 返回由图形线条对象组成的列向量。在创建特定的图形线条后,可以使用 h 修改其属性。

⑤strip plot指令

strips(x); %在长度为250的水平条中绘制向量x。如果x是一个矩阵,条带(x)画出x的每一列。
strips(x,n); %将向量x绘制成条带,每个条带都有n个样本长。
strips(x,sd,fs); % 以持续sd秒为单位绘制向量x,给定每秒fs采样频率。
strips(x,sd,fs,scale) ; %缩放y轴。

⑥spectrum指令(时间序列模型的输出功率谱)

spectrum(sys) ; %创建所识别的时间序列sys输出功率频谱图。
spectrum(sys,{wmin, wmax}) ; %为从 wmin到wmax的频率创建频谱图.
spectrum(sys,w); % 使用矢量 w 中指定的频率创建频谱图w.
spectrum(sys1,...,sysN,w) ; %在一个图形上创建多个已识别模型的频谱图。ps = spectrum(sys,w) ; %返回系统在指定频率下sys功率频谱振幅, w。屏幕上不绘制任何图形。
[ps,w] = spectrum(sys) ; %返回频率向量, w w, 为其绘制输出功率谱。
[ps,w,sdps] = spectrum(sys) ; %返回功率谱的估计标准偏差.

⑦sample conversion(多级采样率转换)

Y=srconv(x,fsin,dsout)
-x:输入的语音数组;
-fsin:输入语音采样率;
-dsout:期望语音采样率;
fir1(基于窗口的fir滤波器设计)

b = fir1(n,Wn)
b = fir1(n,Wn,ftype)
b = fir1(___,window)
b = fir1(___,scaleopt)

n-筛选 顺序整数标量,n必须为偶数
Wn-频率约束 标量双元素向量多元素向量,0<wn<1
ftype-筛选器类型 一般为 "low" "bandpass" "high" "stop" "Dc-0" "Dc-1"

(5)数字语音处理基本过程:

注释:S/H—signal/hold

 A/D—analog/digit
 DSP—digit signal procceding
 LPF—low pass filter低通滤波器


4.实验内容

(1)首先对声音信号进行采集。

①MATLAB的数据采集工具箱提供了一整套命令和函数通过调用这些函数和命令可直接控制声卡进行数据采集。

② Windows自带的录音机程序也可驱动声卡来采集语音信号,并能保存为WAV格式文件。命名为Test.wav。

③得到测试声音信号:Test.wav

(2)学习Matlab语音处理基本指令用法。

(3)使用Matlab语音处理基本指令对采集到的语音信号进行处理。

①使用audioread指令从声音信号文件Test.wav中获取声音信号。
②使用load指令把声音信号文件Test.wav中加载到工作区。
③使用write指令处理声音信号文件Test.wav并记录结果。
④使用plot指令绘制声音信号的时域波形与频谱图。
⑤使用strip plot指令处理声音信号并记录结果。
⑤使用spectrum指令处理声音信号,绘制出声音信号的输出功率谱并记录。
⑦使用sample conversion指令处理声音信号并记录结果。
⑧将信号经高通滤波器处理绘制出相应波形并记录结果。

5.实验结果

(1)声音的获取与收听

①代码

[pyr,fs]=audioread('D:\Test.wav');   %声音的获取audioread
   sound(pyr,fs);                     %收听音频

②运行结果

(2)load命令的使用

①代码

save T1 pyr;                            %保存成mat文件
load('T1.mat');                        %将mat文件加载到工作区    

②运行结果

(3)write命令的使用

①代码

filename = 'Test_1.wav';                %从T1.mat文件加载到工作区
audiowrite(filename,pyr,fs);        

②运行结果

(4)使用plot指令绘制声音信号的时域波形与频谱图。

①代码

n1=length(pyr);
t=(0:n1-1)/fs;
pyr1=fft(pyr,n1);                        %快速傅里叶变换

figure(1);                        %绘出时域波
subplot(2,1,1);
plot(t,pyr);
xlabel('时间s');
ylabel('幅度');
title('声音信号时域图');
grid;

pyrFFTdb=20*log10(abs(pyr1+eps));  
subplot(2,1,2);                        %绘频域频谱
plot(fs*(0:n1/2-1)/n1,pyrFFTdb(1:n1/2));
title('声音信号频谱图');
xlabel('频率hz');
ylabel('幅度db');
grid;

②运行结果

(5)使用strip plot指令画出0.125秒的条状信号图

①代码

strips(pyr,0.125,fs);

②运行结果

(6)使用sample conversion指令对声音信号进行样本转换。

①代码

%采样率转换
y2=resample(pyr,11025,fs);          %取样频率48000Hz转变为11025Hz
②结果:
%写入后查看采样率的变换(时域波形图\频率响应图\频谱图)
sound(y2);                %播放变换后的声音

②运行结果

写入后查看采样率的变换(时域波形图\频率响应图\频谱图)

sound(y2);                %播放变换后的声音

(7)将信号经滤波器处理并绘制出相应波形。

①代码

f = 0.8;
n2 = 6;
a = fir1(n2,f,'high');                   %fir 高通滤波器                
p = filter(a,1,pyr);       %将音频传送到高通滤波器 

figure(2);                   %对比经过高通滤波器处理前后声音信号时域图
subplot(2,1,1);
plot(t,pyr);                 %原声音信号时域图
xlabel('时间s');
ylabel('幅度');
title('原始声音信号时域图');
subplot(2,1,2);
plot(t,p);   
xlabel('时间s');
ylabel('幅度');
title('高通滤波输出后声音信号时域图');


figure(3);              %对比经过高通滤波器处理前后声音信号频域图
pyrFFTdb=20*log10(abs(pyr1+eps));  
subplot(2,1,1);                        %绘频域频谱
plot(fs*(0:n1/2-1)/n1,pyrFFTdb(1:n1/2));
title('声音信号频谱图');
xlabel('频率hz');
ylabel('幅度db');
grid;
n3=length(p);
pyr2=fft(p,n3);
subplot(2,1,2)
pyr2FFTdb=20*log10(abs(pyr2+eps));  
plot(fs*(0:n3/2-1)/n3,pyr2FFTdb(1:n3/2));
subplot(2,1,2)
title('声音信号频谱图');
xlabel('频率hz');
ylabel('幅度db');

②运行结果

本实验代码所用文件

Test.wav、Test_1.wav

结语

本博客所有内容由以下团队成员共同完成(以下名单不分主次):
王xf、苏cy、成r、张qx、彭yf。
由于本博主能力有限,博文中提及的方法与代码即使经过测试,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。

(MATLAB练习)写一个MATLAB程序,完成如下任务:

  • 接受wav格式的任意一个语音文件名,如filename.wav,并用MATLAB命令wavread载入该文件。
  • 用MATLAB命令sound听该语音文件(要对该语音文件进行标定)。写下你听到的句子。
  • 画出该语音信号的N个样本值(使用合适的matlab命令),在样本fstart开始,在样本fstart+N+1结束。在每行画出语音的M个样本,在每页最多4行。程序运行时,指定绘图参数fstart、M、和N(即这些参数应读入程序)。
目录
相关文章
|
2月前
|
算法
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
51 0
|
2月前
|
算法
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
39 0
|
2月前
|
算法
【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱
56 1
|
2月前
|
算法
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
25 2
|
7月前
|
存储 算法 语音技术
基于ACF,AMDF算法的语音编码matlab仿真
基于ACF,AMDF算法的语音编码matlab仿真
|
2月前
|
算法
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
33 0
|
8月前
|
机器学习/深度学习 传感器 算法
【语音分析】语音信号线性预测分析Matlab实现
【语音分析】语音信号线性预测分析Matlab实现
|
2月前
|
算法
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
44 1
|
2月前
|
算法
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
108 0
|
8月前
|
算法
基于DCT变换和huffman编码的语音压缩算法matlab仿真
基于DCT变换和huffman编码的语音压缩算法matlab仿真

热门文章

最新文章