資源簡介
用matlab做的變調不變速語言處理程序源碼

代碼片段和文件信息
%
%?ct1
clear?allclose?all?clc;
????%?定義常數
????FL?=?80;????????????????%?幀長
????WL?=?240;???????????????%?窗長
????P?=?10;?????????????????%?預測系數個數
????[sfs]?=?wavread(‘sunday_2.wav‘);?????????????%?載入語音s
s?=?s/max(s); %歸一化
????L?=?length(s);??????????%?讀入語音長度
????FN?=?floor(L/FL)-2;?????%?計算幀數
????
%?預測和重建濾波器
????exc?=?zeros(L1);???????%?激勵信號(預測誤差)
????zi_pre?=?zeros(P1);????%?預測濾波器的狀態
????s_rec?=?zeros(L1);?????%?重建語音
????zi_rec?=?zeros(P1);
????
%?合成濾波器
????exc_syn?=?zeros(L1);???%?合成的激勵信號(脈沖串)
????s_syn?=?zeros(L1);?????%?合成語音
last_syn?=?0;???%存儲上一個(或多個)段的最后一個脈沖的下標
zi_syn?=?zeros(P1);???%?合成濾波器的狀態
????
%?變調不變速濾波器
????exc_syn_t?=?zeros(L1);???%?合成的激勵信號(脈沖串)
????s_syn_t?=?zeros(L1);?????%?合成語音
last_syn_t?=?0;???%存儲上一個(或多個)段的最后一個脈沖的下標
zi_syn_t?=?zeros(P1);???%?合成濾波器的狀態
????
%?變速不變調濾波器(假設速度減慢一倍)
v=.5;
????exc_syn_v?=?zeros(v\L1);???%?合成的激勵信號(脈沖串)
????s_syn_v?=?zeros(v\L1);?????%?合成語音
last_syn_v?=?0;???%存儲上一個(或多個)段的最后一個脈沖的下標
zi_syn_v?=?zeros(P1);???%?合成濾波器的狀態
????hw?=?hamming(WL);???????%?漢明窗
????
????%?依次處理每幀語音
????for?n?=?3:FN
????????%?計算預測系數(不需要掌握)
????????s_w?=?s(n*FL-WL+1:n*FL).*hw;????%漢明窗加權后的語音
????????[A?E]?=?lpc(s_w?P);????????????%用線性預測法計算P個預測系數
????????????????????????????????????????%?A是預測系數,E會被用來計算合成激勵的能量
????????if?n?==?27
????????%?(3)?觀察預測系統的零極點圖
????????????zplane(1A);
????????end
????????
????????s_f?=?s((n-1)*FL+1:n*FL);???????%?本幀語音,下面就要對它做處理
????????%?(4)?用filter函數s_f計算激勵,注意保持濾波器狀態
[exc1zi_pre]?=?filter(A1s_fzi_pre);
????????
????????exc((n-1)*FL+1:n*FL)?=?exc1;?%計算得到的激勵
????????%?(5)?用filter函數和exc重建語音,注意保持濾波器狀態
[s_rec1zi_rec]?=?filter(1Aexc1zi_rec);
????????
????????s_rec((n-1)*FL+1:n*FL)?=?s_rec1;?%計算得到的重建語音
????????%?注意下面只有在得到exc后才會計算正確
????????s_Pitch?=?exc(n*FL-222:n*FL);
????????PT?=?findpitch(s_Pitch);????%?計算基音周期PT(不要求掌握)
????????G?=?sqrt(E*PT);???????????%?計算合成激勵的能量G(不要求掌握)
????????
%方法3:本段激勵只能修改本段長度
tempn_syn?=?[1:n*FL-last_syn]‘;
exc_syn1?=?zeros(length(tempn_syn)1);
exc_syn1(mod(tempn_synPT)==0)?=?G;?%某一段算出的脈沖
exc_syn1?=?exc_syn1((n-1)*FL-last_syn+1:n*FL-last_syn);
[s_syn1zi_syn]?=?filter(1Aexc_syn1zi_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);
?
????????%?(11)?不改變基音周期和預測系數,將合成激勵的長度增加一倍,再作為filter
????????%?的輸入得到新的合成語音,聽一聽是不是速度變慢了,但音調沒有變。
FL_v?=?floor(FL/v);
tempn_syn_v?=?[1:n*FL_v-last_syn_v]‘;
exc_syn1_v?=?zeros(length(tempn_syn_v)1);
exc_syn1_v(mod(tempn_syn_vPT)==0)?=?G;?%某一段算出的脈沖
exc_syn1_v?=?exc_syn1_v((n-1)*FL_v-last_syn_v+1:n*FL_v-last_syn_v);
[s_syn1_vzi_syn_v]?=?filter(1Aexc_syn1_vzi_syn_v);
????? last_syn_v?=?last_syn_v+PT*floor((n*FL_v-last_syn_v)/PT);???
????????exc_syn_v((n-1)*FL_v+1:n*FL_v)?=exc_syn1_v;??%計算得到的加長合成激勵
????????s_syn_v((n-1)*FL_v+1:n*FL_v)?=?s_syn1_v;???%計算得到的加長合成語音
????????
????????%?(13)?將基音周期減小一半,將共振峰頻率增加150Hz,重新合成語音,聽聽是啥感受~
PT1?=floor(PT/2);???%減小基音周期
????????poles?=?roots(A);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????6405??2010-10-23?20:14??ct1.m
?????文件?????????563??2010-10-23?20:04??findpitch.m
?????文件???????16044??2009-05-04?10:18??sunday_2.wav
評論
共有 條評論