資源簡介
教學用語音分析、預測、重建、變調不變速,變速不變調程序,有注釋,可以用于學習
代碼片段和文件信息
function?speechproc()
clear?allclose?all?clc;
????%?定義常數
????FL?=?80;????????????????%?幀長
????WL?=?240;???????????????%?窗長
????P?=?10;?????????????????%?預測系數個數
????s?=?readspeech(‘voice.pcm‘100000);?????????????%?載入語音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(不要求掌握)
????????
????????%?(10)?生成合成激勵,并用激勵和filter函數產生合成語音
%?方法1:本段激勵可以向右超出段長一個基音周期
%? tempn_syn?=?[1:n*FL-last_syn+PT-1]‘;
%? exc_syn1?=?zeros(length(tempn_syn)1);
%? exc_syn1(mod(tempn_synPT)==0)?=?G;?%某一段算出的脈沖
%? [s_syn1zi_syn]?=?filter(1Aexc_syn1zi_syn);
%? exc_syn(last_syn+1:last_syn+length(tempn_syn))?=?exc_syn1;
%? s_syn(last_syn+1:last_syn+length(tempn_syn))?=?s_syn1;
%? last_syn?=?last_syn+PT*floor(length(tempn_syn)/PT);
???????
%方法2:本段激勵可以向左侵占前面一段
%? tempn_syn?=?[1:n*FL-last_syn]‘;
%? exc_syn1?=?zeros(length(tempn_syn)1);
%? exc_syn1(mod(tempn_synPT)==0)?=?G;?%某一段算出的脈沖
%? [s_syn1zi_syn]?=?filter(1Aexc_syn1zi_syn);
%? exc_syn(last_syn+1:n*FL)?=?exc_syn1;
%? s_syn(last_syn+1:n*FL)?=?s_syn1;
%? last_syn?=?last_syn+PT*floor((n*FL-last_syn)/PT);
%方法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(
評論
共有 條評論