语音信号处理试验报告
- 格式:doc
- 大小:83.48 KB
- 文档页数:14
语音信号处理实验四:均匀量化编码与解码一、实验目的:了解均匀量化编码与解码的基本原理,及整个量化过程和量化噪声与编码的关系;学会利用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上图为仿真结果四、实验总结:通过本次实验我收获很大。
语音信号处理及matlab仿真实验总结
语音信号处理是利用数字信号处理技术对语音信号进行分析、处
理和改进的过程。
语音信号是不规则的波形,其包含了很多信息,如
语音的音高、音调、音色、语速、语气等,因此语音信号处理是一项
非常重要的技术。
语音信号处理的一般流程包括语音信号采集、预处理、特征提取、模型建立和应用,其中预处理包括信号增强、降噪、去混响等,特征
提取包括时域特征、频域特征和时频域特征,模型建立包括声学模型
和语言模型等。
为了更加深入地掌握语音信号处理技术,我们进行了一些matlab
仿真实验。
我们首先学习了语音信号的采样和量化过程,并使用
matlab软件对语音信号进行了仿真采样和量化,了解了采样率和分辨
率等概念,还了解了量化噪声的影响。
其次,我们学习了语音信号的基本特征提取技术,并用matlab仿
真实现了时域特征、频域特征和时频域特征的提取,如时域的短时能
量和短时过零率、频域的傅里叶变换和倒谱系数、时频域的小波变换等。
最后,我们学习了基于模型的语音信号处理技术,如基于隐马尔
可夫模型、高斯混合模型、人工神经网络等模型的语音识别、语音合
成等应用,并用matlab进行了相关的仿真实验。
总之,语音信号处理是一项非常重要的技术,它可以在语音识别、语音合成、语音压缩、语音增强等领域得到广泛应用。
通过学习语音
信号处理及matlab仿真实验,我们了解到了它的基本理论和应用方法,并得到了一些实践经验,这对我们今后的学习和工作将具有很大的指
导意义。
语⾳信号处理实验报告2实验⼆语⾳信号的频域特性⼀、实验⽬的(1)结合汉语语⾳信号的各类⾳素和复元⾳的特点分析其频域性质;(2)熟悉语⾳信号的各类⾳素和复元⾳的频域参数;(3)熟悉声⾳编辑软件PRAAT的简单使⽤和操作。
⼆、实验记录与思考题1. 观察语⾳信号的频域特点,总结其规律。
浊⾳段:其谱线结构是与浊⾳信号中的周期信号密切相关。
具有与基⾳及其谐波对应的谱线。
频谱包络中有⼏个凸起点,与声道的谐振频率相对应。
这些凸起点为共振峰。
清⾳段:清⾳的频谱⽆明显的规律,⽐较平坦。
2.总结清⾳/b/p/m/f/d/t/n/l/g/k/h/j/q/x/z/c/s/zh/ch/sh/r/共21个的语谱图的规律,给出辅⾳的能量集中区;语谱图中的花纹有横杠、乱纹和竖直条。
横杠是与时间轴平⾏的⼏条深⿊⾊带纹,它们是共振峰。
从横杠对应的频率和宽度可以确定相应的共振峰频率和带宽。
在⼀个语⾳段的语谱图中,有没有横杠出现是判断它是否是浊⾳的重要标志。
竖直条是语谱图中出现于时间轴垂直的⼀条窄⿊条。
每个竖直条相当于⼀个基⾳,条纹的起点相当于声门脉冲的起点,条纹之间的距离表⽰基⾳周期,条纹越密表⽰基⾳频率越⾼。
b,p……清⾳的语谱图为乱纹。
辅⾳的能量集中区为:⾼频区3. 总结浊⾳/a/o/e/i/u/ü/ao/ai/ei/ou/ie /an/en/in/ang/eng/ong/ing/共18个的语谱图的规律,提取这18个浊⾳的基频、前三个共振峰频率浊⾳基频(HZ)前三个共振峰频率(HZ)a 110.9 861.716026 1247.744593 2657.8777620 113.7 485.008212 707.675424 2860.079878e 113.4 548.758457 1234.365167 2802.170956 i 115.9 273.839527 2324.592327 3053.533854u 113.4 436.884349 760.619175 2624.606878ü116.4 289.539739 2165.951838 2360.250037 ao 113.2 602.024143 2025.381763 2679.789088 ai 112.9 602.094143 2025.381763 2679.789788 ei 114.2 424.694277 2222.451877 2775.996230 ou 113.9 524.694277 2522.4518772795.996230 ie 114.2 524.694277 2229.451877 2795.996230 an 117.2 541.453061 1571.235652 2568.625044 en 116.8 364.990433 1548.146318 2701.860905 in 118.5 591.072570 1726.522792 2734.063107 ang 118.6 568.7057001133.583265 2748.451070 eng 116.1 345.473245 1350.656488 2853.466380 ong 122.1 529.689978 1319.092109 2649.159450 ing 118.8 799.116363 1997.401662 3092.0826464./r/、/m/、/n/、/l/ 从这⼏个⾳素的的基频、共振峰频率⾳素基频(HZ)前三个共振峰频率(HZ)r 119.6 373.688843 1907.445440 2385.006643m 119.2 540.252644 779.840595 2930.057234n 116.8 500.020625 1504.881337 2754.358608 l 114.1 1253.100063 2104.354594 3201.3585905.分析宽带语谱图和窄带语谱图的不同之处,请解释原因;语谱图中的花纹有横杠、乱纹和竖直条等。
语音信号信号处理实验报告实验一语音信号的端点检测一、实验目的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)、利用它可以从背景噪声中找出语音信号,可用于判断寂静无语音和有语音的起点和终点位置。
华南理工大学《语音信号处理》实验报告实验名称:LPC特征提取姓名:***学号:************班级:11级电信2班日期:2014年4 月30日1. 实验内容(1)熟悉短时分析原理、LPC 的原理;(2)学习运用MATLAB 编程进行LPC 的提取;(3)学会利用短时分析原理提取LPC 特征序列。
2. 实验方法LPC 分析基本原理LPC 分析为线性时不变因果稳定系统V (z )建立一个全极点模型,并利用均方误差准则,对已知的语音信号s(n)进行模型参数估计。
如果利用P 个取样值来进行预测,则称为P 阶线性预测。
假设用过去P 个取样值()()(){}1,2,S n S n S n p ---的加权之和来预测信号当前取样值()S n ,则预测信号()S n ∧为:()()1p k k S n a n k ∧==-∑ (1) 其中加权系数用k a 表示,称为预测系数,则预测误差为:()()()()()1p k k e n s n S n s n a n k ∧==-=--∑ (2)要使预测最佳,则要使短时平均预测误差最小有:()2min E e n ε⎡⎤==⎣⎦ (3) ()20,(1)k e n k p a ⎡⎤∂⎣⎦=≤≤∂ (4) 令()()(),,i k E s n i S n k φ=--⎡⎤⎣⎦ (5) 最小的ε可表示成:()()min 10,00,p k k a k εφφ==-∑ (6)显然,误差越接近于零,线性预测的准确度在均方误差最小的意义上为最佳,由此可以计算出预测系数。
通过LPC 分析,由若干帧语音可以得到若干组LPC 参数,每组参数形成一个描绘该帧语音特征的矢量,即LPC特征矢量。
由LPC特征矢量可以进一步得到很多种派生特征矢量,例如线性预测倒谱系数、线谱对特征、部分相关系数、对数面积比等等。
不同的特征矢量具有不同的特点,它们在语音编码和识别领域有着不同的应用价值。
3.实验结果LPC系数:ai =1.0000 -1.3227 0.1655 -0.2090 0.6790 -0.7203 0.5626 -0.1349 0.4458 -0.5782 0.1478通过计算LPC系数可以很好的利用线性预测中声道系统函数的最小相位特性来提取特征函数。
语音信号的频谱分析实验报告1 引言1.1 实验背景及意义随着信息技术的飞速发展,语音信号处理技术在通信、语音识别、音频编辑等领域发挥着越来越重要的作用。
频谱分析作为语音信号处理的核心技术之一,能够揭示语音信号的频率结构,对于理解语音的本质、提升语音处理技术的性能具有重要意义。
本实验旨在通过频谱分析,深入探究语音信号的内在特性,为相关领域的研究提供理论支持和技术参考。
1.2 实验目的本实验的主要目的是掌握语音信号的频谱分析方法,通过实际操作,理解频谱分析的基本原理及其在语音信号处理中的应用。
具体目标包括:1.学习并掌握语音信号的时域与频域表示方法;2.学习并掌握傅里叶变换(FFT)及短时傅里叶变换(STFT)的原理及其在语音信号频谱分析中的应用;3.分析语音信号的频谱特征,为后续的语音识别、降噪等处理提供依据。
1.3 实验方法与工具本实验采用以下方法与工具:1.实验方法:采用对比实验的方法,对原始语音信号及其频谱进行分析,探讨不同参数设置对频谱分析结果的影响。
2.实验工具:使用MATLAB软件进行实验,利用其强大的信号处理功能实现语音信号的采集、处理和频谱分析。
MATLAB具有以下优点:- 丰富的信号处理函数库,方便快速实现各种算法;- 图形化编程环境,便于观察实验结果; - 高度可扩展性,支持自定义函数和工具箱。
2. 语音信号基本概念2.1 语音信号的特性语音信号是人类交流的主要方式之一,它具有以下特性:•时变性:语音信号随着时间变化,其波形不断改变,即使在同一发音人的连续发音中,同一音素的波形也有所不同。
•非周期性:与简单的正弦波等周期性信号不同,语音信号在短时间内是非周期的,具有随机性质。
•频率特性:人的发声器官产生的语音信号主要频率范围在20Hz到4kHz之间,不同语言和方言的频率分布可能有所差异。
•幅度特性:语音信号的幅度变化较大,通常需要通过预处理进行归一化处理,以便于分析。
•短时平稳性:尽管语音信号整体上是非平稳的,但在短时间内(大约20-30ms),可以近似认为是平稳的,这是进行短时傅里叶变换(STFT)的理论基础。
实验目的:理解和掌握基于能量和过零率的语音端点检测的方法和原理实验原理:语音端点检测就是指从包含语音的一段信号中确定出语音地起始点和结束点。
基于能量和过零率的语音端点检测方法采用两级判决法。
第一级:先根据语音短时能量选取较高门限T1,进行一次粗判,得AB点;然后由背景噪声的平均能量确定一个较低门限T2,并从A点往左、B点往右分别找到短时能量包络与门限T2相交点C与D。
第二级:以短时平均过零率为标准,从C往左、D往右找到短时平均过零率低于门限T3(由背景噪声的平均过零率所确定)的两点E、F,即为语音段的起止点。
实验内容:主程序:clear all;S=wavread('song.wav');%¶ÁÈëÉùÒôÎļþfigure(1);subplot(4,1,1);plot(S);title('Ô-ʼÓïºÅÐźÅ');N=wavread('noise.wav');%¶ÁÈë±³¾°ÔëÉùplot(N);s=fra(100,45,S);%fen zhenLs=length(s);s2=s.^2;soundenergy=sum(s2,2)%ÇóÒ»Ö¡µÄÄÜÁ¿;subplot(4,1,2);plot(soundenergy);title('Ô-ʼÓïÒô¶ÌʱÄÜÁ¿');averagesoundenergy=sum(soundenergy)/Ls;soundzcr=zcro(s);%Çó¹ýÁãÂÊsubplot(4,1,3);plot(soundzcr);title('Ô-ʼÓïÒô¹ýÁãÂÊ');averagesoundzcr=sum(soundzcr)/Ls;n=fra(100,45,N);Ln=length(n);n2=n.^2;noiseenergy=sum(n2,2);averagenoiseenergy=sum(soundenergy)/Ln;noisezcr=zcro(n);averagenoisezcr=sum(noisezcr)/Ln;A=1;B=1;for i=1:Lsif (soundenergy(i)>10*averagenoiseenergy) T1=i;break;endendfor i=Ls:-1:1if (soundenergy(i)>A*averagenoiseenergy) T2=i;break;endendfor i=1:T1if(soundzcr(i)>B*averagenoisezcr)E=i;break;endendfor i=Ls:-1:1if(soundzcr(i)>B*averagenoisezcr)F=i;break;endendE=45*E;F=45*F;duandianjianche=S(E:F,:);subplot(4,1,4);plot(duandianjianche);求过零率函数:function f=zcro(x)f=zeros(size(x,1),1);for i=1:size(x,1)z=x(i,:);for j=1:(length(z)-1);if z(j)*z(j+1)<0f(i)=f(i)+1;endendend分帧函数:function f=fra(len,inc,x)fh=fix(((size(x,1)-len)/inc)+1); f=zeros(fh,len);i=1;n=1;while i<=fhj=1;while j<=lenf(i,j)=x(n);j=j+1;n=n+1;endn=n-len+inc;i=i+1;end实验结果:结果为:实验总结:。
语⾳信号处理实验⼀实验⼀语⾳信号的采集及预处理⼀、实验⽬的在理论学习的基础上,进⼀步地理解和掌握语⾳信号预处理及短时加窗的意义及基于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的实现⽅法。
⼆、实验原理及内容1、语⾳信号的录⾳、读⼊、放⾳等:练习matlab中⼏个⾳频处理函数,利⽤函数wavread对语⾳信号进⾏采样,记住采样频率和采样点数,给出以下语⾳的波形图(2.wav),wavread的⽤法参见mablab帮助⽂件。
利⽤wavplay或soundview 放⾳。
也可以利⽤wavrecord⾃⼰录制⼀段语⾳,并进⾏以上操作(需要话筒)。
I=wavread('2.wav');Fs=115200;soundview(I,Fs) %波形图如图1所⽰图1 2.wav的波形图利⽤wavplay函数,在佩戴⽿机的情况下可以清晰的听到所要播放于⼼的消息。
2、语⾳信号的分帧:对语⾳信号进⾏分帧,可以利⽤voicebox⼯具箱中的函数enframe。
voicebox⼯具箱是基于GNU协议的⾃由软件,其中包含了很多语⾳信号相关的函数。
voicebox⼯具箱安装⽅法:(1)把⼯具箱拷贝⼊C:\Program Files\MATLAB\R2006b\toolbox⽬录下;(2)菜单file-set path-"Add folder" 导⼊voicebox;图2 Set Path(3)菜单file-Preference-General-"Updata Toolbox Path Cache图3 Preferencesy=enframe(I,256,128);whos y I实验结果为:Name Size Bytes Class AttributesI 9000x1 72000 doubley 69x256 141312 doubleI=wavread('2.wav');t=enframe(I,256,128);plot(t)图4 分帧后的波形图3、语⾳信号的加窗:本步要求利⽤window函数设计窗⼝长度为256(N=256)的矩形窗(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。