
毕业论文-基于matlab算法的数字变声器说明书.docx
47页1基于 MATLAB 算法的数字变声器【摘要】变声器的原理是通过改变输入声音频率,进行改变声音的音色、音调,使输 出声音在感官上与原声音不同变声器是借助对声音音色和音调的双重复合改变,实现输 出声音的改变通过自己发声,共振峰频率的改变是基于重采样实现的同时用 LPC 倒谱 分析法分析共振峰的范围,通过 MATLAB 编写程序并构置 GUI 界面实验中通过 MATLAB 软 件对采集来的语言信号进行频谱分析,讨论不同人之间的噪音源参数和共振峰参数,通过 对不同人语言信号频率和幅度的改变来实现不同人之间的语音转换 【关键词】短时自相关法; LPC 倒谱; 语音信号; matlab GUI; 1 1引言引言 随着生活水平的提高,科技的不断进步,很多人为了娱乐,从而希望改变自己的声音; 还有如今的许多的访问节目为了保护被访问者,都对声音进行了相应的处理本设计通过 编写 matlab 程序,借助对声音音色和音调的双重复合改变,实现输出声音的改变 共振峰频率的改变是基于重采样实现的,从重采样原理知道,这也同时印发了基频的 变化,为保证基频变化和共振峰频率变化的独立、互不相关,在基频移动时必须考虑 抵消重采样带来的偏移,理论上只要基频检测足够精确,确实可以保证基频改变和共 振峰频率改变间的互不相关。
保证变声效果的自然度主要是没有采用基因检测将基因 移动和共振峰变化彻底隔离的缘故 本次课程设计就是运用我们所学到的理论知识,用 MATLAB 软件来实现对语音信号的变 声处理,理论联系实际,从而更好地掌握以及运用所学习的知识 2 2 数字变声器的原理与算法数字变声器的原理与算法 2.12.1基本原理基本原理 语音科学家将人类发声过程视作一个由声门源输送的气流经以声道、口、鼻腔组成的 滤波器调制而成的人类语音可分为有声语音和无声语音,前者是由声带振动激励的脉冲 信号经声腔调制变成不同的音,它是人类语言中元音的基础,声带振动的频率称为基频 无声语音则是声带保持开启状态,禁止振动引发的一般来说,由声门振动决定的基频跟 说话人的性别特征有关,如下表,而无声语音则没有体现这个特征说话人的个性化音色 和语音的另外一个声学参数——共振峰频率的分布有关儿童由于声道短,其共振峰频率 高于成年人,成年女性的声道一般短于成年男性,所以女性的共振峰频率一般高于男性 在进行性别变声时,主要考虑基音周期、基频和共振峰频率的变化其中男生、女生 和童声的基频、共振峰的关系如图1所示;基音周期改变时,基频、共振峰同时变化,若伸 展既有男变女、女变童,反之亦可。
本实验是基于打开一种声音进行相关参数提取,修改 接近于女声、男声或童声,实现声音的变换2.22.2 实现过程及算法实现过程及算法 采用线性预测参数合成法线性预测参数合成法利用 LPC 语音分析方法,通过分析自图 1 人群基频与共振峰的关系2然语音样本,计算出 LPC 系数,就可以建立信号产生模型,从而合成出语音大致流程如 图 2 所示2.2.12.2.1 基于短时自相关法的基音周期估值基于短时自相关法的基音周期估值 对语言信号进行低通滤波,然后进行自相关计算在低通滤波时,采用巴特沃斯滤波 器 根据人的说话特征设定相应指标参数,对本段语音设计算出巴特沃斯模拟滤波器的阶数 N 为 5,3dB 截止频率,,算出为 0.175,归一化低通原型系𝑐𝑐= (100.1𝑎𝑝- 1)- 12𝑛𝑐统函数为:G𝑎(𝑝) =1𝑝5+ 𝑏4𝑝4+ 𝑏3𝑝3+ 𝑏2𝑝2+ 𝑏1𝑝 + 𝑏0其中𝑏0= 1.0000,𝑏1= 3.2361,𝑏2= 5.2361,𝑏3= 5.2361,𝑏4= 3.2361将带人中,得到低通滤波器,𝑝 = 𝑠/𝑐G𝑎(𝑝)𝐻𝑠=Ω5𝑐𝑠5+ 𝑏4Ω2𝑐𝑠4+ 𝑏2Ω3𝑐𝑠2+ 𝑏1Ω4𝑐𝑠 + 𝑏0Ω5 𝑐根据设定的滤波器编写 matlab 程序,当信号经过低通滤波器后,对原始信号滤波产生 结果如下图 2 所示,低通滤波后,保留基音频率,然后再用 8kHz 采样频率进行采样,采样 序列为 x(n),然后进行下一步的自相关计算。
2.2.22.2.2 语音信号的短时自相关函数语音信号的短时自相关函数 定义语音信号自相关函数如下:图 3 原始信号低通滤波图 2 制作流程3𝑅𝑛(𝑘) =𝑛 = 𝑘 ‒ 𝑛 ‒ 1∑ 𝑛 = 0𝑥𝑛(𝑛)𝑥𝑛(𝑛 + 𝑘)其中 k 为信号延迟点数:为语音信号;N 为语音帧长度经过低通滤波之𝑥𝑛(𝑛)后,取 160 个样点数,帧长取 10ms,对每帧语音求短时自相关,取得自相关最 大点数,自相关函数在基音周期处表现为峰值,这些峰值点之间的间隔的平均 值就是基音周期2.2.32.2.3 LPCLPC 倒谱法提取共振峰倒谱法提取共振峰 通过线性预测分析得到合成滤波器的系统函数为𝐻(𝑍)=11 ‒𝑝∑ 𝑖 = 1𝑎𝑖𝑧‒ 𝑖其冲击响应为 h(n), 为预测系数然后求 h(n)的倒谱(n),首先根据同态分析方𝑎𝑖hˆ法,有(z)=logH(z),因为 H(z)是最小相位的,即在单位圆内是解析的,所以(z)可HˆHˆ以展开成级数形式,即Hˆ(z)=,也就是说Hˆ(z)的逆变换hˆ(n)是存在的,∑∞𝑛 = 1(n)𝑧- 𝑛hˆ设hˆ(n)=0,将等式两端分别对求导,得到:𝑧- 1=∑∞𝑛 = 1𝑛(n)𝑧‒ 𝑛 + 1 hˆ∑𝑝𝑖 = 1𝑖𝑧‒ 𝑖 + 11 ‒∑𝑝𝑖 = 1𝑎𝑖𝑧‒ 𝑖u 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 界面设计6guidata(hObject,handles);(2)原声function yuansheng_Callback(hObject, eventdata, handles)c=handles.Fs;sound(handles.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, 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 = 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,P); %线性预测计算预测系数7% 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) = 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*FL)=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.85*RopRop=R2;Top=T2;end9if R3>0.85*RopRop=R3;Top=T3;endPT=Top;return(3)女变男function 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;向负无穷方向% 预测和。
