基于MATLAB算法的数字变声器.doc

上传人:11****ws 文档编号:3743002 上传时间:2019-07-11 格式:DOC 页数:14 大小:155.59KB
下载 相关 举报
基于MATLAB算法的数字变声器.doc_第1页
第1页 / 共14页
基于MATLAB算法的数字变声器.doc_第2页
第2页 / 共14页
基于MATLAB算法的数字变声器.doc_第3页
第3页 / 共14页
基于MATLAB算法的数字变声器.doc_第4页
第4页 / 共14页
基于MATLAB算法的数字变声器.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、基于 MATLAB 算法的数字变声器【摘要】变声器的原理是通过改变输入声音频率,进行改变声音的音色、音调,使输出声音在感官上与原声音不同。变声器是借助对声音音色和音调的双重复合改变,实现输出声音的改变。通过自己发声,共振峰频率的改变是基于重采样实现的。同时用 LPC 倒谱分析法分析共振峰的范围,通过 MATLAB 编写程序并构置 GUI 界面。实验中通过 MATLAB 软件对采集来的语言信号进行频谱分析,讨论不同人之间的噪音源参数和共振峰参数,通过对不同人语言信号频率和幅度的改变来实现不同人之间的语音转换。【关键词】短时自相关法; LPC 倒谱; 语音信号; matlab GUI;1引言随着生

2、活水平的提高,科技的不断进步,很多人为了娱乐,从而希望改变自己的声音;还有如今的许多的访问节目为了保护被访问者,都对声音进行了相应的处理。本设计通过编写 matlab 程序,借 助 对 声 音 音 色 和 音 调 的 双 重 复 合 改 变 , 实 现 输 出 声 音 的 改 变 。共 振 峰 频 率 的 改 变 是 基 于 重 采 样 实 现 的 , 从 重 采 样 原 理 知 道 , 这 也 同 时 印 发 了 基 频 的变 化 , 为 保 证 基 频 变 化 和 共 振 峰 频 率 变 化 的 独 立 、 互 不 相 关 , 在 基 频 移 动 时 必 须 考 虑抵 消 重 采 样 带

3、来 的 偏 移 , 理 论 上 只 要 基 频 检 测 足 够 精 确 , 确 实 可 以 保 证 基 频 改 变 和 共振 峰 频 率 改 变 间 的 互 不 相 关 。 保 证 变 声 效 果 的 自 然 度 主 要 是 没 有 采 用 基 因 检 测 将 基 因移 动 和 共 振 峰 变 化 彻 底 隔 离 的 缘 故 。本次课程设计就是运用我们所学到的理论知识,用 MATLAB 软件来实现对语音信号的变声处理,理论联系实际,从而更好地掌握以及运用所学习的知识。2 数字变声器的原理与算法2.1基本原理语音科学家将人类发声过程视作一个由声门源输送的气流经以声道、口、鼻腔组成的滤波器调制而成

4、的。人类语音可分为有声语音和无声语音,前者是由声带振动激励的脉冲信号经声腔调制变成不同的音,它是人类语言中元音的基础,声带振动的频率称为基频。无声语音则是声带保持开启状态,禁止振动引发的。一般来说,由声门振动决定的基频跟说话人的性别特征有关,如下表,而无声语音则没有体现这个特征。说话人的个性化音色和语音的另外一个声学参数共振峰频率的分布有关。儿童由于声道短,其共振峰频率高于成年人,成年女性的声道一般短于成年男性,所以女性的共振峰频率一般高于男性。在进行性别变声时,主要考虑基音周期、基频和共振峰频率的变化。其中男生、女生和童声的基频、共振峰的关系如图1所示;基音周期改变时,基频、共振峰同时变化,

5、若伸展既有男变女、女变童,反之亦可。本实验是基于打开一种声音进行相关参数提取,修改接近于女声、男声或童声,实现声音的变换。2.2 实现过程及算法采用线性预测参数合成法。线性预测参数合成法利用 LPC 语音分析方法,通过分析自图 1 人群基频与共振峰的关系然语音样本,计算出 LPC 系数,就可以建立信号产生模型,从而合成出语音。大致流程如图 2 所示。2.2.1 基于短时自相关法的基音周期估值对语言信号进行低通滤波,然后进行自相关计算。在低通滤波时,采用巴特沃斯滤波器。根据人的说话特征设定相应指标参数,对本段语音设计算出巴特沃斯模拟滤波器的阶数 N 为 5,3dB 截止频率 , ,算出 为 0.

6、175,归一化低通原型系 =(100.1-1)-12统函数为:G( ) = 15+44+33+22+1+0其中 0=1.0000,1=3.2361,2=5.2361,3=5.2361,4=3.2361将 带人 中,得到低通滤波器,=/ G( )= 55+4 24+2 32+1 4+0 5根据设定的滤波器编写 matlab 程序,当信号经过低通滤波器后,对原始信号滤波产生结果如下图 2 所示,低通滤波后,保留基音频率,然后再用 8kHz 采样频率进行采样,采样序列为 x(n),然后进行下一步的自相关计算。2.2.2 语音信号的短时自相关函数定义语音信号自相关函数如下:图 3 原始信号低通滤波图

7、2 制作流程()=1=0 ()(+)其中 k 为信号延迟点数: 为语音信号;N 为语音帧长度。经过低通滤波之 ()后,取 160 个样点数,帧长取 10ms,对每帧语音求短时自相关,取得自相关最大点数,自相关函数在基音周期处表现为峰值,这些峰值点之间的间隔的平均值就是基音周期。2.2.3 LPC 倒谱法提取共振峰通过线性预测分析得到合成滤波器的系统函数为( ) = 11=1其冲击响应为 h(n), 为预测系数。然后求 h(n)的倒谱 (n),首先根据同态分析方 h法,有 (z)=logH(z),因为 H(z)是最小相位的,即在单位圆内是解析的,所以 (z)可H H以展开成级数形式,即 (z)=

8、 ,也就是说 H(z)的逆变换 (n)是存在的,=1(n)-h设 h(n)=0,将等式两端分别对 求导,得到:-1=1(n)+1h=1+11=1u有(1- ) = , 令式左右两边 Z 的各次幂=1- =1(n)-+1 =1-+1前系数分别相等得到: h(1)=1(n)= + h 11=1(1)(n) h(n)= np1=1(1)(n)在本实验中,取预测阶数为 10,语音的样点数为 160,按照上式可直接从预测系数求得倒谱 (n),这个倒谱是根据线性预测模型得到,即称为 LPC 倒谱。2.2.4 线性预测语音信号合成根据线性预测的基本思想,用过去 M 个样点值来预测现在或未来的样点值:(n)=

9、y=1()(n)是预测信号, 为预测系数, y(n)为取样信号,预测误差 (n):yE (n)=E 2 ()=1()2为使 E (n)最小,对 求偏导,并令其为零,有:2 E y(n- )=0 =1,M()=1() 上式表明采用最佳预测系数时,预测误差与过去的样点值正交。由于语音信号的短时平稳性,要分帧处理,对于每一个样点值记为 (n), (n+N-1),这段语音记为 Yn。 对于语音段 Yn,并记 (j,i)=E ,对于语音段 Yn,它的自相关 ()()函数为:n=1,M()=1=()()根据 Yulewalker 方程,可以解出样值,用这种方法定期地改变激励参数 u(n)和预测系数 ,并使

10、用修改过后的基因周期和共振峰参数,就能合成出语音,合成语音样本如下:S(n)= +Gu(n)=1()为预测系数;G 为模型增益;u(n)为激励;合成样本 s(n);p 为预测器阶数;2.2.5 流程图开始导入语音数据 S 算法数据归一化建立滤波器重建语言合成并加窗确定帧数线性预测法预测p个系数计算减小基音周期提取共振峰打开音频男变女开始运行女变男 变童声3 数字变声器的软件实现及仿真结果3.1 界面设计在设计数字变声器的界面时,使用了 MATLAB 提供的可视化的界面环境 Guide。相比通过编写程序进行 GUI 的设计,可视化的界面环境更加方便快捷。见图 41按钮组:设计中使用了两个按钮组,

11、把打开、原声、男变女、女变男、童声三项功能放在一组;另一个把语音的图像 即 4 个 axes 放在了一组。2 按钮:最常用的控件,用于相应用户的鼠标单击,按钮上有说明文字说明其作用。设计中使用了五个按钮,分别用于打开、原声、男变女、女变男、童声。3 轴: 用于显示图像。3.2 回调函数对控件的 Callback 属性编程是实现 GUI 的基本机制,我们下来就要在各函数中编写程序代码,完成各回调函数的功能。(1)打开function dakai_Callback(hObject, eventdata, handles)filename,pathname=uigetfile(*.wav,ALL F

12、ILES,选择声音);ifisequal(filename pathname,0,0)return;endstr=pathname filename;temp,Fs=audioread(str);temp1=resample(temp,80,441);handles.y=temp1;handles.y1=temp;handles.Fs=Fs;合成激励 合成语音图 4 界面设计guidata(hObject,handles);(2)原声function yuansheng_Callback(hObject, eventdata, handles)c=handles.Fs;sound(handle

13、s.y1,c);plot(handles.axes1,handles.y1)title(handles.axes1,时域图);ysize=size(handles.y1);y1=fft(handles.y,length(handles.y1);ysize=size(y1);plot(handles.axes2,abs(y1);xlabel(handles.axes2,频率);ylabel(handles.axes2,幅度);title(handles.axes2,频率特性);(3)男变女function nanbiannv_Callback(hObject, eventdata, handle

14、s)FL = 80 ; % 帧移WL = 240 ; % 窗长P = 10 ; %预测系数个数s = handles.y;fs = handles.Fs;% 定义常数s = s/max(s); % 归一化L = length(s); % 读入语音长度FN = floor(L/FL)-2; % 计算帧长,floor;向负无穷方向% 预测和重建滤波器exc = zeros(L,1); % 激励信号,double类零矩阵L 行1列zi_pre = zeros(P,1); % 预测滤波器状态s_rec = zeros(L,1); % 重建语音zi_rec = zeros(P,1);% 变调滤波器exc

15、_syn_t = zeros(L,1); % 合成的激励信号,创建一个L 行1列的0脉冲s_syn_t = zeros(L,1); % 合成语音last_syn_t = 0; % 存储上一个段的最后一个脉冲的下标zi_syn_t = zeros(P,1); % 合成滤波器hw = hamming(WL); %汉明窗%滤波器% 依次处理每帧语音for n = 3:FN %从第三个子数组开始% 计算预测系数s_w = s(n*FL-WL+1:n*FL).*hw; %汉明窗加权A,E=lpc(s_w,P); %线性预测计算预测系数% A是预测系数,E 会被用来计算合成激励的能量s_f=s(n-1)*

16、FL+1:n*FL); % 本帧语音%利用 filter函数重建语音exc1,zi_pre = filter(A,1,s_f,zi_pre); exc(n-1)*FL+1:n*FL) = exc1; %计算激励%利用 filter函数重建语音s_rec1,zi_rec = filter(1,A,exc1,zi_rec);s_rec(n-1)*FL+1:n*FL) = s_rec1; %重建语音% 下面只有得到exc 后才可以s_Pitch = exc(n*FL-222:n*FL);PT(n) = findpitch(s_Pitch); %计算基音周期ptG = sqrt(E*PT(n); %计

17、算合成激励的能量G% tempn_syn = 1:n*FL-last_syn;% exc_syn1 = zeros(length(tempn_syn),1);% exc_syn1(mod(tempn_syn,PT)=0) = G; %某一段算出的脉冲% exc_syn1 = exc_syn1(n-1)*FL-last_syn+1:n*FL-last_syn);% s_syn1,zi_syn = filter(1,A,exc_syn1,zi_syn);% exc_syn(n-1)*FL+1:n*FL)=exc_syn1; %计算得到合成激励% s_syn(n-1)*FL+1:n*FL) = s_

18、syn1; %计算得到合成语音% last_syn = last_syn+PT*floor(n*FL-last_syn)/PT);PT1 =floor(PT(n)/2); %减小基音周期poles = roots(A);deltaOMG =100*2*pi/fs;for p=1:10 %增加共振峰ifimag(poles(p)0poles(p) = poles(p)*exp(1j*deltaOMG);elseifimag(poles(p)=0.85*RopRop=R2;Top=T2;endif R30.85*RopRop=R3;Top=T3;endPT=Top;return(3)女变男func

19、tion nvbiannan_Callback(hObject, eventdata, handles)FL = 80 ; % 帧移WL = 240 ; % 窗长P = 10 ; %预测系数个数s = handles.y;fs = handles.Fs;% 定义常数s = s/max(s); % 归一化L = length(s); % 读入语音长度FN = floor(L/FL)-2; % 计算帧长,floor;向负无穷方向% 预测和重建滤波器exc = zeros(L,1); % 激励信号,double类零矩阵L 行1列zi_pre = zeros(P,1); % 预测滤波器状态s_rec

20、= zeros(L,1); % 重建语音zi_rec = zeros(P,1);% 变调滤波器exc_syn_t = zeros(L,1); % 合成的激励信号,创建一个L 行1列的0脉冲s_syn_t = zeros(L,1); % 合成语音last_syn_t = 0; % 存储上一个段的最后一个脉冲的下标zi_syn_t = zeros(P,1); % 合成滤波器hw = hamming(WL); %汉明窗%滤波器% 依次处理每帧语音for n = 3:FN %从第三个子数组开始% 计算预测系数s_w = s(n*FL-WL+1:n*FL).*hw; %汉明窗加权A,E=lpc(s_w,

21、P); %线性预测计算预测系数% A是预测系数,E 会被用来计算合成激励的能量s_f=s(n-1)*FL+1:n*FL); % 本帧语音%利用 filter函数重建语音exc1,zi_pre = filter(A,1,s_f,zi_pre); exc(n-1)*FL+1:n*FL) = exc1; %计算激励%利用 filter函数重建语音s_rec1,zi_rec = filter(1,A,exc1,zi_rec);s_rec(n-1)*FL+1:n*FL) = s_rec1; %重建语音% 下面只有得到exc 后才可以s_Pitch = exc(n*FL-222:n*FL);PT(n) =

22、 findpitch(s_Pitch); %计算基音周期ptG = sqrt(E*PT(n); %计算合成激励的能量G% tempn_syn = 1:n*FL-last_syn;% exc_syn1 = zeros(length(tempn_syn),1);% exc_syn1(mod(tempn_syn,PT)=0) = G; %某一段算出的脉冲% exc_syn1 = exc_syn1(n-1)*FL-last_syn+1:n*FL-last_syn);% s_syn1,zi_syn = filter(1,A,exc_syn1,zi_syn);% exc_syn(n-1)*FL+1:n*F

23、L)=exc_syn1; %计算得到合成激励% s_syn(n-1)*FL+1:n*FL) = s_syn1; %计算得到合成语音% last_syn = last_syn+PT*floor(n*FL-last_syn)/PT);PT1 =floor(PT(n)/2); %减小基音周期poles = roots(A);deltaOMG =100*2*pi/fs;for p=1:10 %增加共振峰ifimag(poles(p)0poles(p) = poles(p)*exp(1j*deltaOMG);elseifimag(poles(p)0 poles(p) = poles(p)*exp(-1j

24、*deltaOMG);endendendA1=poly(poles);tempn_syn_t=(1:n*FL-last_syn_t);exc_syn1_t = zeros(length(tempn_syn_t),1);exc_syn1_t(mod(tempn_syn_t,PT1)=0) = G; exc_syn1_t = exc_syn1_t(n-1)*FL-last_syn_t+1:n*FL-last_syn_t);s_syn1_t,zi_syn_t = filter(1,A1,exc_syn1_t,zi_syn_t);exc_syn_t(n-1)*FL+1:n*FL) = exc_syn1_t; %合成激励s_syn_t(n-1)*FL+1:n*FL) = s_syn1_t; %合成语音last_syn_t = last_syn_t+PT1*floor(n*FL-last_syn_t)/PT1);end%绘图handles.y=s_syn_t;guidata(hObject,handles);%绘图plot(handles.axes4,exc_syn_t)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。