語音信號處理基礎(七)——短時頻域分析

原理

1.短時傅里葉變換

短時傅里葉分析(Short Time Fourier Analysis,STFA)適用於分析緩慢時變信號的頻譜分析,在語音分析處理中已經得到廣泛應用。其方法是先將語音信號分幀,再將各幀進行傅里葉變換。每一幀語音信號可以被認爲是從各個不同的平穩信號波形中截取出來的,各幀語音的短時頻譜就是各個平穩信號波形頻譜的近似。

由於語音信號是短時平穩的,因此可以對語音進行分幀處理,計算某一幀的傅里葉變換,這樣得到的就是短時傅里葉變換。其定義爲
Xn(ejω)=m=x(m)w(nm)ejωm X_{n}\left(\mathrm{e}^{\mathrm{j} \omega}\right)=\sum_{m=-\infty}^{\infty} x(m) w(n-m) \mathrm{e}^{-\mathrm{j} \omega m}
式中,x(n)爲語音信號序列;w(n)爲實數窗序列,n取不同值時,窗w(n-m)沿時間軸滑動到不同的位置,取出不同的語音幀進行傅里葉變換。
顯然,短時傅里葉變換是時間n和角頻率w的函數,它反映了語音信號的頻譜隨時間變化的特性.

在這裏插入圖片描述

短時傅里葉變換有兩種不同的解釋:

一種是當n固定不變,X,(e)爲序列w(n一m)x(m)(-∞<m<∞)的標準傅里葉變換,此時X,(ejw)具有與標準傅里葉變換相同的性質;

另一種是當w固定不變,可以將Xn(ejw)視爲信號x(n)與窗函數指數加權w(n)e(jwn)的卷積,此時可以把短時傅里葉變換看做線性濾波
Xn(eiω)=m=w(m)x(nm)ejω(nm)=ejωn[[w(n)ejωn]x(n)] \begin{aligned} X_{n}\left(\mathrm{e}^{\mathrm{i} \omega}\right) &=\sum_{m=-\infty}^{\infty} w(m) x(n-m) \mathrm{e}^{-\mathrm{j} \omega(n-m)} \\ &=\mathrm{e}^{-\mathrm{j} \omega n}\left[[w(n)\mathrm{e}^{\mathrm{j} \omega n}\right] * x(n)]\end{aligned}
雖然嚴格說語音的傅里葉變換並不存在,但是語音加窗後相當於突出了n附近的語音波形而對其他部分加以削弱,當m處於窗函數的有限區間以外時,w(n-m)=0。這樣,可以有理由假定窗內的語音特性能夠延伸到窗外。比如語音爲濁音時,可以認爲w(n-m)x(m)序列是從週期性持續的濁音中選出來的;當窗內的語音爲清音時,也可以假定窗外也存在同樣特性的清音;當語音爲爆破音等暫態語音時,還可以直接假定窗外的信號爲零。

由於Xn(ejw)相當於信號譜X(ejw)與窗函數譜的卷積,因此應該使窗函數的頻譜分辨率高,主瓣尖銳;同時還要使旁瓣衰減大,這樣與信號卷積時的頻譜泄漏纔會少。

①矩形窗、海寧窗和漢明窗的主瓣狹窄且旁瓣衰減較大,具有低通的性質。主瓣的寬度與u成正比,w與窗長成反比,所以窗越長主瓣越窄,加窗後的頻譜能夠更好地逼近短時語音的頻譜。
②窗長越長,頻譜分辨率越高,但由於長窗的時間平均作用導致時間分辨率相應下降。
例如,共振峯在不同的基音週期是要發生變化的,但如果使用較長的窗,則會模糊這種變化。
③窗長越短,時間分辨率越高,但頻率分辨率相應降低。例如,採用短窗可以清楚地觀察到共振峯在不同基音週期的變化情況,但基頻以及諧波的精細結構在短時頻譜圖上消失了。
④由於時間分辨率頻率分辨率的相互矛盾關係,在進行短時傅里葉變換時,應根據分析的目的來折中選擇窗長。

2.語譜圖表示與實現方法

語譜儀是把語音的電信號送人一組頻率依次相接的窄帶濾波器中,各個窄帶濾波器的輸出經整流均方後按頻率由低到高的順序記錄在一卷記錄紙上。信號的強弱由記錄在紙上的灰度來表示。如果某個濾波器輸出的信號強,相應的記錄將濃黑;反之,則淺淡一些。記錄紙按照一定的速度旋轉,相當於按不同的時間記錄了相應的濾波器輸出。由此得到的圖形就是語音信號的語譜圖,其水平方向是時間軸,垂直方向是頻率軸,圖上的灰度條紋代表各個時刻的語音短時譜。語譜圖反映了語音信號的動態頻譜特性,被稱爲可視語音

例:畫出了一段女聲“我,到,北,京,去”的語譜圖(使用海寧窗函數)。

實現代碼

%畫出一段語音信號的語譜圖
clear all; clc; close all;

[x,Fs]=audioread('C2_2_y.wav');     % 讀入數據文件
wlen=200; inc=80; win=hanning(wlen);% 設置幀長,幀移和窗函數
N=length(x); time=(0:N-1)/Fs;       % 計算時間
y=enframe(x,win,inc)';              % 分幀
fn=size(y,2);                       % 幀數
frameTime=(((1:fn)-1)*inc+wlen/2)/Fs; % 計算每幀對應的時間
W2=wlen/2+1; n2=1:W2;
freq=(n2-1)*Fs/wlen;                % 計算FFT後的頻率刻度
Y=fft(y);                           % 短時傅里葉變換

clf                                 % 初始化圖形

% 畫出語音信號的波形  
axes('Position',[0.07 0.72 0.9 0.22]);
plot(time,x,'b');
xlim([0 max(time)]);
xlabel('時間/s'); ylabel('幅值');
title('語音信號波形');

% 畫出語譜圖      
set(gcf,'Position',[20 100 600 500]);            
axes('Position',[0.1 0.1 0.85 0.5]);  
imagesc(frameTime,freq,abs(Y(n2,:))); % 畫出Y的圖像  
axis xy; ylabel('頻率/Hz');xlabel('時間/s');
title('語譜圖');

%設置語譜圖的顏色參數
m = 64;
LightYellow = [0.6 0.6 0.6];
MidRed = [0 0 0];
Black = [0.5 0.7 1];
Colors = [LightYellow; MidRed; Black];
%色圖表,由m*3組成的矩陣,
%它的每一行是RGB三元組。輸出變量cm是色圖,
%直接放在colormap函數中就定義了MATLAB中每個圖形窗的着色圖按cm定製
colormap(SpecColorMap(m,Colors));

①語音信號是實數,在FFT後的頻譜是滿足共軛對稱的,在畫頻譜時只需取FFT時nfft長的一半就可以了.在程序中FFT的長度就是幀長,所以有

w2-wlen/2+1;n2=1:W2;

freg=(n2-1)\*Es/wlen;   %計算FET後的頻率刻度

imagesc(frameTime,freq,abs(Y(n2,:)));%畫出Y的圖像

計算頻率刻度和畫頻譜圖都只取幀長的一半.
@在程序中調用了SpecColorMap函數,它是一個設置繪製譜圖彩色板的函數。

運行結果
在這裏插入圖片描述
如果需要觀察語音諧波的細節,則需要提高語譜圖的頻率分辨率也就是減小窗函數的帶通寬度。由於帶通寬度是與窗長成反比的,因此提高頻率分辨率必須要增加窗長。這種情況下得到的語譜圖稱爲窄帶語譜圖。

例:畫出了一段女聲“我,到,北,京,去”在不同帶寬情況下的語譜圖(使用海寧窗函數)。

實現代碼

%畫出一段語音信號在不同帶寬下,也就是在不同的窗長下的語譜圖
clear all; clc; close all;

[x,Fs]=audioread('C2_2_y.wav');     % 讀入數據文件
wlen=128; inc=32; win=hanning(wlen);% 設置幀長,幀移和窗函數
N=length(x); time=(0:N-1)/Fs;       % 計算時間
y=enframe(x,win,inc)';              % 分幀
fn=size(y,2);                       % 幀數
frameTime=(((1:fn)-1)*inc+wlen/2)/Fs; % 計算每幀對應的時間
W=wlen/2+1; n=1:W;
freq=(n-1)*Fs/wlen;                 % 計算FFT後的頻率刻度
Y=fft(y);                           % 短時傅里葉變換
%改變窗長
wlen1=256; inc1=64; win1=hanning(wlen1);% 設置幀長,幀移和窗函數,窗長爲400
N=length(x); time=(0:N-1)/Fs;            % 計算時間
y1=enframe(x,win1,inc1)';                % 分幀
fn1=size(y1,2);                          % 幀數
frameTime1=(((1:fn1)-1)*inc1+wlen1/2)/Fs; % 計算每幀對應的時間
W1=wlen1/2+1; n1=1:W1;
freq1=(n1-1)*Fs/wlen1;                % 計算FFT後的頻率刻度
Y1=fft(y1);                           % 短時傅里葉變換
%改變窗長
wlen2=512; inc2=128; win2=hanning(wlen2);% 設置幀長,幀移和窗函數
N=length(x); time=(0:N-1)/Fs;         % 計算時間
y2=enframe(x,win2,inc2)';              % 分幀
fn2=size(y2,2);                       % 幀數
frameTime2=(((1:fn2)-1)*inc2+wlen2/2)/Fs; % 計算每幀對應的時間
W2=wlen2/2+1; n2=1:W2;
freq2=(n2-1)*Fs/wlen2;                % 計算FFT後的頻率刻度
Y2=fft(y2);                           % 短時傅里葉變換

clf                                 % 初始化圖形

% Plot the STFT result              % 畫出語譜圖
subplot(311)
imagesc(frameTime,freq,abs(Y(n,:))); % 畫出Y的圖像  
axis xy; ylabel('頻率/Hz');xlabel('時間/s');
title('語譜圖a');
subplot(312)
imagesc(frameTime1,freq1,abs(Y1(n1,:))); % 畫出Y的圖像  
axis xy; ylabel('頻率/Hz');xlabel('時間/s');
title('語譜圖b');
subplot(313)
imagesc(frameTime2,freq2,abs(Y2(n2,:))); % 畫出Y的圖像  
axis xy; ylabel('頻率/Hz');xlabel('時間/s');
title('語譜圖c');

運行結果
在這裏插入圖片描述
由於寬帶語譜圖可以獲得較高的時間分辨率,反映頻譜的快速時變過程;而窄帶語譜圖可以獲得較高的頻率分辨率,反映頻譜的精細結構。兩者相結合,可以提供大量與語音特性有關的信息。語譜圖上因其不同的灰度,形成不同的紋路,稱之爲“聲紋”。聲紋因人而異,因此可以在司法、安全等場合得到應用。

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