MATLAB 变音文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数字信号处理B》课程项目
实施报告
题目:数字音效处理器
组号: 91
任课教师: 方勇
组长: 11123701 马骁
成员:11123802 梅烜玮
成员: 11120989 毛顺亿
成员: 11120991 程佳静
成员: 11123627 肖淞
联系方式:
二零一三年10月19日
摘要:本论文介绍了在matlab平台下的数字音效处理的实现。

主要使用了matlab中的GUI、FDAtools、audio函数、fft函数、filter函数等制作了图形用户界面、声音的采集和播放、信号在时域和频率的多种处理、滤波器的制作和应用。

通过对声音的时域和频域分析,利用梳状滤波器、IIR2阶滤波器、信号加权线性叠加算法、频域差值算法等理论工具最后实现出对声音的均衡、变声、回声和混音的音效处理。

关键字:数字音效处理、滤波器、matlab
目录
项目分工 (2)
摘要 (3)
目录 (4)
一、课程项目实施方案 (5)
数字音效处理器概述 (5)
1.2 设计平台Matlab简介 (5)
设计思想 (5)
功能指标 (5)
1.5 功能原理概述 (5)
回声简介 (5)
1.5.2 混音音效简介 (6)
1.5.3 男女变声简介 (6)
1.5.4 均衡器简介 (7)
二、系统设计及可行性分析 (7)
2.1 系统综述 (7)
音频的采集与播放 (8)
去噪数字滤波器的设计 (8)
音效算法以及理论分析 (11)
2.4.1 回音的实现方法和理论分析 (11)
混音实现方法和理论分析 (13)
2.4.3 男女变声实现方法和理论分析 (13)
均衡器 (20)
2.4.5 GUI设计 (21)
三、系统性能与结果分析 (22)
3.1 算法性能和结果分析 (22)
3.1.1 回音音效处理 (22)
3.1.2 混音音效处理 (25)
3.1.3男女变声 (25)
3.1.4均衡器 (27)
对项目进行所遇到的问题的分析和解决 (30)
问题 (30)
3.2.2 理论分析问题 (30)
参考文献 (32)
附录1 组员心得 (33)
附录2源程序 (35)
一、课程项目实施方案
数字音效处理器概述
数字音效处理器,是用数字音频信号处理技术来提升和达到各种声音效果的电子装置或者音频变换系统,包括均衡器(EQ)、数字混响器、立体声、特殊音效器等。

其通过对音频进行增益处理、时间处理、频率处理,改变了原始音频的特征,从而达到某些需要特殊环境,如音乐厅、录音室、户外才能达到的特殊声音效果。

随着DSP技术不断更新,芯片处理速度越来越快,如今的数字音效处理器向着实时、快速、轻巧而功能强大的趋势发展。

软件如计算机上的多种音乐播放器、音效处理器,硬件如手持式的MP3音乐播放器、DVD等,都是很好的例子
本次课程项目我们将从其中的几个方面着手,利用Matlab制作简易的数字音效处理器,实现EQ、变声、回声等效果。

1.2 设计平台Matlab简介
Matlab是Mathworks公司推出的一套高性能数值计算软件。

由于它具有优秀的数值计算能力和卓越的数据和可视化能力。

它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案在本次课程项目中,我们利用Matlab中提供的函数和工具箱,如GUI、FDAtools、audio 函数、fft函数、filter函数等制作了图形用户界面、声音的采集和播放、信号在时域和频率的多种处理、滤波器的制作和应用等功能。

设计思想
本次课程设计将利用matlab进行语音信号的采集、分析、处理与播放,通过用户界面,实现对现场采集声音的四种音效处理(均衡、变声、回声和混音)并播放验证效果。

通过数字滤波器设计、音效处理算法、人机交互界面设计等部分,实现数字音效处理器的设计并明确相应的理论基础。

功能指标
(1)通过人机交互界面完成功能控制,如语音采集、播放、音效处理等按键、滑动条控制。

要求界面简洁易懂,功能丰富,尽量反映使用者的视觉和使用需求。

(2)均衡器算法实现。

要求设计可调增益的滤波器,键入以分贝为单位的增益值或衰减值,改变对应中心频率处的幅度。

(3)变声。

将现场采集的音频信号,实现男女变声。

如采集到男音,则利用该程序变为女声;如采集到女音,则变为男声。

(4)回声。

要求设计滤波器,实现可分辨的回声输出。

(5)混音实现。

要求将多路音频混合播出,可调单路音频的延时时间和衰减系数。

功能原理概述
回声简介
声波在传播过程中,碰到大的反射面(如建筑物的墙壁等)在界面将发生反射,人们把能够与原声区分开的反射声波叫做回声。

人耳能辨别出回声的条件是反射声具有足够大的声
强,并且与原声的时差须大于秒。

当反射面的尺寸远大于入射声波长时,听到的回声最清楚,即相隔17米时。

我们通过使用matlab中的fliter函数来实现声音信号反射一次,三次,无数次叠加后的回声效果。

混音音效简介
当物理上多个声源同时发出声音时,传入人耳的声音是来源于这些声波的直接相加。

模拟混音是当多个音频源同时播放时,人耳听到的声波是各个声源声波的线性叠加。

同时,数字语音的混音也是可以将多个声源信号按照某种规则进行叠加的。

混音是指由一个输出设备播放出多个音频流,即提供一个多输入单输出的语音通道。

我们采取加权调整混音算法,对两路音频信号进行调整。

如在演讲音频中混入一段悠扬的音乐,使演讲更加生动。

男女变声简介
我们每个人的声音不同,源于我们的音色和音调不同。

变声原理即通过改变输入声音频率,进而改变声音的音色、音调,使输出声音在感官上与原声音不同。

说话人的个性化音色和语音的另外一个声学参数——共振峰频率的分布有关。

在进行性别变声时,主要考虑基频和共振峰频率的变化。

下面分别对基频与共振峰频率做出定义。

A.基频:基音的频率即为基频,决定整个音的音高。

复合振动或波形(如声波)的谐波成分,它具有最低频率,且通常具有最大振幅——亦称“基谐波”。

基频是复杂声音中最低且通常情况下最强的频率,大多数通常被认为是声音的基础音调。

B.共振峰:共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰不但是音质的决定因素,而且反映了声道(共振腔)的物理特征。

声音在经过共振腔时,受到腔体的滤波作用,使得频域中不同频率的能量重新分配,一部分因为共振腔的共振作用得到强化,另一部分则受到衰减。

通过实验,我们得到如下数据。

图-1男声的语音图谱
图-2女声的语音图谱
通过分析与继续查阅相关资料,我们得出结论:女声的基频分布区域高于男声,共振峰频率较男声也更高。

其原因是由于儿童的声道最短,故共振峰频率最高,成年女性的声道一般短于成年男性,所以女性的共振峰频率一般高于男性。

表-1男声、女声和童声基频、共振峰频率关系表
1.5.4 均衡器简介
均衡器(EQ)可以调节特定频率的幅度响应。

当人们对音频某个频率有特殊的需求时,或是音源在传输等方面幅频响应有损失,就会使用均衡器来补偿特定频率的幅度响应。

实际上均衡器的基本功能就是调节各频段的信号强弱。

人耳的能听到的声音频率范围在20Hz到20KHz。

利用均衡器可调节某些频率的增益使某种声音产生特定的音效,或对某种频率的声音进行补偿。

经过查阅资料,可知各频率的音感特征如下:
30~60Hz 沉闷如没有相当大的响度,人耳很难感觉。

60~100Hz 沉重80Hz附近能产生极强的“重感”效果,响度很高也不会给人舒服的感觉,可给人以强烈的刺激作用。

100~200Hz 丰满
200~500Hz 力度易引起嗡嗡声的烦闷心理。

500~1KHz 明朗800Hz附近如提升10dB,会明显产生一种嘈杂感,狭窄感。

1K~2KHz 透亮
2K~4Kz 尖锐2800Hz附近明亮感关系最大,3400Hz易引起听觉疲劳。

4K~8Kz 清脆6800Hz形成尖啸,锐利的感觉,音感清彻纤细。

8K~16Kz 纤细
二、系统设计及可行性分析
2.1 系统综述
本系统主要由三大部分组成,分别是声音的采集和储存,音效处理和播放分析。

其中音效处理包含音频信号的去噪以及去噪后音频的均衡器、男女变声、混音、回音处理。

播放分
析包含播放音频后主观听觉的效果分析和频谱显示的客观分析。

系统结构可由下图表示。

图系统结构图
音频的采集与播放
利用matlab现场录入音频信号。

录音参数默认单声道,16位量化,44100HZ采样。

关于这三个参数,将会在GUI设计中具体介绍。

利用audiorecorder函数录音。

在音频处理的过程中使用的是缓存中的音频,因此需要读取录完并保存的音频。

使用audioread函数读取音频至函数中一变量。

播放默认单声道,44100HZ频率。

利用audioplayer函数播放。

值得一提的是,为了实现在录音过程中的暂停录音和继续录音功能,必须使用比wav 函数高级的audio函数。

这样就能够实现在一段音频中分段采集需要的音频,直接过滤掉不需要的音频。

并且可以实现任意长度的音频录音和播放。

因此我们的录音机和播放器是功能更为完善的。

去噪数字滤波器的设计
由于现场录制的音频中可能包含有高频噪声,因此我们考虑将音频信号通过低通滤波器实现滤除高频噪声。

人声的频带大概在30HZ~10KHZ之间。

在实际语音状况下,我们注重的是人声,并且在日常说话中很少有人能发出10KHZ的高频音。

因此我们将10KHZ选作低频滤波器的通频带。

由于巴特沃斯低通滤波器具有通带内最平坦的幅度特性,我们选择了2阶巴特沃斯低通滤波器。

阶数N影响过渡带宽度。

N越大,过度带越窄。

我们在选择滤波器时比较了巴特沃斯滤波器和椭圆滤波器。

利用Matlab FDAtool快速设计滤波器。

参数和曲线如图所示。

图-1.2阶巴特沃斯低通滤波器
图-2. 10阶巴特沃斯低通滤波器
图-3. 2阶椭圆滤波器
图-4. 10阶椭圆滤波器
由图像可以显而易见得到,在阶数很低的时候,巴特沃斯低通滤波器与椭圆滤波器并无很大区别。

但在阶数很高时,巴特沃斯低通滤波器明显体现出“通带内最平坦”的优良特性,但过度带很宽。

而椭圆低通滤波器则可实现最窄的过度带,但顶端不平坦。

对于这两种滤波器我们需要根据对通频带和过渡带、阻带的要求来选择。

在本课题中,我们对过渡带宽度并无严格要求。

通过观察,2阶巴特沃斯滤波器波形已
经可以满足我们的需求。

起初我们打算用谱减法消除录入声音信号中的白噪声(即为相对稳定噪声),谱减法的含义就是先截只含有噪声的信号,分析噪声信号,然后在频域上进行处理,使得噪声信号消除。

谱相减方法是基于人的感觉特性,即语音信号的短时幅度比短时相位更容易对人的听觉系统产生影响,从而对语音短时幅度谱进行估计,适用于受加性噪声污染的语音。

谱减法的基本原理:
图1 谱相减法原理图 图中y w (n)为加窗后的带噪信号,D w (ω)为的噪声信号功率谱,s ̂w (n)为增强后的语音信号。

由于人耳对语音相位不敏感,所以用原始含噪语音的相位代替估计语音的相位。

谱减法实现的几条公式如下:
|S
̂w (ω)|2 = |Y w (ω)|2 − E [|D w (ω)|2] (1) S
̂w (ω)=|S ̂w (ω)|exp (j∠Y w (ω)) (2) s ̂w (n ) = F −1 (S
̂w (ω)) (3) 由式(1)得到增强后的语音信号的功率谱;然后利用原始含噪语音的相位∠Y w (ω)代替增强后语音的相位,恢复出增强后的语音信号 s ̂w (n )。

由公式(1)可看出,估计值|S
̂w (ω)|2不能保证是非负的,这是因为在估计噪声时存在误差,当估计噪声平均功率大于某帧带噪语音功率时,该帧得出的估计值|S
̂w (ω)|2就会出现为负的情况,这些负值我们直接给它们置零。

由于在谱减法处理过程中,是以无声期间统计平均的噪声方差代替当前分析帧各频率点的噪声频率分量,而噪声频谱具有高斯分布,即其幅度随机变化范围很宽,因此相减时,若该帧某频率点噪声分量较大,就会有很大一部分保留,具体来讲,由谱相减所产生的噪声称为残余噪声,与语音信号不相关,是由具有随机频率和幅度的窄带信号所组成。

在频谱上呈现随机出现的尖峰,便产生了间歇短暂的突发声调,在听觉上形成有节奏性起伏的类似音乐噪声的残留噪声。

因此我们最好还是采用了巴特沃斯低通滤波器来滤除噪声。

音效算法以及理论分析
2.4.1 回音的实现方法和理论分析
1、回声的时域分析
回声可以认为是由原始声音信号衰减后的多个延迟叠加组成的,因此回声可以用延迟单元来生成。

表示原始连续声音信号,a 为衰减系数,T 为延迟周期,反射一次后的声音信号为:
)(a )3(a )2(a )(a )()(y 32nT t x T t x T t x T t x t x t n -++-+-+-+=
x(t)
)(a 1m n y m ---+ 其离散时间声音信号为:
)
3(a )3(a )2(a )(a )()(y n 32s s s s nTf n x Tf n x Tf n x Tf n x n x n -+-+-+-+= 其中为采样频率。

2、回声的梳状效应
声源发出的声音与反射的回声的接收存在一定的时间差t 时,会引起接收到的声源信号时域特性的相位差,有了相位差,声源信号在传播过程中会产生叠加效果。

由于声音是复杂的信号,经过固定的时间差t 引起的相位差也不一样,可以用T=1/f(T 为周期,f 为频率)。

周期T 与时间差t 相比较可得出两者之间的相位差,故经过时间差t 之后对不同频率引起的相位差会不一样,信号叠加后会引起某些频率上信号的加强,而在另一些频率上引起信号的减弱,造成接受到的信号的频响特性出现“峰”与“谷”的现象,其形状像“梳子”,故称此为梳妆效应。

例如,当t=2ms 时,则在频率f=n/t(n=1,2,3…)处的振幅会有加强的效果,在f=(2n+1)/(2t) (n=0,1,2…)处的振幅会有减弱。

3、使用梳状滤波器实现回声音效
这里我们使用了梳状滤波器来实现声音的回声音效。

梳状滤波器可以使一个信号与它的延时信号叠加,从而产生相位抵消。

梳状滤波器的频率响应由一系列规律分布的峰组成,看上去与梳子类似。

离散时间系统中的梳状滤波器满足下式: )()()()(ττ-+-+=n cy n bx n ax n y
其中τ 是一个表示延时的常量。

4、matlab 实现方法
我们使用了matlab 中的filter 函数,filter 是一维数字滤波器,使用方法为: Y = filter(b,a,x) ,输入X 为滤波前序列,Y 为滤波结果序列,b/a 提供滤波器系数b 为分子,a 为分母。

整个滤波过程是通过下面差分方程实现的:
)2(a -)1(a )(x b )2(x b )1(x b )(x b )(a 321m 3211----++-+-+=+n y n y m n n n n n y
代码如下:
[x, fs] = wavread('3.wav'); % (x, fs)为输入的声音信号,fs 为采样频率; % sound(x, fs);
a = 0.6; T =0.4; %a 为衰减常数,T 为反射一次的延迟时间;
x1=[x;zeros(4*T*fs-1,1)];%将原声音长度延长4个延迟时间T
y1 = filter([1, zeros(1,T*fs-1), a],1, x1); %y1为反射一次后的声音; y2 = filter([1, zeros(1,T*fs-1),a,zeros(1,T*fs-1),
a^2, zeros(1,T*fs-1), a^3], 1, x1); %y2为反射三次后的声音;
y3 = filter(1, [1, zeros(1,T*fs-1), a], x1); %y3为反射无穷多次后的声音;
y4=x1+y1+y2+y3;%y4为合成后的具有回音音效的声音信号;
5、关于利用时域中多次线性叠加原信号获得回音信号
根据回音的定义,我们可以用如下方程得到回音:
s f
y=[x;zeros(N,1)]+0.5*[zeros(N,1);x]+0.25*[zeros(N,1);x];
这是两次回声叠加的音效。

关于性能分析在下一节提出。

2.4.2混音实现方法和理论分析
根据混音的定义,我们可以用音频加权并在时域线性相加得到。


ln(n)=aln1(n)+bln2(n)
其中ln1与ln2长度不一定相同,需要用零矩阵为短序列补0。

零矩阵长度可由两序列长度差得到。

这样就能将两端序列补成相同长度。

核心代码为:
if length(In1)>length(In2)
In2=[In2;zeros((length(In1)-length(In2)),1)];
elseif length(In1)<length(In2)
In1=[In1;zeros(length(In2)-length(In1),1)];
另外,我们考虑到在混音时,两路音频按照需求不一定同时输出。

因此存在延迟时间T。

可同样用零矩阵补零办法实现延时。

In1=[zeros(Myanchi1,1);In1];
In2=[zeros(Myanchi2,1);In2];
其中Myanchi为延时位数,等于Tfs。

2.4.3 男女变声实现方法和理论分析
实现步骤
A.现场采集音频(男声、女声)
B.对其作傅里叶变化得出频谱
C.对频谱插值,将信号在频域上进行扩展,从而实现升调,将男音变为女音;对频谱抽样,
将信号在频域上进行压缩,从而实现降调
D.分析频谱,在频域内改变基频及语速实现变声
E.对其作傅里叶反变换,得出时域语音信号
男女变声程序流程图实现过程如下:
以下为核心代码分析。

1.男声变女声部分:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function terminate %主程序实现男声变女声
clear all;close all;clc;
[y,Fs,nbit]=wavread('3.wav'); %载入音频文件
Ts=1/Fs; %计算采样时间
[nsamples,c]=size(y);%计算音频信号y的大小,将其存入nsamples
fmax=Fs;
N=nsamples; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tscale=0:Ts:(N-1)*Ts; %时间间隔,以步长为TS,从0~((N-1)*Ts)%区域划分时间段fscale=linspace(0,fmax/2,floor(N/2)); %起始值、终止值、元素个数,取一半spectrum=fft(y,N);%对单声道的语音信号做fft将结果存入spectrum
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ newcoeff=scaleup(spectrum,2);%男声变女声,插值操作
new_y = ifft(newcoeff);%变换到时域
fl=20;
[L,c]=size(new_y);
fn=L/fl;
hec = [];
for i=0:fn-1
hec(40*i+1:40*i+20) = new_y(20*i+1:20*i+20);
hec(40*i+21:40*i+40) = new_y(20*i+1:20*i+20);
end
h=figure%作出原语音的时域与频域图
subplot(2,1,1)
plotSpectrum(fscale,spectrum);
subplot(2,1,2)
%listen to the result
plotTime(tscale,ifft(spectrum));
%save result in a wav file
playFile(ifft(spectrum),Fs,'original.wav')%播放并保存原语音
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ newcoeff=scaleup(spectrum,2);%男声变女声程序段,通过频域插值
h=figure
subplot(2,1,1)
plotSpectrum(fscale,newcoeff);
subplot(2,1,2)
plotTime(tscale,ifft(newcoeff));
%save result in a wav file
playFile(hec,Fs,'scaleup.wav')
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function plotSpectrum(fscale,spectrum)%做出语音信号频谱图
subplot(2,1,1)
plot(fscale,abs(spectrum(1:length(fscale))));
xlabel('Frequency Hz')
ylabel('Module')
%plot the phase
subplot(2,1,2)
plot(fscale,angle(spectrum(1:length(fscale))));
xlabel('Frequency Hz')
ylabel('Angle')
end
function fullFFT=scaleup(coeff,n) %插值操作
%select the part that must be shifted
L=floor(length(coeff)/2);
%make the new vector with the DC in place
newcoeff=zeros(L,1);
for k=1:1:L
newcoeff(n*k)=coeff(k);
end
newcoeff(1)=coeff(1);
fullFFT=mirrorfft(newcoeff(1:L),coeff);
end
function plotTime(tscale,signal)
plot(tscale,signal,'k');
xlabel('Time (sec)');
ylabel('Amplitude');
end
function mirrored=mirrorfft(newcoeff,coeff);%用作FFT中的倒序操作
% index of the odd frequency unpaired
M=floor(length(coeff)/2)+1;
% complex coniugate of the first half
fftconj=conj(flipdim(newcoeff(2:end),1));
mirrored=[newcoeff; coeff(M); fftconj];
end
function playFile(y,Fs,filename) %播放并保存语音信号
player = audioplayer(y, Fs);
play(player);pause(5);
wavwrite(y,Fs,filename);
end
2.女声变男声部分:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% spectrum=fft(left,N); %对读入信号进行FFT操作
newcoeff=scaledown(spectrum,2);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ h=figure
subplot(2,1,1)
plotSpectrum(fscale,spectrum);
subplot(2,1,2)
plotTime(tscale,ifft(spectrum));
playFile(ifft(spectrum),Fs,'original.wav')
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ new_y = ifft(newcoeff); %对时域中的语音信号截取,获得与原语音信号长度相同的信号fl=160;
[L,c]=size(new_y);
fn=L/fl;
hec = [];
for i=0:fn-1
hec(80*i+1:80*i+80) = new_y(160*i+1:160*i+80);
end
h=figure %做出时域、频域图
subplot(2,1,1)
plotSpectrum(fscale,newcoeff);
subplot(2,1,2)
plotTime(tscale,ifft(newcoeff));
playFile(hec,Fs,'scaledown.wav') %播放并保存语音
end
function fullFFT=scaledown(coeff,n) %对频域进行采样操作,降低基频和共振峰频率,实现女声变男声。

L=floor(length(coeff)/2);
newcoeff=zeros(L,1);
for k=1:1:L
if(k*n>L)
uppcoeff=0;
else
uppcoeff=coeff(k*n); %采样操作
end
newcoeff(k)=uppcoeff;重新生成新的newcoeff值
end
fullFFT=mirrorfft(newcoeff(1:L),coeff);做倒序操作,使得输出信号与原信号一致end
男女变音遇到的问题
①关于男女声变音曾想过多种方式。

第一种方法是用改变Fs不修改采样数据,仅修改播放频率。

此法虽然实现了变声效果,但是失真较大,且理论支撑不完备。

第二种方法是可考虑将语音信号直接乘以余弦函数,进行频谱的整体搬移,但该种方法是在系数调整方面存在问题。

第三种方法是对语音信号加Hamming窗,对其分帧处理。

可设计一个激励函数,将其与原有语音信号合成。

该法是我之前一直在尝试的方法,其中遇到的具体问题将在第二点中阐明。

②采用分帧处理方案时候遇到的问题。

在使用该方案中的线性预测法时,概念较为模糊。

线性预测分析的基本思想是:一个语音取样的现在值可以用若干个语音取样过去值的加权线性组合来逼近。

通过使实际语音抽样和线性预测抽样之间差值的平方和达到最小值,能够决定唯一的一组预测期系数。

在使用该方法时运用起来较为困难。

③且寻找基因周期与共振峰频率相对困难。

原先采用过如下方式:
time=(1:length(y))/fs;
frameSize=floor(50*fs/1000);
startIndex=round(5000);
endIndex=startIndex+frameSize-1;
frame=y(startIndex:endIndex);
frameSize=length(frame);
frame2=frame.*hamming(length(frame));
rwy=rceps(frame2);
ylen=length(rwy);
cepstrum=rwy(1:ylen/2);
for i=1:ylen/2
cepstruml(i)=rwy(ylen/2+1-i);
end
for i=(ylen/2+1):ylen
cepstruml(i)=rwy(i+1-ylen/2);
end
%基音检测
LF=floor(fs/500);
HF=floor(fs/70);
cn=cepstrum(LF:HF);
[mx_cep ind]=max(cn);
if mx_cep>0.08&ind>LF
a=fs/(LF+ind);
else
a=0;
end
pitch=a;
其原理是取出某帧语音对其加汉明窗处理后求倒谱计算。

根据基因周期的范围为70~500HZ来设置基因搜索范围,同时设置门限。

当满足语音最大倒谱频大于门限值时,计算基音周期,否则基音周期为零。

在实行基音周期检测时,对于不同的音频文件,程序显示基因周期为零或者计算公式错误的报错信息。

我们未能够解决准确检测基音周期与共振峰频率检测的问题故没有继续该方法。

④采用频域插值、抽样遇到的问题。

在使用对原始信号进行FFT变换,并进行插值、采样时,会改变其时域波形。

如对频域进行采样(频域被压缩),则时域便会被拉长,导致播放的语音较原来的语音长度更长。

同理,当对频域进行插值时,时域便被压缩,导致播放时的语音变短。

我们思考出了解决此问题的方法,但在MATLAB中实现时遇到了问题,故未能有效解决原音频被变速的现象。

但是,我们思考出的解决方案仍具有非常大的实用意义,故我们将在第五点中详细说明。

⑤在实际变换中,由于采样点数目的改变,可能会出现严重的延时、不连续、失真等现象。

根据实验结果,我们得知,在我们对频域采样增加,时域会出现被压缩现象。

我们将一段语音分为若干帧处理。

假设当前取帧长FL=80,采样频率FS,目标变换帧频率为FS’,则目标变换帧长FL’=FL*FS’/FS。

记Rate=Fs’/FS,那么FL’=FL*Rate,其中Rate为基频变化率。

变换开始时,先求得FL和FL’的最小公倍数AL,再将原音频帧插值为AL点,最后将插值后的语音段重新抽样,得到长FL’点的变声后的数据。

当1<Rate<2的情况,帧长变短(也即男声变女声),也就是会出现FL-FL’的空白。

因为取得帧长较短,可认为在该区域内语音信号保持不变,若要填补插值产生的空白,这段时间可以使用之前的帧的倒放来填充;而对于0.5<Rate<1的情况,可以只截取每帧的前FL个采样点,丢弃后面的FL’-FL个样点。

由于帧长较短,人耳对如此短时的变化无法辨别出其经过处理。

2.4.
3.3解决处理后的语音长度变化问题
在中曾提到在实际变换中,由于采样点数目的改变,可能会出现严重的延时、不连续、
失真等现象。

对频域采样增加或减少,时域会出现被压缩或拉长现象。

为解决此方法,我们针对不同问题提出了针对解决方案。

1.在女声变男声过程中,可以只截取每帧的前FL个采样点,丢弃后面的FL’-FL个样点。

具体实现代码如下:
new_y = ifft(newcoeff); %对时域中的语音信号截取,获得与原语音信号长度相同的信号fl=160;
[L,c]=size(new_y);
fn=L/fl;
hec = [];
for i=0:fn-1
hec(80*i+1:80*i+80) = new_y(160*i+1:160*i+80);
end
原理简述:女生变男声之后的帧长增长,假设原语音信号每帧长度为80,变换后被拉长的语音信号每帧长度为160。

由于帧长较短(),可认为在该区域语音信号恒定不变。

现截取帧长为160信号的前80个点,存入新语音变量hec,也即将变换后的信号截取一半,可达到新语音长度被缩短为与原语音相同的时间。

2.在女声变男声过程中,若要填补插值产生的空白,这段时间可以使用之前的帧的倒放来填充。

具体实现代码如下:
new_y = ifft(newcoeff);%变换到时域
fl=20;
[L,c]=size(new_y);
fn=L/fl;
hec = [];
for i=0:fn-1
hec(40*i+1:40*i+20) = new_y(20*i+1:20*i+20);
hec(40*i+21:40*i+40) = new_y(20*i+1:20*i+20);
end
原理简述:男声变女声后,帧长变短,也就是会出现FL-FL’的空白。

因为取得帧长较短,可认为在该区域内语音信号保持不变。

假设原音信号每帧长度为40变换后被拉长的语音信号每帧长度为20。

现将变换后的语音某一帧的20个点先存入hec的0*i+1:40*i+20个点钟,再将变换后的语音信号的同一帧放入hec(40*i+21:40*i+40)。

这样会使hec中存入的信号长度与原信号长度相同。

2.4.
3.4变声过程中仍存在的不足
1. 男声变女声:在男声变女声的过程中,产生了噪音与失真现象。

2.女声变男声:在女生变男声的过程中,明显能感到两层音。

我们猜想这可能是由于抽样频率过小,不满足奈奎斯特采样定理:fs≥2fmax 造成的混叠现象。

我们对此提出的猜想解决方案是:在初次信号采集时加入低通滤波器,把高频信号屏蔽掉,使的通过滤波器的信号频率小于1/2FS,也可以减少混叠现象。

相关文档
最新文档