梅爾倒譜系數
MFCC
梅爾頻率倒譜系數的分析是基于人的聽覺特性機理,即根據人的聽覺實驗結果來分析語音的頻譜。因為人耳所能聽到的聲音高低與聲音的頻率并不成線性正比關系,是以用mel頻率尺度更符合人耳的聽覺特性。

預加重部分用一個一階高通濾波器,目的是為了補償高頻分量的損失,提升高頻分量。濾波器常設為:
分幀:把每一幀信号當作穩定信号來處理。
加窗:減少頻譜洩漏。
FFT:把時域轉化為頻域,計算譜線能量。
mel濾波:
MEL濾波器濾波:
梅爾頻率尺度和實際頻率的對應關系
美爾濾波器的傳遞函數
在梅爾頻率下,每個濾波器直接的間隔梅爾濾波是一樣的,實際頻率不一樣。
構造梅爾濾波器組
**設計梅爾濾波器思路:**自己的了解,不一定對。
(1)确定要設計濾波器的個數p,最高頻率fh,最低頻率fl,fft采樣點數。
(2)将最高頻率,最低頻率轉化為梅爾頻率尺度bl,bh.
(3)在梅爾尺度中,從0到(bh-bl)分為p+1段,一共有p+2個點。
(4)将得到的p+2個點轉化為實際頻率。
(5)計算實際頻率對應的fft點數,2-p+1個點為每個濾波器的中心頻率。
(6)根據fft點數,和梅爾濾波器傳遞函數H(k)畫出三角窗。
clc;
clear;
%Mel濾波
fs = 8000; %采樣頻率
fl = 0; %fl是設計濾波器的最低頻率
fh = fs / 2; %fh是設計濾波器的最高頻率
bl = 1125 * log(1 + fl/700); %最低頻率對應的Mel頻率
bh = 1125 * log(1 + fh/700); %最高頻率對應的Mel頻率
p = 24; %在fl和fh之間設計Mel濾波器的個數
N = 256; %FFT點數,N越大,頻率分辨率越高,誤差越小
MelF = linspace(0, bh-bl, p+2); %在0至bh-bl的Mel頻率範圍内産生p+2個Mel頻率值
F = 700 * (exp(MelF/1125) - 1); %将上一步産生的p+2個Mel頻率值轉化為p+2個實際頻率值
df = fs / N; %計算頻率分辨率
n = N/2 + 1; %計算fs/2内對應的FFT點數
f = (0:n-1) * df; %計算頻率序列,共有n個頻率點
bank = zeros(24, n); %生成24行n列的全零矩陣
for m1 = 2:p+1 %循環起始數為2,因為下方語句中用到m-1的值,其中m-1必須為正整數,是以m為大于等于2的正整數
%F為實際頻率,分别找到三角濾波器左中右對應的頻率
F_left = F(m1-1);
F_mid = F(m1);
F_right = F(m1+1);
%使用ceil()函數向上取整,計算實際頻率對應的FFT點數
n_left = ceil(F_left / df); %頻率F_left對應的FFT點數
n_mid = ceil(F_mid / df); %頻率F_mid對應的FFT點數
n_right = ceil(F_right / df); %頻率F_right對應的FFT點數
%用三角窗的頻率響應函數作圖
for k = 1:n %根據FFT點數畫三角窗
if k>=n_left & k<=n_mid
bank(m1-1,k) = (k-n_left)/(n_mid-n_left); %畫第m-1個濾波器的左半部分
elseif k>n_mid & k<=n_right
bank(m1-1,k) = (n_right-k)/(n_right-n_mid); %畫第m-1個濾波器的右半部分
end
end
plot(f,bank(m-1,:))
hold on;
end
經過濾波器濾波之後,輸出和濾波器一樣的維數,這裡我用了24個濾波器,所有輸出的維數也是24維
每一幀信号經過濾波器,輸入的是一個值。一個數。
clc;
clear;
[x,fs]=audioread('C3_4_y_1.wav');
%Mel濾波
fs = 8000; %采樣頻率
fl = 0; %fl是設計濾波器的最低頻率
fh = fs / 2; %fh是設計濾波器的最高頻率
bl = 1125 * log(1 + fl/700); %最低頻率對應的Mel頻率
bh = 1125 * log(1 + fh/700); %最高頻率對應的Mel頻率
p = 24; %在fl和fh之間設計Mel濾波器的個數
N = 256; %FFT點數,N越大,頻率分辨率越高,誤差越小
MelF = linspace(0, bh-bl, p+2); %在0至bh-bl的Mel頻率範圍内産生p+2個Mel頻率值
F = 700 * (exp(MelF/1125) - 1); %将上一步産生的p+2個Mel頻率值轉化為p+2個實際頻率值
df = fs / N; %計算頻率分辨率
n = N/2 + 1; %計算fs/2内對應的FFT點數
f = (0:n-1) * df; %計算頻率序列,共有n個頻率點
bank = zeros(24, n); %生成24行n列的全零矩陣
for m1 = 2:p+1 %循環起始數為2,因為下方語句中用到m-1的值,其中m-1必須為正整數,是以m為大于等于2的正整數
%F為實際頻率,分别找到三角濾波器左中右對應的頻率
F_left = F(m1-1);
F_mid = F(m1);
F_right = F(m1+1);
%使用ceil()函數向上取整,計算實際頻率對應的FFT點數
n_left = ceil(F_left / df); %頻率F_left對應的FFT點數
n_mid = ceil(F_mid / df); %頻率F_mid對應的FFT點數
n_right = ceil(F_right / df); %頻率F_right對應的FFT點數
%用三角窗的頻率響應函數作圖
for k = 1:n %根據FFT點數畫三角窗
if k>=n_left & k<=n_mid
bank(m1-1,k) = (k-n_left)/(n_mid-n_left); %畫第m-1個濾波器的左半部分
elseif k>n_mid & k<=n_right
bank(m1-1,k) = (n_right-k)/(n_right-n_mid); %畫第m-1個濾波器的右半部分
end
end
end
% 歸一化mel濾波器組系數
bank=full(bank);
bank=bank/max(bank(:));
% plot(f,bank(m-1,:))
% hold on;
x=filter([1 -0.9375],1,x);
%分幀
S=enframe(x,256,160);
n2=fix(256/2)+1;
for k=1:24
n=0:23;
dctxs(k,:)=cos((2*n+1)*k*pi/(2*24));
end
for i=1:size(x,1)
y = x(i,:);
s = y' .* hamming(256);
t = abs(fft(s));
t = t.^2;
bank=melbankm(24,256,fs,0,0.5,'m');
% 歸一化Mel濾波器組系數
bank=full(bank);
bank=bank/max(bank(:));
c=log(bank*t(1:n2));
c1=dctxs*c;
w=1+12*sin(pi*[1:24]./24);
w=w/max(w);
c2=c1.*w';%大部分的信号資料一般集中在變換後的低頻區,是以對每一幀隻取前13個資料就好了。
m(i,:)=c2';
end
%差分系數 %%%N維MFCC參數(N/3MFCC系數+ N/3一階差分參數+ N/3二階差分參數)+幀能量(此項可根據需求替換)
dtm = zeros(size(m));
for i=3:size(m,1)-2
dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:);%标準的倒譜參數MFCC隻反映了語音參數的靜态特性,語音的動态特性可以用這些靜态特征的差分譜來描述。把動、靜态特征結合起來才能有效提高系統的識别性能
end
dtm = dtm / 3;
%合并MFCC參數和一階差分MFCC參數
ccc = [m dtm];%N維MFCC參數(N/3MFCC系數+ N/3一階差分參數+ N/3二階差分參數)+幀能量(此項可根據需求替換)
%去除首尾兩幀,因為這四幀的一階差分參數為0
ccc = ccc(3:size(m,1)-2,:);
取對數是因為人耳聽到的聲音與信号本身的大小是幂次方關系,是以要求個對數.
bank輸出的矩陣形式為:濾波器個數*fft點數/2-1。t為fft點數,隻取fft點數/2-1。
預加重前的信号
預加重後的信号