語音信號處理基礎(八)——同態處理、倒譜、復倒譜

1.對短時過零率針對不同語音片段進行驗證

短時平均過零率表示一幀語音中語音信號波形穿過橫軸(零電平)的次數。

對於連續語音信號,過零即意味着時域波形通過時間軸;而對於離散信號,如果相鄰的取樣值改變符號,則稱爲過零。

短時平均過零率就是樣本數值改變符號的次數。

發音時聲帶不震動、送氣的叫清輔音

發音時聲帶震動、不送氣的叫濁輔音

在美國英語裏面,發清輔音的字母有:p、t、k、c、q、f、s(在詞首或詞中,前或後接清輔音),th(在實詞中)、sh、h、ch、tch、ts、tr、wh

分別讀入不同的語音文件進行分析

實現代碼

%短時平均過零率
clear all; clc; close all;

[xx,Fs]=audioread('C2_2_y.wav');% 讀入數據文件
x=xx-mean(xx);                    % 消除直流分量
wlen=200; inc=80;                 % 設置幀長、幀移
win=hanning(wlen);                % 窗函數
N=length(x);                      % 求數據長度
X=enframe(x,win,inc)';            % 分幀
fn=size(X,2);                     % 獲取幀數
zcr1=zeros(1,fn);                 % 初始化
for i=1:fn
    z=X(:,i);                     % 取得一幀數據
    for j=1: (wlen-1)             % 在一幀內尋找過零點
         if z(j)* z(j+1)< 0       % 判斷是否爲過零點
             zcr1(i)=zcr1(i)+1;   % 是過零點,記錄1次
         end
    end
end
time=(0:N-1)/Fs;                  % 計算時間座標
frameTime=frame2time(fn,wlen,inc,Fs);  % 求出每幀對應的時間
% 作圖
subplot 211; plot(time,x,'b'); grid;
title('語音波形');
ylabel('幅值'); xlabel(['時間/s' 10 '(a)']);
subplot 212; plot(frameTime,zcr1,'b'); grid;
title('短時平均過零率');
ylabel('過零率'); xlabel(['時間/s' 10 '(b)']);

運行結果
在這裏插入圖片描述
畫出語音“朝辭白帝彩雲間”的平均短時過零率

實現代碼

%短時平均過零率
clear all; clc; close all;

[xx,Fs]=audioread('C6_2_y.wav');% 讀入數據文件
x=xx-mean(xx);                    % 消除直流分量
wlen=200; inc=80;                 % 設置幀長、幀移
win=hanning(wlen);                % 窗函數
N=length(x);                      % 求數據長度
X=enframe(x,win,inc)';            % 分幀
fn=size(X,2);                     % 獲取幀數
zcr1=zeros(1,fn);                 % 初始化
for i=1:fn
    z=X(:,i);                     % 取得一幀數據
    for j=1: (wlen-1)             % 在一幀內尋找過零點
         if z(j)* z(j+1)< 0       % 判斷是否爲過零點
             zcr1(i)=zcr1(i)+1;   % 是過零點,記錄1次
         end
    end
end
time=(0:N-1)/Fs;                  % 計算時間座標
frameTime=frame2time(fn,wlen,inc,Fs);  % 求出每幀對應的時間
% 作圖
subplot 211; plot(time,x,'b'); grid;
title('語音波形');
ylabel('幅值'); xlabel(['時間/s' 10 '(a)']);
subplot 212; plot(frameTime,zcr1,'b'); grid;
title('短時平均過零率');
ylabel('過零率'); xlabel(['時間/s' 10 '(b)']);

運行結果
在這裏插入圖片描述

2.驗證窗函數

三種窗函數的主瓣寬度B和第一旁瓣衰減A在這裏插入圖片描述
主瓣寬度B爲幅值下降3dB時的寬度

△w是譜分析時的角頻率分辨率。從表中可看出,矩形窗主瓣的寬度最窄,但第一旁瓣的衰減最小。也就是說,它的頻譜泄漏要比另外兩種窗函數大。在語音分析中,可根據不同的情況選擇不同的窗函數。
在這裏插入圖片描述
實現代碼

%矩形窗的幅頻響應曲線, 窗長M=32
clc; close all;
w=linspace(-pi,pi,501); %linspace用於產生-pi,pi之間的501點行線性的矢量
% 窗長=32
M=51; n=0:M; 
x1=ones(1,length(n));         %矩形窗計算函數
X1=dtft(x1,n,w);              %求離散時間傅里葉變換
magX1=abs(X1);                %歸一化處理
magX1=magX1/max(magX1);
% 海寧窗的幅頻響應曲線
% M = 32
x2=0.5*(1-cos((2*pi*n)/(M-1)));      %海寧窗計算函數
X2=dtft(x2,n,w); 
magX2=abs(X2); 
magX2=magX2/max(magX2);
% 漢明窗的幅頻響應曲線
% M = 32
x3=0.54-0.46*cos((2*pi*n)/(M-1));
X3=dtft(x3,n,w); 
magX3=abs(X3); 
magX3=magX3/max(magX3);     %漢明窗計算函數
%畫矩形窗的幅頻響應
subplot(311)
plot(w/pi,20*log10(magX1)); 
axis([-1 1 -80 0]);
ylabel('|X|'); 
title(['矩形窗M=32的的幅頻響應']);
%畫漢明窗的幅頻響應
subplot(312)
plot(w/pi,20*log10(magX3)); 
axis([-1 1 -80 0]);
ylabel('|X|'); 
title(['漢明窗M = 32的幅頻響應']);
%畫海寧窗的幅頻響應
subplot(313)
plot(w/pi,20*log10(magX2)); 
axis([-1 1 -80 0]);
ylabel('|X|'); 
title(['海寧窗M = 32的幅頻響應']);


function [ X ] = dtft( x,n,w )
%  計算離散時間傅里葉變換
%   [X] = dtft(x,n,w)
%    X = DTFT values computed at w.frequencies
%    x = finite duration sequence over n
%    n = sample position vector
%    w = frequency location vector
X = x*exp(-1j*n'*w);%傅里葉變換
end

3.語音的同態處理、復倒譜、倒譜

同態處理
同態處理是一種設法將非線性問題轉化爲線性問題來進行處理的方法,它能將兩個通過乘法或卷積合成的信號分開。
語音信號x(n)可以看作是聲門激勵信號x1(n)和聲道衝激響應x2(n)的卷積,即
x(n)=x1(n)x2(n) x(n)=x_{1}(n) * x_{2}(n)
同態系統由兩個特徵子系統和一個線性子系統組成:

第一個子系統是將卷積性信號轉換爲加性信號的運算
{Z[x(n)]=Z[x1(n)x2(n)]=X1(z)X2(z)=X(z)lnX(z)=lnX1(z)+lnX2(z)=X^1(z)+X^1(z)=X^(z)Z1[X^(z)]=Z1[X^1(z)+X^2(z)]=x^1(n)+x^2(n)=x^(n) \left\{\begin{array}{l}{Z[x(n)]=Z\left[x_{1}(n) * x_{2}(n)\right]=X_{1}(z) \cdot X_{2}(z)=X(z)} \\ {\ln X(z)=\ln X_{1}(z)+\ln X_{2}(z)=\hat{X}_{1}(z)+\hat{X}_{1}(z)=\hat{X}(z)} \\ {Z^{-1}[\hat{X}(z)]=Z^{-1}\left[\hat{X}_{1}(z)+\hat{X}_{2}(z)\right]=\hat{x}_{1}(n)+\hat{x}_{2}(n)=\hat{x}(n)}\end{array}\right.
第二個子系統是對加性信號進行線性處理y^(n)

第三個子系統對x^(n)進行逆變換,使其恢復爲卷積性信號
Z[x(n)]=Z[x1(n)x2(n)]=X1(z)X2(z)=X(z)lnX(z)=lnX1(z)+lnX2(z)=X^1(z)+X^1(z)=X^(z)Z1[X^(z)]=Z1[X^1(z)+X^2(z)]=x^1(n)+x^2(n)=x^(n) \begin{array}{l}{Z[x(n)]=Z\left[x_{1}(n) * x_{2}(n)\right]=X_{1}(z) \cdot X_{2}(z)=X(z)} \\ {\ln X(z)=\ln X_{1}(z)+\ln X_{2}(z)=\hat{X}_{1}(z)+\hat{X}_{1}(z)=\hat{X}(z)} \\ {Z^{-1}[\hat{X}(z)]=Z^{-1}\left[\hat{X}_{1}(z)+\hat{X}_{2}(z)\right]=\hat{x}_{1}(n)+\hat{x}_{2}(n)=\hat{x}(n)}\end{array}

倒譜分析的目的

由於濁音信號的倒譜中存在峯值,出現位置等於該語音段的基音週期,而清音的倒譜中不存在峯值。由這個特性可以進行清音和濁音的判斷,並且可以估計濁音的基音週期。

復倒譜

X^(z)=lnX(z)X^(ejw)=lnX(ejw)=ln{X(ejw)ejarg[X(ejw)]}=lnX(ejw)+jarg[X(ejw)]x^(n)=12πππX^(ejw)ejwndw=12πππ{lnX(ejw)+jarg[X(ejw)]}ejwndw \begin{array}{c}{\hat{X}(z)=\ln X(z)} \\ {\hat{X}\left(e^{j w}\right)=\ln X\left(e^{j w}\right)=\ln \left\{\left|X\left(e^{j w}\right)\right| e^{j \arg \left[X\left(e^{j w}\right)\right]}\right\}=\ln \left|X\left(e^{j w}\right)\right|+\operatorname{jarg}\left[X\left(e^{j w}\right)\right]} \\ {\hat{x}(n)=\frac{1}{2 \pi} \int_{-\pi}^{\pi} \hat{X}\left(e^{j w}\right) e^{j w n} d w=\frac{1}{2 \pi} \int_{-\pi}^{\pi}\left\{\color{Red}\ln \left|X\left(e^{j w}\right)\right|+\operatorname{jarg}\left[X\left(e^{j w}\right)\right]\right\} e^{j w n} d w}\end{array}

$$
\hat{x}(n) 是{\color{Red}\hat{X}(e^{jw})}

的逆傅里葉變換,稱爲x(n)的復倒譜。
$$

倒譜

c(n)=12πππ{lnX(ejw)}ejwndw c(n)=\frac{1}{2 \pi} \int_{-\pi}^{\pi}\left\{\color{blue}\ln \left|X\left(e^{j w}\right)\right|\right\} e^{j w n} d w

xc(n)X^(ejw)x(n) xc(n)是{\color{Red}\hat{X}(e^{jw})}實部的逆傅里葉變換,稱爲x(n)的倒譜。

如果c1(n)和c2(n)分別是x1(n)和x2(n)的倒譜,並且x(n)=x1(n)*x2(n);那麼x(n)的倒譜爲c(n)=c1(n)+c2(n)。

與復倒譜不同的是,在倒譜情況下一個序列經過正逆兩個特徵系統變換後,不能還原成自身,因爲c(n)中只有幅值信息而無相位信息。儘管如此,但仍可用於語音信號分析中,因爲人們的聽覺對語音的感知特徵主要包含在幅度信息中,相位信息不起主要作用。

例 從sul.txt中讀入語音數據,信號的採樣頻率爲16 000 Hz,按式
c(n)=12πππ{lnX(ejw)}ejwndw c(n)=\frac{1}{2 \pi} \int_{-\pi}^{\pi}\left\{\color{blue}\ln \left|X\left(e^{j w}\right)\right|\right\} e^{j w n} d w
計算信號的倒譜,並從中把語音的聲門激勵信號和聲道衝激響應分離,分別得到聲門激勵信號的頻譜和聲道衝激響應的頻譜。

實現代碼

%倒譜分析
clear all; clc; close all;
y=load('su1.txt');                            % 讀入數據
fs=16000; nfft=1024;                          % 採樣頻率和FFT的長度

time=(0:nfft-1)/fs;                           % 時間刻度
%disp(time);
figure(1), subplot 211; plot(time,y,'k');     % 畫出信號波形
title('信號波形'); 
axis([0 max(time) -0.7 0.7]);
ylabel('幅值'); xlabel(['時間/s' 10 '(a)']); grid;

figure(2)
nn=1:nfft/2; ff=(nn-1)*fs/nfft;               % 計算頻率刻度
%disp(ff);
Y=log(abs(fft(y)));                           % 按公式取實數部分
subplot 211; plot(ff,Y(nn),'k'); hold on;     % 畫出信號的頻譜圖
z=ifft(Y);                                    % 按公式求取倒譜

figure(1),subplot 212; plot(time,z,'k');     % 畫出倒譜圖
title('信號倒譜圖'); 
axis([0 time(512) -0.2 0.2]); grid; 
ylabel('幅值'); xlabel(['倒頻率/s' 10 '(b)']);
mcep=29;     % 分離聲門激勵脈衝和聲道衝激響應,認爲基音頻率都應低於500HZ,爲了留有餘量,550hz
% mcep取16000/550=29,即在倒譜域中第29條譜線之前是反映了包絡的係數。

zy=z(1:mcep+1); % 0~29(mcep)區間構成聲道衝激響應的倒譜序列
zy=[zy' zeros(1,nfft-2*mcep-1) zy(end:-1:2)']; % 構建聲道衝激響應的倒譜序列(預加重)
%預加重目的是爲了更好的分析聲道,去掉激勵模型和輻射模型的影響

ZY=fft(zy);                                   % 計算聲道衝激響應的頻譜
figure(2)                                    % 畫出聲道衝激響應的頻譜,用灰線表示
line(ff,real(ZY(nn)),'color',[.6 .6 .6],'linewidth',3);
grid; hold off; ylim([-4 5]);
title('信號頻譜(黑線)和聲道衝激響頻譜(灰線)')
ylabel('幅值'); xlabel(['頻率/Hz' 10 '(a)']); 
ft=[zeros(1,mcep+1) z(mcep+2:end-mcep)' zeros(1,mcep)]; % 構建聲門激勵脈衝的倒譜序列(預加重)
FT=fft(ft);                                  % 計算聲門激勵脈衝的頻譜
figure(2)
subplot 212; plot(ff,real(FT(nn)),'k'); grid;% 畫出聲門激勵脈衝的頻譜
title('聲門激勵脈衝頻譜')
ylabel('幅值'); xlabel(['頻率/Hz' 10 '(b)']); 

運行結果
在這裏插入圖片描述

圖一
在這裏插入圖片描述
​ 圖二

經過倒譜分析後,把聲門激勵脈衝和聲道衝激響應分離。它們在倒譜中處於不同的倒頻區間,我們以倒譜中第29條譜線爲界,0~29區間構成聲道衝激響應的倒譜序列;用該倒譜序列通過傅里葉逆變換,就可得到圖二(a)中灰線所示的聲道衝激響應的頻譜,在灰線的頻譜圖上可清楚地看出共振峯的信息。而在倒譜圖中的30~512區間構成聲門激勵脈衝的倒譜序列,通過傅里葉逆變換,就可得到圖二(b)中聲門激勵脈衝的頻譜圖,從圖中可以方便地獲取基頻的信息

利用倒譜分離語音中的聲門激勵信號聲道衝激響應序列的信息,從而可得共振峯;

利用復倒譜消除語音中的混響回聲,則對語音信號進行增強

mcep=29;     % 分離聲門激勵脈衝和聲道衝激響應,
% mcep取16000/550=29.09,即在倒譜域中第29條譜線之前是反映了包絡的係數。
zy=[zy' zeros(1,nfft-2*mcep-1) zy(end:-1:2)']; % 構建聲道衝激響應的倒譜序列(預加重)
%預加重目的是爲了更好的分析聲道,去掉激勵模型和輻射模型的影響
ft=[zeros(1,mcep+1) z(mcep+2:end-mcep)' zeros(1,mcep)]; % 構建聲門激勵脈衝的倒譜序列(預加重)

在這個例子中,採樣頻率爲16000HZ,認爲基音頻率都應低於500HZ,爲了留有餘量,取16000/550=29,即在倒譜域中第29條譜線之前是反映了包絡的係數。所以取29就是這樣得來的。
信號模型可看成激勵模型、聲道模型、輻射模型的串聯。預加重目的是爲了更好的分析聲道,去掉激勵模型和輻射模型的影響。激勵模型是一個二階的低通模型,輻射模型是一階高通模型,所以再增加一個預加重,增加加一個一階高通,以平衡激勵模型和輻射模型的影響。
倒譜中橫座標不是頻率,而是倒頻率(quefrency,量綱是時間),它的刻度同時間序列中x對應的刻度相同,在FFT(x)以後包絡的起伏比較緩,就是它的倒頻率低。倒頻譜中的橫軸也反映了在採樣頻率16000下不同頻率的週期,550Hz的週期爲29,即第29條譜線。在大於第29條譜線以後的譜線,對應的信號分量的頻率都要小於550Hz,即在基頻的區間中。在倒頻率範 圍中我們取小於550Hz的倒頻譜來求包絡。

倒譜圖形分析

包絡(聲道衝擊響應)是倒譜的低頻部分,聲門激勵信號是倒譜的高頻。

參考:https://blog.csdn.net/zouxy09/article/details/9156785

下面是一個語音的頻譜圖。峯值就表示語音的主要頻率成分,我們把這些峯值稱爲共振峯(formants),而共振峯就是攜帶了聲音的辨識屬性(就是個人身份證一樣)。所以它特別重要。用它就可以識別不同的聲音。

img

既然它那麼重要,那我們就是需要把它提取出來!我們要提取的不僅僅是共振峯的位置,還得提取它們轉變的過程。所以我們提取的是頻譜的包絡(Spectral Envelope)。這包絡就是一條連接這些共振峯點的平滑曲線。

img

我們可以這麼理解,將原始的頻譜由兩部分組成:包絡和頻譜的細節。這裏用到的是對數頻譜,所以單位是dB。那現在我們需要把這兩部分分離開,這樣我們就可以得到包絡了。

img

那怎麼把他們分離開呢?也就是,怎麼在給定log X[k]的基礎上,求得log H[k] 和 log E[k]以滿足log X[k] = log H[k] + log E[k]呢?

爲了達到這個目標,我們需要Play a Mathematical Trick。這個Trick是什麼呢?就是對頻譜做FFT。在頻譜上做傅里葉變換就相當於逆傅里葉變換Inverse FFT (IFFT)。需要注意的一點是,我們是在頻譜的對數域上面處理的,這也屬於Trick的一部分。這時候,在對數頻譜上面做IFFT就相當於在一個僞頻率(pseudo-frequency)座標軸上面描述信號。

img

由上面這個圖我們可以看到,包絡是主要是低頻成分(這時候需要轉變思維,這時候的橫軸就不要看成是頻率了,咱們可以看成時間),我們把它看成是一個每秒4個週期的正弦信號。這樣我們在僞座標軸上面的4Hz的地方給它一個峯值。而頻譜的細節部分主要是高頻。我們把它看成是一個每秒100個週期的正弦信號。這樣我們在僞座標軸上面的100Hz的地方給它一個峯值。

把它倆疊加起來就是原來的頻譜信號了。

img

在實際中咱們已經知道log X[k],所以我們可以得到了x[k]。那麼由圖可以知道,h[k]是x[k]的低頻部分,那麼我們將x[k]通過一個低通濾波器就可以得到h[k]了!沒錯,到這裏咱們就可以將它們分離開了,得到了我們想要的h[k],也就是頻譜的包絡。

x[k]實際上就是倒譜Cepstrum(這個是一個新造出來的詞,把頻譜的單詞spectrum的前面四個字母順序倒過來就是倒譜的單詞了)。而我們所關心的h[k]就是倒譜的低頻部分。h[k]描述了頻譜的包絡,它在語音識別中被廣泛用於描述特徵。

那現在總結下倒譜分析,它實際上是這樣一個過程:

1)將原語音信號經過傅里葉變換得到頻譜:X[k]=H[k]E[k];

只考慮幅度就是:|X[k] |=|H[k]||E[k] |;

2)我們在兩邊取對數:log||X[k] ||= log ||H[k] ||+ log ||E[k] ||。

3)再在兩邊取逆傅里葉變換得到:x[k]=h[k]+e[k]。

這實際上有個專業的名字叫做同態信號處理。它的目的是將非線性問題轉化爲線性問題的處理方法。對應上面,原來的語音信號實際上是一個卷性信號(聲道相當於一個線性時不變系統,聲音的產生可以理解爲一個激勵通過這個系統),第一步通過卷積將其變成了乘性信號(時域的卷積相當於頻域的乘積)。第二步通過取對數將乘性信號轉化爲加性信號,第三步進行逆變換,使其恢復爲卷性信號。這時候,雖然前後均是時域序列,但它們所處的離散時域顯然不同,所以後者稱爲倒譜頻域。

**總結:**倒譜(cepstrum)就是一種信號的傅里葉變換經對數運算後再進行傅里葉反變換得到的譜。它的計算過程如下:

img

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章