天天看點

梅爾倒譜分析MFCC

梅爾倒譜系數

MFCC

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

梅爾倒譜分析MFCC

預加重部分用一個一階高通濾波器,目的是為了補償高頻分量的損失,提升高頻分量。濾波器常設為:

梅爾倒譜分析MFCC

分幀:把每一幀信号當作穩定信号來處理。

加窗:減少頻譜洩漏。

FFT:把時域轉化為頻域,計算譜線能量。

mel濾波:

MEL濾波器濾波:

梅爾頻率尺度和實際頻率的對應關系

梅爾倒譜分析MFCC
梅爾倒譜分析MFCC

美爾濾波器的傳遞函數

梅爾倒譜分析MFCC

在梅爾頻率下,每個濾波器直接的間隔梅爾濾波是一樣的,實際頻率不一樣。

構造梅爾濾波器組

**設計梅爾濾波器思路:**自己的了解,不一定對。

(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
           
梅爾倒譜分析MFCC

經過濾波器濾波之後,輸出和濾波器一樣的維數,這裡我用了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。

預加重前的信号

梅爾倒譜分析MFCC

預加重後的信号

梅爾倒譜分析MFCC
梅爾倒譜分析MFCC

繼續閱讀