《语音信号处理》实验报告
(完整word版)语音信号处理实验报告实验一

通信工程学院12级1班罗恒2012101032实验一语音信号的低通滤波和短时分析综合实验一、实验要求1、根据已有语音信号,设计一个低通滤波器,带宽为采样频率的四分之一,求输出信号;2、辨别原始语音信号与滤波器输出信号有何区别,说明原因;3、改变滤波器带宽,重复滤波实验,辨别语音信号的变化,说明原因;4、利用矩形窗和汉明窗对语音信号进行短时傅立叶分析,绘制语谱图并估计基音周期,分析两种窗函数对基音估计的影响;5、改变窗口长度,重复上一步,说明窗口长度对基音估计的影响。
二、实验目的1.在理论学习的基础上,进一步地理解和掌握语音信号低通滤波的意义,低通滤波分析的基本方法。
2.进一步理解和掌握语音信号不同的窗函数傅里叶变化对基音估计的影响。
三、实验设备1.PC机;2。
MATLAB软件环境;四、实验内容1。
上机前用Matlab语言完成程序编写工作.2。
程序应具有加窗(分帧)、绘制曲线等功能。
3.上机实验时先调试程序,通过后进行信号处理。
4.对录入的语音数据进行处理,并显示运行结果。
5。
改变滤波带宽,辨别与原始信号的区别。
6。
依据曲线对该语音段进行所需要的分析,并且作出结论。
7.改变窗的宽度(帧长),重复上面的分析内容。
五、实验原理及方法利用双线性变换设计IIR滤波器(巴特沃斯数字低通滤波器的设计),首先要设计出满足指标要求的模拟滤波器的传递函数Ha(s),然后由Ha(s)通过双线性变换可得所要设计的IIR滤波器的系统函数H(z)。
如果给定的指标为数字滤波器的指标,则首先要转换成模拟滤波器的技术指标,这里主要是边界频率Wp和Ws的转换,对ap和as指标不作变化。
边界频率的转换关系为∩=2/T tan(w/2).接着,按照模拟低通滤波器的技术指标根据相应设计公式求出滤波器的阶数N和3dB截止频率∩c ;根据阶数N查巴特沃斯归一化低通滤波器参数表,得到归一化传输函数Ha(p);最后,将p=s/ ∩c 代入Ha(p)去归一,得到实际的模拟滤波器传输函数Ha(s)。
语音信号处理实验报告11

实验一 语音信号的时域分析一、 实验目的、要求(1)掌握语音信号采集的方法(2)掌握一种语音信号基音周期提取方法(3)掌握语音信号短时能量和短时过零率计算方法(4)了解Matlab 的编程方法二、 实验原理语音是一时变的、非平稳的随机过程,但由于一段时间内(10-30ms)人的声带和声道形状的相对稳定性,可认为其特征是不变的,因而语音的短时谱具有相对稳定性。
在语音分析中可以利用短时谱的这种平稳性,将语音信号分帧。
10~30ms 相对平稳,分析帧长一般为20ms 。
语音信号的分帧是通过可移动的有限长度窗口进行加权的方法来实现的。
几种典型的窗函数有:矩形窗、汉明窗、哈宁窗、布莱克曼窗。
语音信号的能量分析是基于语音信号能量随时间有相当大的变化,特别是清音段的能量一般比浊音段的小得多。
定义短时平均能量[][]∑∑+-=∞-∞=-=-=nN n m m n m n w m x m n w m x E 122)()()()( 下图说明了短时能量序列的计算方法,其中窗口采用的是直角窗。
过零就是信号通过零值。
对于连续语音信号,可以考察其时域波形通过时间轴的情况。
而对于离散时间信号,如果相邻的取样值改变符号则称为过零。
由此可以计算过零数,过零数就是样本改变符号的次数。
单位时间内的过零数称为平均过零数。
语音信号x (n )的短时平均过零数定义为()[]()[]()()[]()[]()n w n x n x m n w m x m x Z m n *--=---=∑∞-∞=1sgn sgn 1sgn sgn 式中,[]•sgn 是符号函数,即()[]()()()()⎩⎨⎧<-≥=0101sgn n x n x n x短时平均过零数可应用于语音信号分析中。
发浊音时,尽管声道有若干个共振峰,但由于声门波引起了谱的高频跌落,所以其语音能量约集中干3kHz 以下。
而发清音时.多数能量出现在较高频率上。
既然高频率意味着高的平均过零数,低频率意味着低的平均过零数,那么可以认为浊音时具有较低的平均过零数,而清音时具有较高的平均过零数。
语音信号处理实验报告4

语音信号处理实验四:均匀量化编码与解码一、实验目的:了解均匀量化编码与解码的基本原理,及整个量化过程和量化噪声与编码的关系;学会利用matlab软件编程利用原理对一语音信号进行编码和解码,并仿真。
二、实验原理:均匀量化PCM在输入信号幅度变化范围是已知的和幅度值在已知的范围内是均匀分布的这两个条件下效果是很好的。
均匀量化是把整个幅度分成等间隔的2^n段,把每个段内的值都量化成一个数值,把量化后的数值根据极性,断码和量化电平对量化后的信号进行编码。
最后解码是编码的逆过程。
三、实验程序:clc;clear all;[d,r]=wavread('so.wav');figure(1);subplot(3,1,1);plot(d);title('原始信号');m1=max(d);m2=min(d);t=linspace(m1,m2,256);l=length(d);S=zeros(length(d),2);T=zeros(length(d),8);for i=1:lfor k=1:length(t)-1;if(d(i)<=t(k) & d(i)>=t(k+1)) S(i,1)=t(k+1);S(i,2)=k;endendendsubplot(3,1,2);stem(S(:,1));title('量化后信号');for i=1:ltemp=S(i,2);T(i,:)=tentotwo(temp);endNew=zeros(1,length(T));mm=linspace(m1,m2,256);for i=1:length(T)temp(i)=twototen(T(i,:));new(i)=mm(temp(i));end subplot(3,1,3);plot(new);title('解码后信号');function y=tentotwo(x)y=zeros(1,8);for i=1:8if(mod(x,2)==0)y(8-i+1)=0;elsey(8-i+1)=1;endx=floor(x/2);endfunction y=twototen(x)l=length(x);y=0;for i=1:lif(x(i)==1)y=y+2^(8-i);endend上图为仿真结果四、实验总结:通过本次实验我收获很大。
语音信号信号处理实验报告

语音信号信号处理实验报告实验一语音信号的端点检测一、实验目的1、掌握短时能量的求解方法2、掌握短时平均过零率的求解方法3、掌握利用短时平均过零率和短时能量等特征,对输入的语音信号进行端点检测。
二、仪器设备 HP计算机、Matlab软件三、实验原理 3.1、短时能量3.1.1、原理:语音信号能量随时间有相当大的变化,特别是清音段的能量一般比浊音段的小得多。
语音信号的短时能量定义:xw(n)?w(n)?x(n)0?m?N?10?n?N?1?1w(n)?? 其它?0n?N?1 2En??xw(m) m?n3.1.2、短时能量序列反映了语音振幅或能量随着时间缓慢变化的规律。
从原始语音信号图中可以看到语音信号幅度随时间有相当大的变化,特别是清音段的幅度一般比浊音段的幅度小很多,语音信号的短时能量给出了反映这些幅度变化的一个合适的描述方法。
3.1.3、短时平均幅度函数和能量函数的作用 (1)区分清/浊音。
En、Mn大,对应浊音; En、Mn小,对应清音。
其中Mn是短时幅度差。
(2)在信噪比高的情况下,能进行有声/无声判决。
无声时,背景噪声的En、Mn小;有声时,En、Mn显著增大。
判决时可设置一个门限。
(3)大致能定出浊音变为清音的时刻,或反之。
3.2、短时过零率:3.2.1、定义:过零就是信号通过零值。
连续语音信号,考察其时域波形通过时间轴的情况;离散时间信号,相邻的值改变符号则称为过零。
n?N?11 Z?sgn[xw(m)]?sgn[xw(m?1)] n2m?n x(n)?0?1sgn[x(n)]????1x(n)?0窄带信号,平均过零数作为信号频率的一种简单度量是很精确的,语音信号序列是宽带信号,则不能简单用上面的公式,但是可以用短时平均过零数来得到频谱的粗略估计。
3.2.2、短时过零分析的意义:(1)、可以区分清音与浊音:浊音时具有较低的平均过零数,而清音时具有较高的平均过零数。
(2)、利用它可以从背景噪声中找出语音信号,可用于判断寂静无语音和有语音的起点和终点位置。
《语音信号处理》实验5-DTW算法实现及语音模板匹配

华南理工大学《语音信号处理》实验报告实验名称:DTW算法实现及语音模板匹配姓名:学号:班级:10级电信5班日期:2013年6 月17日一、实验目的运用课堂上所学知识以及matlab工具,利用DTW(Dynamic Time Warping,动态时间规整)算法,进行说话者的语音识别。
二、实验原理1、语音识别系统概述一个完整特定人语音识别系统的方案框图如图1所示。
输入的模拟语音信号首先要进行预处理,包括预滤波、采样和量化、加窗、端点检测、预加重等,然后是参数特征量的提取。
提取的特征参数满足如下要求:(1)特征参数能有效地代表语音特征,具有很好的区分性;(2)参数间有良好的独立性;(3)特征参数要计算方便,要考虑到语音识别的实时实现。
图1 语音识别系统方案框图语音识别的过程可以被看作模式匹配的过程,模式匹配是指根据一定的准则,使未知模式与模型库中的某一个模型获得最佳匹配的过程。
模式匹配中需要用到的参考模板通过模板训练获得。
在训练阶段,将特征参数进行一定的处理后,为每个词条建立一个模型,保存为模板库。
在识别阶段,语音信号经过相同的通道得到语音特征参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。
2、语音信号的处理1、语音识别的DTW算法本设计中,采用DTW算法,该算法基于动态规划(DP)的思想解决了发音长短不一的模板匹配问题,在训练和建立模板以及识别阶段,都先采用端点检测算法确定语音的起点和终点。
在本设计当中,我们建立的参考模板,m为训练语音帧的时序标号,M为该模板所包含的语音帧总数,R(m)为第m帧的语音特征矢量。
所要识别的输入词条语音称为测试模板,n为测试语音帧的时序标号,N为该模板所包含的语音帧总数,T(n)为第n帧的语音特征矢量。
参考模板和测试模板一般都采用相同类型的特征矢量(如LPCC系数)、相同的帧长、相同的窗函数和相同的帧移。
考虑到语音中各段在不同的情况下持续时间会产生或长或短的变化,因而更多地是采用动态规划DP的方法。
语音信号处理实验报告 语音修正短时自相关

语音信号处理课程实验报告专业班级通信学号姓名指导教师实验名称 语音修正的短时自相关的实现 同组人 专业班级通信 学号 姓名 成绩 一、实验目的 熟悉语音修正自相关的意义。
充分理解取取不同窗长时的语音的修正自相关的变化情况。
熟悉Matlab 编程语言在语音信号处理中的作用。
能够实现对程序的重新编制。
二、实验原理 对于语音来说,采用短时分析方法,语音短时自相关函数为 ()()()[]()()[]∑--=+'++'+=k N m n m k w k m n x m w m n x k R 10 但是,在计算短时自相关时,窗选语音段为有限长度N ,而求和上限为N-1-k ,因此当k 增加时可用于计算的数据就越来越少了,从而导致k 增加时自相关函数的幅度减小。
为了解决这个问题,提出了语音修正的短时自相关。
修正的短时自相关函数,其定义如下: ()()()()() 2-m 1k m n w k m x m n w m x k R n --+-=∑+∞∞= 若令m n m '+=,代入上式得到 ()())(-)()(-ˆ21-k m w k m n x m w m n x k R m n '+'+''+=∑+∞-∞=' ()()()()1122ˆ ˆw m w m w m w m =-⎧⎪⎨=-⎪⎩定义……………………………………装………………………………………订…………………………………………线………………………………………()()() ˆˆ)()(ˆ 2-m 1k m w k m n x m w m n x k Rn ++++=∑+∞∞=则有()()121, 0n N-1ˆ0, 1, 0n N-1ˆ 0, w m K w m ≤≤⎧=⎨⎩≤≤+⎧=⎨⎩其它其它式中,K 为k 的最大值,即0≤k ≤K 。
由式(2-5)可知,要使)(ˆ2k m w +为非零值,必须使K N k m +1-≤+,考虑到K k ≤,可得1-≤N m ,故式(2-4)可以写成:∑1-0 )()()(ˆN m n k m n x m n x k R =+++= 三、实验要求1.实验前自己用Cool Edit 音频编辑软件录制声音,并把它保存为.txt 文件.2.编程实现不同矩形窗长N =320,160,70的短时修正自相关。
语音信号处理实验一

语⾳信号处理实验⼀实验⼀语⾳信号的采集及预处理⼀、实验⽬的在理论学习的基础上,进⼀步地理解和掌握语⾳信号预处理及短时加窗的意义及基于matlab的实现⽅法。
⼆、撰写实验报告要求要求随本次上机撰写完成实验报告,报告中要有实验⽬的、实验步骤、实验程序、实验中得出的图形结果及结论等。
另外,总结本次上机实验的收获。
三、实验内容及步骤1.语⾳信号的录⾳、读⼊、放⾳等:练习matlab中⼏个⾳频处理函数,利⽤函数wavread对语⾳信号进⾏采样,记住采样频率和采样点数,给出以下语⾳的波形图(2.wav),wavread的⽤法参见mablab帮助⽂件。
利⽤wavplay或soundview放⾳。
也可以利⽤wavrecord⾃⼰录制⼀段语⾳,并进⾏以上操作(需要话筒)。
[Y,FS,NBITS,OPTS]=wavread('9.wav')FS =10000NBITS =16OPTS =fmt: [1x1 struct]2.语⾳信号的分帧:选择20ms左右为⼀帧,帧移取1/2帧长,对语⾳信号进⾏分帧,可以利⽤voicebox⼯具箱中的函数enframe。
voicebox⼯具箱是基于GNU协议的⾃由软件,其中包含了很多语⾳信号相关的函数。
voicebox⼯具箱安装⽅法:把⼯具箱拷贝⼊.\MatLab\toolbox⽬录下;菜单file-set path-"Add folder" 导⼊voicebox;菜单file-Preference-General-"Updata Toolbox Path Cache分帧函数的调⽤:y=enframe(x,len,inc)x为输⼊语⾳信号,len指定了帧长,inc指定帧移,函数返回为n×len的⼀个矩阵,每⼀⾏都是⼀帧数据。
帧长=10000X0.02=200sx=wavread('9.wav')y=enframe(x,200,100)subplot(2,1,1),plot(x)subplot(2,1,2),plot(y)3 窗函数及其时频特性:本步要求利⽤window函数设计窗⼝长度为200(N=200)的矩形窗(rectwin)、汉明窗(hamming)及汉宁窗(hann)),利⽤wvtool函数观察其时域波形图及频谱特性,⽐较得出结论。
语音信号处理试验报告

---------------------考试---------------------------学资学习网---------------------押题------------------------------语音信号处理实验班级:学号:姓名:实验一基于MATLAB的语音信号时域特征分析(2学时)短时能量)1.(1)加矩形窗a=wavread('mike.wav');a=a(:,1);subplot(6,1,1),plot(a);N=32;for i=2:6h=linspace(1,1,2.^(i-2)*N);%形成一个矩形窗,长度为2.^(i-2)*NEn=conv(h,a.*a);% 求短时能量函数Ensubplot(6,1,i),plot(En);if(i==2) ,legend('N=32');elseif(i==3), legend('N=64');elseif(i==4) ,legend('N=128');elseif(i==5) ,legend('N=256');elseif(i==6) ,legend('N=512');endend10-100.511.522.534x 104 20 N=3232.51.5200.514x 10 50 N=6431.50.51022.54x 10 1050 N=12831.5202.50.514x 10 20100 N=256322.50.511.504x 10 40200 N=5123100.51.522.54x 10(2)加汉明窗a=wavread('mike.wav');a=a(:,1);subplot(6,1,1),plot(a);N=32;for i=2:6h=hanning(2.^(i-2)*N);%形成一个汉明窗,长度为2.^(i-2)*NEn求短时能量函数En=conv(h,a.*a);%subplot(6,1,i),plot(En);if(i==2), legend('N=32');elseif(i==3), legend('N=64');elseif(i==4) ,legend('N=128');elseif(i==5) ,legend('N=256');elseif(i==6) ,legend('N=512');endend10-100.511.522.534x 102 10 N=3232.51.5020.514x 10 420 N=64311.522.50.504x 10 420 N=12831.5202.50.514x 10 1050 N=25631.522.500.514x 10 20100 N=512322.50.5011.54x 102)短时平均过零率a=wavread('mike.wav');a=a(:,1);n=length(a);N=320;subplot(3,1,1),plot(a);h=linspace(1,1,N);En=conv(h,a.*a); %求卷积得其短时能量函数Ensubplot(3,1,2),plot(En);for i=1:n-1if a(i)>=0b(i)= 1;elseb(i) = -1;endif a(i+1)>=0b(i+1)=1;elseb(i+1)= -1;endw(i)=abs(b(i+1)-b(i)); %求出每相邻两点符号的差值的绝对值endk=1;j=0;while (k+N-1)<nZm(k)=0;for i=0:N-1;Zm(k)=Zm(k)+w(k+i);endj=j+1;k=k+N/2; %每次移动半个窗endfor w=1:jQ(w)=Zm(160*(w-1)+1)/(2*N); %短时平均过零率endsubplot(3,1,3),plot(Q),grid;10-100.511.522.534x 102010000.511.522.534x 100.500204060801001201401601803)自相关函数N=240y=wavread('mike.wav');y=y(:,1);x=y(13271:13510);x=x.*rectwin(240);R=zeros(1,240);for k=1:240for n=1:240-kR(k)=R(k)+x(n)*x(n+k);endendj=1:240;plot(j,R);grid;2.521.510.50-0.5-1-1.5050100150200250分析语音信号频域特征MATLAB基于实验二1)短时谱cleara=wavread('mike.wav');a=a(:,1);subplot(2,1,1),plot(a);title('original signal');gridN=256;h=hamming(N);for m=1:Nb(m)=a(m)*h(m)endy=20*log(abs(fft(b)))subplot(2,1,2)plot(y);title('短时谱');gridoriginal signal10.50-0.5-100.511.522.534x 10谱时短10.5000.20.40.60.811.21.41.61.822)语谱图[x,fs,nbits]=wavread('mike.wav')x=x(:,1);specgram(x,512,fs,100);xlabel('时间(s)');ylabel('频率(Hz)'););'语谱图'title(语谱图50004000)3000zH(率频2000100000.511.52(s)时间3)倒谱和复倒谱(1)加矩形窗时的倒谱和复倒谱cleara=wavread('mike.wav',[4000,4350]);a=a(:,1);N=300;h=linspace(1,1,N);for m=1:Nb(m)=a(m)*h(m);endc=cceps(b);c=fftshift(c);d=rceps(b);d=fftshift(d);subplot(2,1,1)plot(d);title('加矩形窗时的倒谱')subplot(2,1,2)) '加矩形窗时的复倒谱'plot(c);title(加矩形窗时的倒谱10-1-2050100150200250300加矩形窗时的复倒谱1050-5-10050100150200250300(2)加汉明窗时的倒谱和复倒谱cleara=wavread('mike.wav',[4000,4350]);a=a(;,1);N=300;h=hamming(N);for m=1:Nb(m)=a(m)*h(m);endc=cceps(b);c=fftshift(c);d=rceps(b);d=fftshift(d);subplot(2,1,1)plot(d);title('加汉明窗时的倒谱')subplot(2,1,2)) '加汉明窗时的复倒谱'plot(c);title(加汉明窗时的倒谱10-1-2-3050100150200250300加汉明窗时的复倒谱1050-5-10050100150200250300实验三基于MATLAB的LPC分析MusicSource = wavread('mike.wav');MusicSource=MusicSource(:,1);Music_source = MusicSource';N = 256; % window length,N = 100 -- 1000;Hamm = hamming(N); % create Hamming windowframe = input('请键入想要处理的帧位置= ');% origin is current frameorigin = Music_source(((frame - 1) * (N / 2) + 1):((frame - 1) * (N / 2) + N));Frame = origin .* Hamm';%%Short Time Fourier Transform%[s1,f1,t1] = specgram(MusicSource,N,N/2,N);[Xs1,Ys1] = size(s1);for i = 1:Xs1FTframe1(i) = s1(i,frame);endN1 = input('请键入预测器阶数= '); % N1 is predictor's order[coef,gain] = lpc(Frame,N1); % LPC analysis using Levinson-Durbin recursionest_Frame = filter([0 -coef(2:end)],1,Frame); % estimate frame(LP)FFT_est = fft(est_Frame);err = Frame - est_Frame; % error% FFT_err = fft(err);subplot(2,1,1),plot(1:N,Frame,1:N,est_Frame,'-r');grid;title('原始语音帧vs.预测后语音帧') subplot(2,1,2),plot(err);grid;title('误差');pause%subplot(2,1,2),plot(f',20*log(abs(FTframe2)));grid;title('短时谱')%% Gain solution using G^2 = Rn(0) - sum(ai*Rn(i)),i = 1,2,...,P%fLength(1 : 2 * N) = [origin,zeros(1,N)];Xm = fft(fLength,2 * N);X = Xm .* conj(Xm);Y = fft(X , 2 * N);Rk = Y(1 : N);PART = sum(coef(2 : N1 + 1) .* Rk(1 : N1));G = sqrt(sum(Frame.^2) - PART);A = (FTframe1 - FFT_est(1 : length(f1'))) ./ FTframe1 ; % inverse filter A(Z)subplot(2,1,1),plot(f1',20*log(abs(FTframe1)),f1',(20*log(abs(1 ./ A))),'-r');grid;title('短时谱'); subplot(2,1,2),plot(f1',(20*log(abs(G ./ A))));grid;title('LPC谱');pause%plot(abs(ifft(FTframe1 ./ (G ./ A))));grid;title('excited')%plot(f1',20*log(abs(FFT_est(1 : length(f1')) .* A / G )));grid;%pause%% find_pitch%temp = FTframe1 - FFT_est(1 : length(f1'));% not move higher frequncepitch1 = log(abs(temp));pLength = length(pitch1);result1 = ifft(pitch1,N);% move higher frequncepitch1((pLength - 32) : pLength) = 0;result2 = ifft(pitch1,N);% direct do real cepstrum with errpitch = fftshift(rceps(err));origin_pitch = fftshift(rceps(Frame));subplot(211),plot(origin_pitch);grid;title('原始语音帧倒谱(直接调用函数)');subplot(212),plot(pitch);grid;title('预测误差倒谱(直接调用函数)');pausesubplot(211),plot(1:length(result1),fftshift(real(result1)));grid;title('预测误差倒谱(根据定义编写,没有去除高频分量)');subplot(212),plot(1:length(result2),fftshift(real(result2)));grid;title('预测误差倒谱(根据定义编);)'写,去除高频分量原始语音帧vs.预测后语音帧0.40.20-0.2-0.4050100150200250300差误0.20.10-0.1-0.2300250100050150200短时谱500-50-100010203040506070谱LPC100806040010203040506070原始语音帧倒谱(直接调用函数)0.50-0.5-1050100150200250300预测误差倒谱(直接调用函数)0.50-0.5-1050100150200250300预测误差倒谱(根据定义编写,没有去除高频分量)0.20-0.2-0.4-0.6050100150200250300预测误差倒谱(根据定义编写,去除高频分量)0.10-0.1-0.2-0.3050100150200250300预测误差倒谱(根据定义编写,没有去除高频分量)0.20-0.2-0.4-0.6050100150200250300预测误差倒谱(根据定义编写,去除高频分量)0.10-0.1-0.2-0.3050100150200250300预测误差倒谱(根据定义编写,没有去除高频分量)0.20-0.2-0.4-0.6050100150200250300预测误差倒谱(根据定义编写,去除高频分量)0.10-0.1-0.2-0.3050100150200250300实验四基于VQ的特定人孤立词语音识别研究1、mfcc.mccc = mfcc(x)function);'m'bank=melbankm(24,256,8000,0,0.5,bank=full(bank); bank=bank/max(bank(:));k=1:12for n=0:23; dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));endw = 1 + 6 * sin(pi * [1:12] ./ 12);w = w/max(w);xx=double(x);xx=filter([1 -0.9375],1,xx);xx=enframe(xx,256,80); i=1:size(xx,1)for y = xx(i,:); s = y' .*hamming(256); t = abs(fft(s)); t = t.^2; c1=dctcoef * log(bank * t(1:129));c2 = c1.*w'; m(i,:)=c2';enddtm = zeros(size(m)); i=3:size(m,1)-2for dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:);end dtm = dtm / 3;ccc = [m dtm];ccc = ccc(3:size(m,1)-2,:);2、vad.m[x1,x2] = vad(x)function x = double(x);x = x / max(abs(x));FrameLen = 240;FrameInc = 80;amp1 = 10;amp2 = 2;zcr1 = 10;zcr2 = 5;% 6*10ms = 30ms maxsilence = 8;% 15*10ms = 150ms minlen = 15;status = 0;count = 0;silence = 0;tmp1 = enframe(x(1:end-1), FrameLen, FrameInc);tmp2 = enframe(x(2:end) , FrameLen, FrameInc);signs = (tmp1.*tmp2)<0;diffs = (tmp1 -tmp2)>0.02;zcr = sum(signs.*diffs, 2);amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)),2);amp1 = min(amp1, max(amp)/4);amp2 = min(amp2, max(amp)/8);x1 = 0;x2 = 0; n=1:length(zcr)for goto = 0; status switch{0,1} caseif amp(n) > amp1x1 = max(n-count-1,1); status = 2; silence = 0; count = count + 1;... amp(n) > amp2 | elseif zcr(n) > zcr2status = 1; count = count + 1;else status = 0; count = 0;end2, caseamp(n) > amp2 | ...if zcr(n) > zcr2 count = count + 1; elsesilence = silence+1; if silence < maxsilencecount = count + 1; count < minlen elseifstatus = 0; silence = 0; count = 0;elsestatus = 3;endend3, case; break endcount = count-silence/2;x2 = x1 + count -1;3、codebook.m%clear; xchushi= codebook(m)function[a,b]=size(m);[m1,m2]=szhixin(m); [m3,m4]=szhixin(m2);[m1,m2]=szhixin(m1);[m7,m8]=szhixin(m4);[m5,m6]=szhixin(m3);[m3,m4]=szhixin(m2);[m1,m2]=szhixin(m1);[m15,m16]=szhixin(m8);[m13,m14]=szhixin(m7);[m11,m12]=szhixin(m6);[m9,m10]=szhixin(m5);[m7,m8]=szhixin(m4);[m5,m6]=szhixin(m3);[m3,m4]=szhixin(m2);[m1,m2]=szhixin(m1);chushi(1,:)=zhixinf(m1);chushi(2,:)=zhixinf(m2);chushi(3,:)=zhixinf(m3);chushi(4,:)=zhixinf(m4); chushi(5,:)=zhixinf(m5);chushi(6,:)=zhixinf(m6);chushi(7,:)=zhixinf(m7); chushi(8,:)=zhixinf(m8);chushi(9,:)=zhixinf(m9);chushi(10,:)=zhixinf(m10); chushi(11,:)=zhixinf(m11);chushi(12,:)=zhixinf(m12);chushi(13,:)=zhixinf(m13);chushi(14,:)=zhixinf(m14);chushi(15,:)=zhixinf(m15);chushi(16,:)=zhixinf(m16);sumd=zeros(1,1000);k=1;dela=1;xchushi=chushi;(k<=1000)while sum=ones(1,16); p=1:a fori=1:16 for d(i)=odistan(m(p,:),chushi(i,:));enddmin=min(d); sumd(k)=sumd(k)+dmin;i=1:16ford(i)==dmin if xchushi(i,:)=xchushi(i,:)+m(p,:); sum(i)=sum(i)+1;end endendi=1:16forxchushi(i,:)=xchushi(i,:)/sum(i);endk>1if dela=abs(sumd(k)-sumd(k-1))/sumd(k);end k=k+1; chushi=xchushi; end return4、testvq.mclear;)这是一个简易语音识别系统,请保证已经将您的语音保存在相应文件夹中'disp(')正在训练您的语音模版指令,请稍后...'disp(' i=1:10for,i-1);\\ú.wav'海儿的声音 fname =sprintf('D:\\matlab\\work\\dtw1\\ x = wavread(fname); [x1 x2] = vad(x); m = mfcc(x); m = m(x1:x2-5,:);ref(i).code=codebook(m);end)?''语音指令训练成功,恭喜!disp()...''正在测试您的测试语音指令,请稍后disp( i=1:10for,i-1);海儿的声音\\?.wav'fname = sprintf('D:\\matlab\\work\\dtw1\\ x = wavread(fname);[x1 x2] = vad(x); mn = mfcc(x); mn = mn(x1:x2-5,:);%mn = mn(x1:x2,:) test(i).mfcc = mn;end sumsumdmax=0;sumsumdmin=0;)''对训练过的语音进行测试disp( w=1:10for sumd=zeros(1,10); [a,b]=size(test(w).mfcc);i=1:10forp=1:a for j=1:16 ford(j)=odistan(test(w).mfcc(p,:),ref(i).code(j,:));dmin=min(d);%×üê§?? sumd(i)=sumd(i)+dmin;end end sumdmin=min(sumd)/a;sumdmin1=min(sumd);sumdmax(w)=max(sumd)/a; sumsumdmin=sumdmin+sumsumdmax;sumsumdmax=sumdmax(w)+sumsumdmax;)正在匹配您的语音指令,请稍后...'disp(' i=1:10for (sumd(i)==sumdmin1) if (i) switch 1 case);前'', '您输入的语音指令为:%s; 识别结果为%s\n','前fprintf(' 2 case);', ''后:%s; 识别结果为%s\n','后 fprintf('您输入的语音指令为 3case);', '左识别结果为%s\n','左' fprintf('您输入的语音指令为:%s;4case);''右,'右', 您输入的语音指令为 fprintf('a:%s; 识别结果为%s\n' 5case);''东'东', fprintf('您输入的语音指令为:%s; 识别结果为%s\n', 6case);南'南', ' fprintf('您输入的语音指令为:%s; 识别结果为%s\n',' 7 case);', '西,:%s; 识别结果为%s\n''西' fprintf('您输入的语音指令为 8case);''北,'北', 您输入的语音指令为 fprintf(':%s; 识别结果为%s\n' 9case);上'', ', fprintf('您输入的语音指令为a:%s; 识别结果为%s\n''上 10case);下', '下'',您输入的语音指令为 fprintf('a:%s; 识别结果为%s\n'otherwise); 'error' fprintf(endendend end delamin=sumsumdmin/10;delamax=sumsumdmax/10;)''对没有训练过的语音进行测试disp()正在测试你的语音,请稍后...'disp(' i=1:10for,i-1);fname =sprintf('D:\\matlab\\work\\dtw1\\o£?ùμ?éùò?\\?.wav' x = wavread(fname);[x1 x2] = vad(x); mn = mfcc(x); mn = mn(x1:x2-5,:);%mn = mn(x1:x2,:)test(i).mfcc = mn;endw=1:10for sumd=zeros(1,10); [a,b]=size(test(w).mfcc); i=1:10forp=1:a for j=1:16ford(j)=odistan(test(w).mfcc(p,:),ref(i).code(j,:));enddmin=min(d);%×üê§?? sumd(i)=sumd(i)+dmin;end end sumdmin=min(sumd);z=0; i=1:10for (((sumd(i))/a)>delamax)|| if z=z+1;endend)...'disp('正在匹配您的语音指令,请稍后z<=3if i=1:10for (sumd(i)==sumdmin) if (i)switch1case);'前', '前',%s\n'识别结果为:%s; 您输入的语音指令为' fprintf(2 case);'后', ':%s; 识别结果为%s\n','后 fprintf('您输入的语音指令为3case);', '左识别结果为%s\n','左' fprintf('您输入的语音指令为:%s;4case);''右,'右', 识别结果为 fprintf('您输入的语音指令为a:%s; %s\n' 5case);''东'东', fprintf('您输入的语音指令为:%s; 识别结果为%s\n', 6 case);南'南', ' fprintf('您输入的语音指令为:%s; 识别结果为%s\n',' 7 case);', '西西:%s; 识别结果为%s\n','' fprintf('您输入的语音指令为 8case );''北,'北', 识别结果为 fprintf('您输入的语音指令为:%s; %s\n' 9case);上'', '上 fprintf('您输入的语音指令为a:%s; 识别结果为%s\n',' 10case);下'','下', 识别结果为 fprintf('您输入的语音指令为a:%s; %s\n'otherwise ); fprintf('error'endendend else)您输入的语音无效?£?\n'' fprintf(end end。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中南大学 信息科学与工程学院
语音信号处理 实验报告
指导老师 : 覃爱娜 学生班级 : 信息0704 学生名称 : 阮光武 学生学好 : 0903070430 提交日期 : 2010年6月18日 《语音信号处理》实验报告 信息科学与工程学院
2 实验一
语音波形文件的分析和读取
一、实验的任务、性质与目的 本实验是选修《语音信号处理》课的电子信息类专业学生的基础实验。通过实验: (1)掌握语音信号的基本特性理论:随机性,时变特性,短时平稳性,相关性等; (2)掌握语音信号的录入方式和*.WAV音波文件的存储结构; (3)使学生初步掌握语音信号处理的一般实验方法。
二、实验原理和步骤: WAV文件格式简介 WAV文件是多媒体中使用了声波文件的格式之一,它是以RIFF格式为标准。每个WAV文件的头四个字节就是“RIFF”。WAV文件由文件头和数据体两大部分组成,其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。常见的WAV声音文件有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指声音信号在“模拟→数字”转换过程中,单位时间内采样的次数;采样值是指每一次采样周期内声音模拟信号的积分值。对于单声道声音文件,采样数据为8位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。WAV文件数据块包含以脉冲编码调制(PCM)格式表示的样本。在单声道WAV文件中,道0代表左声道,声道1代表右声道;在多声道WAV文件中,样本是交替出现的。WAV文件的格式见表1。 《语音信号处理》实验报告 信息科学与工程学院
3 偏移地址 字节数 数据类型 内 容 文件头 00H 4 char "RIFF"标志 04H 4 long int 文件长度 08H 4 char "WAVE"标志 0CH 4 char "fmt"标志 10H 4 过渡字节(不定) 14H 2 int 格式类别(10H为PCM形式的声音数据) 16H 2 int 通道数,单声道为1,双声道为2 18H 2 int 采样率(每秒样本数),表示每个通道的播放速度
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其
值用于缓冲区的调整。 22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
24H 4 char 数据标记符"data" 28H 4 long int 语音数据的长度 表1 wav文件格式说明表
(1)选取WINDOWS下MEDIA中的任一WAV文件,采用播放器进行播放,观察其播放波形,定性描述其特征; (2)根据WAV文件的存储格式,利用MATLAB或C语言,分析并读取文件头和数据信息; (3)将文件的通道数、采样频率、样本位数和第一个数据读取并显示出来。
三、实验设备 PC机。 《语音信号处理》实验报告 信息科学与工程学院 4 四,实验结果 (1)实验对象:选择windows系统自带的ringout.wav为实验对象。
图1-1 整体波形 图1-2 部分波形 《语音信号处理》实验报告 信息科学与工程学院
5 (2)文件信息: 文件头为: RIFF 通道数= 1 为双声道 采样平率= 11025 样本位数= 1 第一个数据为: 0
五、实验代码 [y,fs,n]=wavread('ringout.wav'); %观察波形 figure(1) plot(y) [y,fs,n]=wavread('ringout.wav',[1 500]); %显示波形中的前面一段,便于观察 figure(2) plot(y) f=fopen('ringout.wav','r'); disp('文件头为:') a0=fscanf(f,'%4s',[1,1]); %显示RIFF标志 disp(a0) f=fopen('ringout.wav','r'); [a1,count1]=fread(f,[2,11]); %跳过读RIFF标志,文件长度,wave fmt标志, 过渡字节及读格式类别共4*5+2=22个字节 [a2,count2]=fread(f,[1,1]); %读取通道数的两个字节 disp('通道数=') disp(a2) if a4==1 disp('为单声道') else disp('为双声道') end a=fread(f,[1,1]); [a31,count31]=fread(f,[1,1]); %读取采样率 [a32,count32]=fread(f,[1,1]); disp('采样平率=') disp(a32*2^8+a31) [a4,count4]=fread(f,[4,1]); %传输数据速率 [a5,count5]=fread(f,[2,1]); %读取数据块的调整数 [a61,count61]=fread(f,[1,1]); %读取每样本的数据位数 [a62,count62]=fread(f,[1,1]); disp('样本位数=') disp(a62*2^8+a61) [a7,count7]=fread(f,[4,2]); %跳过读data及语音信号长度 [a8,count8]=fread(f,[1,1]); %读取第一个数据 disp('第一个数据为:') %显示第一个数据 disp(a8) 《语音信号处理》实验报告 信息科学与工程学院 6 实验二 语音信号的时域参量分析
一、实验的任务、性质与目的: (1)增强学生对语音时域分析理论的理解,尤其是语音的短时能量、幅度和过零率的的分析和应用; (2)进一步提高学生分析问题和解决问题的能力从而培养学生初步掌握进行科学研究的方法和总结实验结果的能力。
二、实验原理和步骤: (1)利用MATLAB或C语言,针对ringout.wav文件,求取语音信号的短时能量函数、短时平均幅度函数和短时平均过零率三大时域参量; 三大时域参量的定义式是: 短时能量函数和短时平均幅度函数
10102)()(...,2,1,00101)(10)()()(NmnNmnnn
nmxMmxETTTnNmmwNNmmnxmwmx为帧移长度其他
为帧长
短时平均过零率 0)(1))(sgn(0)(1))(sgn(sgn[.])]1(sgn[)(sgn[2110nxnxnxnx
mxmxZNmnnn
为符号函数
(2)将三大时域参量的结果用波形图的方式显示出来; (3)分析并标识波形图上的清浊音信息。
三、实验设备 PC机。 《语音信号处理》实验报告 信息科学与工程学院 7 四、实验结果 (1)采用MATLAB语言对三大时域参量求取: 短时能量函数 a=wavread('C:\ringout.wav'); subplot(6,1,1),plot(a); N=32; for i=2:6 h=linspace(1,1, (i-1)*N); %形成一个矩形窗,长度为N En=conv(h,a.*a); %求卷积得其短时能量函数En subplot(6,1,i),plot(En); if(i==2) legend('N=32'); elseif(i==3) legend('N=64'); elseif(i==4) legend('N=128'); elseif(i==5 legend('N=256'); elseif(i==6) legend('N=512'); end end
短时平均幅度函数 a=wavread('C:\ringout.wav'); subplot(6,1,1),plot(a); N=32; for i=2:6 h=linspace(1,1,(i-1)*N); %形成一个矩形窗,长度为N En=conv(h,abs(a)); %求卷积得其短时平均幅度函数En subplot(6,1,i),plot(En); if(i==2) legend('N=32'); elseif(i==3) legend('N=64'); elseif(i==4) legend('N=128'); elseif(i==5) legend('N=256'); elseif(i==6) legend('N=512'); end end