语音中提取基音频率matlab程序
自相关函数法基音周期提取(matlab版)

function nmax=find_maxn(r)%maxn,为峰值最大的nzer=find(r==0); %找第一个零点如果存在jiaocha=0; %找第一近零点ii=1;while (jiaocha<=0)if(r(ii)>0 && r(ii+1)<0 && (ii+1)<length(r))jiaocha=ii;endii=ii+1;if ii==length(r) %没有找到符合要求的点jiaocha=1;endendif length(zer)>0 %检查是否存在零点if zer(1)<jiaocha %存在,则和jiaocha比较大小,用于祛除前点的对基音周期的查找带来的影响jiaocha=zer(1);endendr(1:jiaocha)=0; %祛除影响maxn=max(r); %找最大值temp=find(r==maxn);%返回第一个最大值nmax=temp(1);function jiyinzhouqi(filename,shift)%短时自相关分析%filename语音文件*.wav%zhouqi基音周期shift=10;[signal,fs]=wavread('f:/mywork/1.wav');shift=round(fs*shift); %帧移n1=fix(fs*0.97)+1; %分析起点970ms,帧长30msn2=fix(fs*1)+1;ii=1;for ii=1:(length(signal)-n1)/shift %分析次数if n2<length(signal)data=signal(n1:n2);N=n2-n1+1;R=zeros(1,N); %基音周期(n)多次分析数组for k=1:N-1for jj=1:N-kR(k)=R(k)+data(jj)*data(jj+k);endendvalue(ii)=find_maxn(R); %调用基音周期(n)分析函数n1=n1+shift; %移动帧n2=n2+shift;endend%figure(3)%plot(R);%axis([0,1000 -300 300])figure(1)stem(value);axis([0 length(value) 0 1000])len =length(value); %基音周期(n)多次分析数组长度aver=mean(value);index=find(abs((value-aver))>aver/5);value(index)=0; %去除大野点的影响len=len-length(index);for jj=1:3:len/3 %中值平滑,滑动窗口宽度3,精度为中值1/4(剔除野点)average=(value(jj)+value(jj+1)+value(jj+2))/3;for kk=1:3if abs((value(jj-1+kk))-average)>average/4value(jj-1+kk)=0; %将野点置零,同时数组长度减一len=len-1;endendendfigure(2)stem(value);axis([0 length(value) 0 max(value)])Tp=sum(value)/len/fs %求基音周期(Tp)。
基音周期提取1-原理说明

基⾳周期提取1-原理说明Matlab 基⾳周期提取1-原理说明
先看语⾳“0”的整体波形:
图1
再选其中的两个局部:
图2
图3
以上三幅图为语⾳“0”以8KHz采样的波形。
可以看出,汉语语⾳具有⾮常明显的**准周期特性**。
相邻的两个周期的波形基本⼀致,随时间推移,波形规律性的**逐渐**改变。
基⾳周期提取的常⽤⽅法参数有:**短时⾃相关**、短时平均幅度差、线性预测倒谱、⼩波⾃相关函数、三电平削波的互相关函数等[2]。
这⾥对便于理解的短时⾃相关法说明如下,直接引⽤参考⽂献内容。
图4(参考⽂献[3])
公式通俗理解:
式3.13中,R(k)等于原序列x中,由负⽆穷到正⽆穷,所有间隔为k的两个样点,相乘后求和。
式3.14中,R(k)等于原序列x中,由负⽆穷到正⽆穷,所有间隔为k的两个样点,相乘后求和,再除以求和的项数,即相隔为k的样点乘积的平均值。
图5(参考⽂献[3])
参考⽂献:
1、《实⽤语⾳识别基础》王炳锡屈丹彭煊等,国防⼯业出版社 2005
2、《MATLAB在语⾳信号分析和合成中的应⽤》宋知⽤,北京航空航天⼤学出版社 2013
3、《数字语⾳处理及MATLAB仿真》张雪英,电⼦⼯业出版社 2010
4、⽹络资源。
基于MATLAB的语音信号的采集与分析

基于MATLAB的语音信号的采集与分析摘要:我们通过学习使用MA TLAB仿真软件实现语音信号分析,加深对信号与系统这门课程所学习内容的理解,锻炼自学能力和动手能力。
我们通过电脑的声卡采集声音信号,借助已有的知识和MATLAB对采集的声音信号进行时域波形和频域频谱的显示,研究男女声信号的差别,通过查找资料提取声音信号的基音频率,并通过大量测试确定门限值来自动判别男女声信号,最后对信号进行降采样处理并播放,重新绘制频谱图分析,验证抽样定理。
关键词:MA TLAB仿真、频谱分析、基音频率、降采样、抽样定理。
1.音频信号的采集我们所要分析的语音信号需要自行采集,所以信号分析的第一步就是采集音频信号。
实现音频信号的采集最简单的办法就是通过电脑的声卡直接进行采集,这样采集到的音频信号虽然已经被转化成了数字量存储在电脑中,但通过查询我们了解到电脑录音所使用的采样频率是为44100Hz,完全保证了人类耳朵能听到所有声音频率分量的无失真采集,如果通过MA TLAB软件采集还能够调节采样频率,所以能够完全满足我们实验的要求。
1.1使用MATLAB采集语音信号通过上网查询,我们了解到MATLAB有自带的音频信号采集函数audiorecord(),通过它可以在程序运行时即时采集音频信号进行存储并处理,并且可以通过改变输入参数来改变采样频率,可以直接模拟降采样的过程,直观地验证抽样定理。
但鉴于我们需要重复进行试验和演示,即时采集信号显得繁琐且不必要,而且会增加我们非界面化编程的难度,所以我们放弃了这种方法。
1.2使用电脑录音机采集语音信号通过电脑自带的录音机软件可以实现更简单的音频信号采集操作,虽然采样频率不可调节,但其固有的采样频率完全满足了我们对所采集信号的要求,可以通过MATLAB的降采样处理的到较低采样频率的信号。
这样采集的音频信号会直接以文件的形式存储在电脑中,方便我们随时进行调用,方便分析与演示,所以我们决定采用这种方式实现语音信号的采集。
基于MATLAB的语音信号的基音周期检测

基于MATLAB的语音信号的基音周期检测摘要:MATLAB是一种科学计算软件,专门以矩阵的形式处理数据。
MATLAB将要性能的数值计算和可视化集成在一起,并提供了大量的内置函数,从而被广泛的应用于科学计算、控制系统和信息处理等领域的分析、仿真和设计工作。
MATLAB在信号与系统中的应用主要包括符号运算和数值计算仿真分析。
由于信号与系统课程的许多内容都是基于公式演算,而MATLAB 借助符号数学工具箱提供的符号运算功能,基本满足设计需要。
例如:解微分方程、傅里叶正反变换、拉普拉斯正反变换和Z正反变换等。
MATLAB在信号与系统中的另一主要应用是数值计算与仿真分析,主要包括函数波形绘制、函数运算、冲击响应仿真分析、信号的时域分析、信号的频谱分析、系统的S域分析和零极点图绘制等内容。
本次课程设计为语音信号的基音周期检测,采集语音信号,对语音信号进行处理,区分清音浊音,并通过对采样值进行滤波、分帧、求短时自相关函数,得到浊音的基音周期。
关键字:清音、浊音、基音周期、基音检测、自相关函数目录1 概述 (1)2 AMDF算法原理及实现 (1)2.1 AMDF算法源程序 (2)3 ACF算法原理及实现 (4)3.1 用短时平均能量进行清/浊音的判断 (4)3.2 自相关函数基音检测的原理 (6)3.3 算法实现及相关程序 (6)3.3.1 带通滤波 (7)3.3.2 取样与分帧 (7)3.3.3 短时能量分析 (8)3.3.4 自相关函数分析 (11)4 总结与心得体会 (13)参考文献 (13)1 概述基音周期检测也称为基频检测(Pitch Detection) ,它的目标是找出和声带振动频率完全一致的基音周期变化轨迹曲线,或者是尽量相吻合的轨迹曲线。
基音周期检测在语音信号的各个处理领域中,如语音分析与合成、有调语音的辨意、低速率语音压缩编码、说话人识别等都是至关重要的,它的准确性及实时性对系统起着非常关键的作用,影响着整个系统的性能。
语音信号基音周期检测的matlab程序

function nmax=find_maxn(r)%寻找峰值最大的n值及基音周期%r,自相关序列%maxn,为峰值最大的nzer=find(r==0); %找第一个零点如果存在jiaocha=0; %找第一近零点ii=1;while (jiaocha<=0)if(r(ii)>0 && r(ii+1)<0 && (ii+1)<length(r))jiaocha=ii;endii=ii+1;if ii==length(r) %没有找到符合要求的点jiaocha=1;endendif length(zer)>0 %检查是否存在零点if zer(1)<jiaocha %存在,则和jiaocha比较大小,用于祛除前点的对基音周期的查找带来的影响jiaocha=zer(1);endendr(1:jiaocha)=0; %祛除影响maxn=max(r); %找最大值temp=find(r==maxn);%返回第一个最大值nmax=temp(1);function jiyinzhouqi(filename,shift)%短时自相关分析%filename语音文件*.wav%zhouqi基音周期shift=10;[signal,fs]=wavread('f:/mywork/1.wav');shift=round(fs*shift); %帧移n1=fix(fs*0.97)+1; %分析起点970ms,帧长30msn2=fix(fs*1)+1;ii=1;for ii=1:(length(signal)-n1)/shift %分析次数if n2<length(signal) %防止溢出data=signal(n1:n2);N=n2-n1+1;R=zeros(1,N); %基音周期(n)多次分析数组for k=1:N-1 %求自相关序列for jj=1:N-kR(k)=R(k)+data(jj)*data(jj+k);endendvalue(ii)=find_maxn(R); %调用基音周期(n)分析函数n1=n1+shift; %移动帧n2=n2+shift;endend%figure(3)%plot(R);%axis([0,1000 -300 300])figure(1)stem(value);axis([0 length(value) 0 1000])len =length(value); %基音周期(n)多次分析数组长度aver=mean(value);index=find(abs((value-aver))>aver/5);value(index)=0; %去除大野点的影响len=len-length(index);for jj=1:3:len/3 %中值平滑,滑动窗口宽度3,精度为中值1/4(剔除野点)average=(value(jj)+value(jj+1)+value(jj+2))/3;for kk=1:3if abs((value(jj-1+kk))-average)>average/4value(jj-1+kk)=0; %将野点置零,同时数组长度减一len=len-1;endendendfigure(2)stem(value);axis([0 length(value) 0 max(value)])Tp=sum(value)/len/fs %求基音周期(Tp)。
matlab语音信号基频参数提取

[b,a]=ellip(4,0.1,20,wp); % 构造椭圆滤波器
data=filter(b,a,data2);
%plot(data);% 求加窗处理后的数据经过滤波器的响应
[xmax,index]=max(data1);
%画基频图
plot(yy);
[ymax,maxindex] = max(yy);
fmax=fs/(maxindex+30);
%fmaxce2;
fmaxce2=fmax;
%fmax=roundn(fmax,-3);
fmax21=roundn((fmax-5),3);
fmax22=roundn((fmax+5),3);
run(cc,'runtohalt')
%ddatV=read(cc,address(cc,'fIn'),'single',256)
%idattV=read(cc,address(cc,'fOut'),'single',1000)
%plot(abs(idattV))
timewin=floor(0.015*fs);
xwin=data1(index-timewin:index+timewin);
[y,lags]=xcov(xwin);
ylen=length(y);
halflen=(ylen+1)/2 +30;
yy=y(halflen: ylen);
blocksize =length(data1); % 计算窗函数长度
window = hanning(blocksize); % 计算汉宁窗函数(此函数为MATLAB自带)
Matlab基于倒谱和EMD的语音基音周期的提取

---------------------------------------------------------------范文最新推荐------------------------------------------------------ Matlab基于倒谱和EMD的语音基音周期的提取在语音信号处理中,常用的语音特性是基于Mel频率的倒谱系数(MFCC)以及一些语音信号的固有特征,如基音周期等。
倒谱法可以较好地将语音信号中的激励信号和声道响应分离,并只需要用一些倒谱系数就能较好地描述语言信号的声道响应,在语音信号处理中占有很重要的位臵。
而倒谱解卷积法受加性噪声影响比较大,抗噪声性能不是很好。
针对这一存在问题,利用EMD 方法在理论上可以应用于任何类型的信号的分解,在处理非平稳及非线性数据上, 具有非常明显的优势这一优点。
本文中提出一种基于倒谱和EMD的语音基音周期提取的改进算法。
并在Matlab 中予以实现。
关键字:基音周期倒谱法EMD8664TitlePitch Period Extraction of Speech Signals based1 / 8on Cepstrum and EMDAbstractIn voice signal processing, MFCC and some inherent characteristics of voice signals, such as the frequency of pitch. Cepstrum can be used to separate the excitation signal and channel response, and can represent channel response with only a dozen cepstral coefficients. As a result, it has been a very important role in voice signal processing. While cepstrum deconvolution method is largely influenced by additive noise,and anti-noise performance is not very good.The EMD method can be applied to decompose any type of signals,and thus,having a very distinct advantage in handing non-stationary and non-linear data.For this problem,in this paper,an improved algorithm of pitch period extraction of speech signals based on cepstrum and EMD is proposed. Its implementation in MATLAB are described in detail.Key words:pitch periodCepstrumEMD---------------------------------------------------------------范文最新推荐------------------------------------------------------ 目次1 引言11 引言1.1 背景由于语言是人们在日常生活中的主要交流手段,因此语音信号处理在现代信息社会中占用重要地位。
使用Matlab进行声音信号处理的基本技巧

使用Matlab进行声音信号处理的基本技巧声音信号处理是一门重要的领域,它涵盖了音频合成、语音识别、音频修复等多个应用方向。
Matlab是一款功能强大的数学软件,也可以用于声音信号处理。
本文将介绍使用Matlab进行声音信号处理的基本技巧,包括声音读取、时域分析、频域分析、滤波和音频合成等内容。
1. 声音读取首先,我们需要将声音文件读取到Matlab中进行处理。
Matlab提供了`audioread`函数用于读取声音文件。
例如,我们可以使用以下代码读取一个wav格式的声音文件:```matlab[y, Fs] = audioread('sound.wav');```其中,`y`是声音信号的向量,每个元素代表一个采样点的数值;`Fs`是采样率,即每秒采样的次数。
通过这个函数,我们可以将声音文件以数字信号的形式加载到Matlab中进行后续处理。
2. 时域分析在声音信号处理中,常常需要对声音信号在时域上进行分析。
我们可以使用Matlab的绘图函数来展示声音信号的波形。
例如,以下代码可以绘制声音信号的波形图:```matlabt = (0:length(y)-1)/Fs;plot(t, y);xlabel('Time(s)');ylabel('Amplitude');title('Sound waveform');```这段代码中,`t`是时间轴,通过除以采样率,我们可以得到每个采样点对应的时间。
`plot`函数用于绘制声音信号的波形图,横轴表示时间,纵轴表示振幅。
通过这种方式,我们可以直观地观察声音信号的时域特征。
3. 频域分析除了时域分析,频域分析也是声音信号处理中常用的方法。
通过对声音信号进行傅里叶变换,我们可以得到声音信号在频域上的表示。
Matlab提供了`fft`函数用于进行傅里叶变换。
以下代码可以绘制声音信号的频谱图:```matlabN = length(y);f = (-N/2:N/2-1)/N*Fs;Y = fftshift(fft(y));plot(f, abs(Y));xlabel('Frequency (Hz)');ylabel('Magnitude');title('Sound spectrum');```在这段代码中,`N`是声音信号的长度,`f`是频率轴,通过调整`f`的取值范围可以实现将零频移动到中心位置。