实验二 语音信号的预处理
一、实验目的
(1)了解 MATLAB 采集语音信号的原理及常用命令;
(2)熟练掌握基于 MATLAB 的语音文件的创建、读写等基本操作;
(3)学会使用 Plot 命令来显示语音信号波形,并掌握基本的标注方法;
(4) 掌握语音信号预处理方法。
二、实验要求
(1)编写 MATLAB 程序实现录制语音信号“你好,欢迎.”,并保存为 “hello.wav”文件,要求采样频率为 16000Hz,采样精度 16 bit;
(2)使用 audioread 函数读取“hello.wav”文件,并使用 plot 函数显示出来。要求:横轴和纵轴带有标注。横轴的单位为秒,纵轴显示的为归一化后的数值。
(3)测试 MATLAB 的去线性趋势项函数 detrend 的作用。根据消除多项式趋势项的原理,编写消除多项式趋势项的函数 detrendN,并仿真测试,参考语音信号“hello.wav”。
(4)设计一个低通滤波器,并绘出其幅频和相频曲线。设计指标为:fs=800Hz,Wp=50Hz,Ws=60Hz, Rp=3dB,Rs=80dB。
三、实验程序
- 语音采集与读写
%语音采集与读写
fs = 16000;
duration = 5;
n=duration*fs;
t=(1:n)/fs;
recorder = audiorecorder(fs,16,2); % 采样频率16000,采样位数16位,采样通道:2
disp('Start speaking.')
recordblocking(recorder, 5);
disp('End of Recording.');
fprintf('Finish\n');
fprintf('Press any key to play audio:\n');
pause
play(recorder);
myRecording = getaudiodata(recorder);
sound(myRecording,fs);
clear sound;
audiowrite('D:hello.wav',myRecording,fs);
figure(1);
axis([0 5 -1 1]);
plot(t,myRecording,'Color',[0.5,0.5,0.6]);
xlabel('时间/s');
ylabel('幅度');
sgtitle('语音采集与读写')
- 消除多项式趋势项
%消除多项式趋势项
clear all; clc; close all;
[x,fs]=audioread('hello.wav'); % 读入语音文件
len=length(x);
n=0.5:0.3/(len-1):0.8; %设置线性曲线
x=x+n'; % 叠加线性趋势线
t=(0:length(x)-1)/fs; % 设置时间
y=detrend(x); % 消除线性趋势项
y=y/max(abs(y)); % 幅值归一化
subplot 211; plot(t,x,'k'); % 画出带有趋势项的语音信号x
title('带趋势项的语音信号');
xlabel('时间/s'); ylabel('幅值');
subplot 212; plot(t,y,'k'); % 画出消除趋势项的语音信号y
xlabel('时间/s'); ylabel('幅值');
title('消除趋势项的语音信号');
sgtitle('消除趋势项')
%消除多项式趋势项函数
function [y,xtrend]=detrendN(x, fs, m)
x=x(:); % 把语音信号x转换为列数据
N=length(x); % 求出x的长度
t= (0: N-1)'/fs; % 按x的长度和采样频率设置时间序列
a=polyfit(t, x, m); % 用最小二乘法拟合语音信号x的多项式系数a
xtrend=polyval(a, t); % 用系数a和时间序列t构成趋势项
y=x-xtrend; % 从语音信号x中清除趋势项
end
- 数字滤波器
%低通滤波器
clc
clear all
fs=800;
%把截止频率转成弧度表示
wp = 50/(fs/2);
ws = 60/(fs/2);
rp=3; % 通带纹波系数
rs=80;% 阻带衰减系数
Nn=500;
[n,wn]=ellipord(wp,ws,rp,rs);
[b,a]=ellip(n,rp,rs,wn);
freqz(b,a,Nn,fs);
xlabel('频率(Hz)');ylabel('幅值(dB)');
sgtitle('低通滤波器')
四、实验结果
1.语音采集与读写
2.消除多项式趋势项
3.数字滤波器