MATLAB變聲器程式

2021-10-01 14:14:59 字數 2523 閱讀 3724

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...