matlab实现声音转换.docx
《matlab实现声音转换.docx》由会员分享,可在线阅读,更多相关《matlab实现声音转换.docx(7页珍藏版)》请在冰豆网上搜索。
matlab实现声音转换
数字信号处理声首
转换课题报告
1.课题研究目标
利用matlab或其他编程软件对音频信号进行处理,要求实现声音的转换。
如男声和女声的转换,老人声音与童声的转换。
2.课题使用工具
Matlab
3.课题技术线路
分析和处理音频信号,首先要对声音信号进行采集。
Matlab的数据采集工具箱提供了一整套命令和函数,通过调用这些命令和函数,可直接控制声卡进行数据采集。
Windows自带的录音机程序也可驱动声卡来采集语音信号,并能保存为wav格式文件,供matlab相关函数直接读取,写入和播放。
本文以wav格
式音频信号作为分析处理的输入数据,用matlab处理音频信号的基本流程
是:
先将wav格式音频信号经wavread函数转换成matlab列数组变量;用matlab强大的运算能力进行数据分析和处理,即时域分析,频域分析,信号合成,识别和增强等;处理后的数据如是音频数据,则可用wavread转换成wav格式文件或用sound,wavplay等函数直接回放。
4.课题实现的原理
本程序使用的方法是通过改变基频然后时长规整的方式来达到目的。
(1)更改基频
通过资料的查询和整理,可以知道不
同人的基频不同统计如下:
正常成年男声:
0〜200Hz;
正常成年女声:
200〜450Hz;
小孩声音的基频要比女声的高,老年人的基频要比男声的低。
经过整理统计可知
女声基频=男声基频*1.5。
本程序使用的是通过抽样与插值的方式来达到基频的改变。
以女变男为例:
用整数D对语音信号X(n)进行抽取
Xd=X(Dn);
然后将X(n)的抽样频率提高到I(整数)倍,即为对X(n)的插值。
D/I=3/2;
(2)时长规整
通过抽样插值来改变基频也使播放速度,播放时间发生改变,因此通过时长规整的方式来使播放速度和时间恢复到原来。
本程序使用的是用重叠叠加算法来达到时长规整。
重叠叠加算法原理:
它分为两个阶段一一分解和合成
将原始信号以帧长N,帧间距sa进行分解,然后以帧间距ss进行合成。
sa与ss的的比值决定了时长规整因子
F=sa/ss。
为保证重叠区域幅度不变,加了汉明窗。
5.Matlab的实现及程序流程
分为编程和gui的设计
(1)编程
y=resample(x,i,d);%重采样来达到抽
值和插值的目的
然后就是时长规整
在具体介绍算法之前,先简要地介绍一下几种参数:
1)W:
窗长度(Window
Length)。
它代表了接受处理的语音信号的最小长度。
2)Sa:
分析延时(Analysisshift)。
它代表了依次截取并进行处理的语音段首地址之间的间隔。
3)Ss:
综合延时(Synthesisshift)。
依次输出的语音段首地址之间的间隔。
4)kmax:
查找延时。
这一延时是指分析窗口为了与输出信号的尾部相一致而必须发生的一段延时。
5)Wov:
后一段语音与前一段语音相叠加的长度。
为了能使上面的参数更容易理解,用下面的图标是各参量之间的关系。
Sa
h
4
■k
r*
SsWav
inputsignal
OutputSignal
整个算法首先将语音段中的前w个数值取出来,直接存入到输出序列中。
然后根据Sa的值取出下一段语音,也就是从第Sa个点开始取,一直取W个点。
然后将这W个点中的前Wov个点与输出序列的最后Wov个点进行比较,比较它们之间的一致性。
记录下比较的情况,然后整个分析窗口(也就是截取W
个点的窗口)向后移动一个样值,再将新的序列中的前Wov个点与输出序列中的后Wov个点进行比较,同时记录下比较结果。
这样依次做Kmax次,然后取出比较结果中最一致的那种情况。
将这种情况下,所截取的语音序列的前Wov
个点与输出序列的最后Wov个点按某种
方式进行叠加,然后再将W个点的窗口中剩余的Ss个点存入到输出序列中去。
至此完成了一轮语音操作。
下一轮语音段处理,与上面基本相同,只不过从输入序列中截取的语音段不是从原先的起点开始而是在原先的起点的基础上向后延时Sa个点。
如果我们用顽表示第m段语音信号,用表示原始信号的序列。
那么两者的关系可以用下面的等式表示:
锐胡%+褊+幵]Jbr?
?
=0.W-1
km是第m个分析窗口的移动量。
km的值得变化范围是0至Kmax对于每一个分析窗口,km的值取遍这些值,同时比较每次语音段的前Wov个点与输出序列中的最后Wov个点的一致性。
取出其中一致性最好的那个语音段将其前Wov
个点叠加到输出序列中去。
设叠加时所用的窗用表示,输出序列"用那么
f„-血渝+科]+(1-孔科])耳[科]的丼二0……略-1
M粘缶+旳]=f
八」I务⑷Jb*陷……W
公式表明,已经在输出序列中的最后Wov个点通过与所选定的窗口中的前Wov个语音点以加权的方式叠加。
加权值与「有关。
叠加后将W个点中剩余的Ss(Ss=W-WoV个点补充到输出序列中去。
通过调整Sa的值和Ss的值(或者是WoV的值就可以达到对语音信号进行时间长度上的变化。
那么具体的每一段语音的km值究竟如何确定呢?
要解决这一问题,关键在于解决一致性的判决标准。
我们采用互相关系数来表示一致性的程度。
那么对于第m轮处理,
其中是所取的分析窗口的前Wov个点和输出序列的最后Wov个点之间的互相关性,它的定义是这样的:
尸;[疋]=丫x[mSa-\-k+网]+ri\
戌[划二工F曲%+斤+切
畤1
多【幻二^y[mSs十幷]
几点初步的讨论:
Sa要大于Ss),如果我们处理的语音信号长度较长。
可以很容易地证明,新旧序列的长度之比是:
Ss/Sa。
根据这一比例关系,我们就可以认为地控制输出序列的长度(当然,这种控制是十分粗略的,并且只是在语音信号较长时有效)。
2)卩㈤的选取应当使得输入与输出序列之间实现平滑的连接。
实验表明,采用简单的斜坡函数也可以达到较好的语音效果(只要采样率足够大)。
3)对于km的求取是降低时间复杂度的重要一步。
实际
上,我们不需要每轮处理数据时都去计算一遍km,计算一遍km会花去不少时间。
我们假定在任何一点,最多有两个窗会在这点上重叠。
现在考虑第m个窗,从输出端的最后Wov个点可以看出,它其实就是输入序列中的某些点:
yM矗+/a]=孔(牌一1)能+(^s+w)
二-l)Sfe+kK_]+(Ss+挖)]
-盂血呂r+L+/j]
其中,第=也+®厂S』。
从上面几个等式可以看出:
如果。
那么,不需要计算km的值,只需要将km的值直接取为tm就可以了。
而如果tm的值超出了上面的这个范围,就必须按照前面的计算方法进行计算。
从前面的讨论中可以看出,要使得在每一点只有最多两个窗相互叠加,实际上是要求,输出序列的最后Wov个点
在前一轮没有参与到叠加运算中。
这就要求在参数选择上要满足Ss>Wov。
另外,为了减小对于km的计算次数,可以选择将Kmax选取得大一些,比如取为500,同时Sa与Ss要尽量接近。
4)对于采用互相关
法求km的情况,作如下算法上的改动:
首先,对于所有的k值,要比较它
们对应得互相关之间的关系,只需要比较1"'就可以了,这样就避免了开方这一麻烦得运算。
同时,由于「J对于所有的k值都是一样的,所以比较时不需要去考虑它。
因此最终我们对于每一个k
(磅[研
值只要比较唧幻。
最后,对于粧啲计算算可以采用递推的方法,即:
碍[上+1]—[上]++k+ty]—/[mSfcr+4]
(2)Gui设计
参考一定量的资料完成了比较简陋的
界面
频谱搬移后的界面
6•程序清单
functionY二voicel(x)
%更改采样率使基频改变
d=resample(x,3,2);
%寸长整合使语音文件恢复原来时长
W=400;
Wov=W/2;
Kmax=W*2;
Wsim=Wov;xdecim=8;
kdecim=2;
X=d';
F=1.5;
Ss=W-Wov;xpts=size(X,2);
ypts=round(xpts/F);
Y=zeros(1,ypts);
xfwin=(1:
Wov)/(Wov+1);
ovix=(1-Wov):
0;
newix=1:
(W-Wov);
simix=(1:
xdecim:
Wsim)-Wsim;
padX=[zeros(1,Wsim),X,zeros(1,Kmax+W-Wov)];
Y(1:
Wsim)=X(1:
Wsim);
xabs=0;
lastxpos=0;
km=0;
forypos=Wsim:
Ss:
(ypts-W);
xpos=F*ypos;
kmpred=km+(xpos-lastxpos);
lastxpos=xpos;
if(kmpred<=Kmax)
km=kmpred;
else
ysim=Y(ypos+simix);
rxy=zeros(1,Kmax+1);
rxx=zeros(1,Kmax+1);
Kmin=0;
fork=Kmin:
kdecim:
Kmaxxsim=padX(Wsim+xpos+k+simix);
rxx(k+1)=norm(xsim);
rxy(k+1)=(ysim*xsim');
end
Rxy=(rxx〜=
0).*rxy・/(rxx+(rxx==0));
km=min(find(Rxy==max(Rxy))-1);
endxabs=xpos+km;
Y(ypos+ovix)=((1-
xfwin).*Y(ypos+ovix))+
(xfwin.*padX(Wsim+xabs+ovix));
Y(ypos+newix)=
padX(Wsim+xabs+newix);
end
end
7.总结
这次课题的目的是将数字信号处理技术应用于某一实际领域,即指对音频信号的处理。
作为存储于计算机中的语音信号,其本身就是离散化了的向量,我们只需将这些离散的量提取出来,就可以对其进行处理了。
在这里,用到了处理数字信号的强有力工具MATLAB通过MATLAB几个命令函数的调用,很轻易的在实际化语音与数字信号的理论之间搭了一座桥。
课题的特色在于它将语音看作了一个向量,于是语音数字化了,则可以完全利用数字信号处理的知识来解决。
我们可以像给一般信号做频谱分析一样,来给语音信号做频谱分析。
最后,还利用了MATLA啲另一强大功能――GUI界面设计。
设计出了一个简易的用户应用界面,可以让人实现界面操作。
更加方便的进行语音的频谱分析