clear;clc;
[s,fs,] = audioread(『61.m4a』); % 載入語音s
s(1:3000)=s(1:3000)+randn(3000,1)*eps;
s = s/max(s); %歸一化
l = length(s); % 讀入語音長度
figure(1);
subplot(211);plot(s);title(『原始語音頻號波形』)
subplot(212);plot(abs(s));title(『原始語音頻號頻譜』)
sound(s,fs)
%定義常數
fl = 80; % 幀長
wl = 240; % 窗長
% p = 10; % **係數個數
fn = floor(l/fl)-2; % 計算幀數
% **和重建濾波器
exc = zeros(l,1); % 激勵訊號(**誤差)
zi_pre = [0;0;0;0;0;0;0;0;0;0]; % **濾波器的狀態
s_rec = zeros(l,1); % 重建語音
zi_rec = [0;0;0;0;0;0;0;0;0;0];
%變調不變速濾波器
exc_syn_t = zeros(l,1); % 合成的激勵訊號(脈衝串)
s_syn_t = zeros(l,1); % 合成語音
last_syn_t = 0; %儲存上乙個(或多個)段的最後乙個脈衝的下標
zi_syn_t = zeros(10,1); % 合成濾波器的狀態
hw = hamming(wl); % 漢明窗
% 依次處理每幀語音
for n = 3:fn
s_w = s(nfl-wl+1:nfl).hw; %漢明窗加權後的語音
[a,e] = lpc(s_w,10); %用線性**法計算p個**係數
% a是**係數,e會被用來計算合成激勵的能量
s_f = s((n-1)fl+1:nfl); % 本幀語音,下面就要對它做處理
% (4) 用filter函式s_f計算激勵,注意保持濾波器狀態
[exc1,zi_pre] = filter(a,1,s_f,zi_pre);
exc((n-1)fl+1:nfl) = exc1; %計算得到的激勵
% (5) 用filter函式和exc重建語音,注意保持濾波器狀態
[s_rec1,zi_rec] = filter(1,a,exc1,zi_rec);
s_rec((n-1)fl+1:nfl) = s_rec1; %計算得到的重建語音
% 注意下面只有在得到exc後才會計算正確
s_pitch = exc(nfl-222:nfl);
pt = findpitch(s_pitch); % 計算基音週期pt
g = sqrt(ept); % 計算合成激勵的能量g
% (13) 將基音週期減小一半,將共振峰頻率增加7000hz,重新合成語音(男聲變童聲)
pt1 =floor(pt/2); %減小基音週期
poles = roots(a);
deltaomg =0.0052pi/fs;
for p=1:10 %增加共振峰頻率,實軸上方的極點逆時針轉,下方順時針轉
if imag(poles§)>0 poles§ = poles§exp(1ideltaomg);
elseif imag(poles§)<0 poles§ = poles§exp(-1ideltaomg);
endend
a1=poly(poles);
tempn_syn_t = [1:nfl-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:nfl-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:nfl) = exc_syn1_t; %計算得到的合成激勵
s_syn_t((n-1)fl+1:nfl) = s_syn1_t; %計算得到的合成語音
last_syn_t = last_syn_t+pt1floor((n*fl-last_syn_t)/pt1);
endfigure;
subpot(211),plot(exc_syn_t),xlabel(『n(samples)』);ylabel(『amplitude』),title(『合成高調激勵訊號』);
xlim([0,length(exc_syn_t)]);
subplot(212);plot(abs(s));title(『合成高調語音頻號頻譜』);
xlim([0,length(exc_syn_t)]);
sound(s_syn_t);
注:語音最好把開頭沒用的裁剪一下,要不然會出錯。
有趣的變聲器效果(二)
變聲器軟體在網路 遊戲 等領域中被廣泛使用,其原理是通過改變聲音輸入的頻率來改變聲音的音調和音色,從而產生不一樣的輸出效果。變聲器不僅只是改變音色,甚至可以模仿不同性別和年齡的聲音,本文將通過一些生動的例子對這些神奇的變聲器效果進行說明演示。例項組 人聲變機器聲。工具 audition 和 vst ...
Matlab 編輯器和程式除錯
區別 命令檔案沒有輸入,沒有返回 命令檔案可以對工作空間的變數進行操作,結果返回工作空間,而函式檔案中的變數為區域性變數,函式執行結束,變數被清除 命令檔案可以直接執行,函式檔案需要呼叫的形式執行。function 輸出形參 函式名 輸入形參 注釋說明 函式體 表示內容可以省略 通常函式檔名和函式名...
matlab 程式除錯
在程式除錯時,程式執行中變數的值是乙個重要的線索。因此,檢視變數值是程式除錯的重要線索,由於在函式呼叫時只返回最後的輸出引數,而不返回中間變數,因此,可以選擇下面的方法檢視程式執行中的變數值。1 通過分析,將可能出錯的語句後面的分號刪除,將結果顯示在命令視窗中,與預期值進行比較。2 利用函式disp...