梅尔滤波器组归一化方法
时间: 2023-11-02 20:43:32 浏览: 236
梅尔滤波器组归一化(Mel Filterbank normalization)方法是在使用梅尔滤波器组对音频信号进行预处理时,为了消除不同频段的能量差异,对每个梅尔滤波器组内的能量进行归一化处理。
具体来说,梅尔滤波器组通常是由一系列三角滤波器构成的,每个滤波器的带宽都不同,这样可以更好地模拟人耳的频率响应。但是由于不同频段的能量差异较大,因此需要进行归一化处理,以便更好地提取音频特征。
梅尔滤波器组归一化方法的具体步骤如下:
1. 对每个梅尔滤波器组内的能量进行求和,得到该组内的总能量。
2. 将每个梅尔滤波器组内的能量除以该组的总能量,得到每个滤波器组内的能量分布。
3. 对每个梅尔滤波器组内的能量分布进行平方根处理,以消除过大或过小的差异。
4. 将每个梅尔滤波器组内的能量分布进行归一化处理,使得每个梅尔滤波器组内的能量之和都等于1。
通过以上处理,可以更好地提取音频特征,从而更准确地进行语音识别、情感识别等任务。
相关问题
梅尔滤波器组归一化方法实现步骤及代码
梅尔滤波器组归一化方法是语音信号处理中常用的一种特征提取方法。它主要用于将语音信号转换为频域的能量分布,从而提取语音信号的特征。下面是实现梅尔滤波器组归一化方法的步骤及代码:
Step 1: 确定梅尔滤波器组的参数
在实现梅尔滤波器组归一化方法之前,需要先确定梅尔滤波器组的参数。这些参数包括采样率、信号长度、帧长、帧移、梅尔滤波器组的数量等。这些参数的选择需要根据具体的任务和数据集来进行优化。
Step 2: 计算梅尔滤波器组
根据上一步确定的参数,计算梅尔滤波器组。梅尔滤波器组的计算公式如下:
$$ H_m(k) = \begin{cases} 0, & k < f(m-1) \\ \dfrac{k - f(m-1)}{f(m) - f(m-1)}, & f(m-1) \leq k \leq f(m) \\ \dfrac{f(m+1) - k}{f(m+1) - f(m)}, & f(m) \leq k \leq f(m+1) \\ 0, & k > f(m+1) \end{cases} $$
其中,$m$ 表示第 $m$ 个梅尔滤波器,$k$ 表示频率,$f(m)$ 表示第 $m$ 个梅尔滤波器的中心频率,其计算公式为:
$$ f(m) = \dfrac{700(\exp(\frac{m}{1125}) - 1)}{1 + \exp(\frac{m}{1125})} $$
Step 3: 对梅尔滤波器组进行归一化
对梅尔滤波器组进行归一化,使其满足单位能量的限制。梅尔滤波器组的单位能量限制是指,每个梅尔滤波器的频率响应的平方和等于1。因此,对于第 $m$ 个梅尔滤波器,其归一化系数为:
$$ C_m = \sqrt{\dfrac{2}{f(m+1)-f(m-1)}\sum_{k=f(m-1)}^{f(m+1)-1} H_m^2(k)} $$
然后,将梅尔滤波器组中每个梅尔滤波器的频率响应都除以相应的归一化系数,即可完成梅尔滤波器组的归一化。
下面是 Python 实现代码:
```python
import numpy as np
def compute_mel_filterbank(sr, n_fft, n_mels):
# Compute Mel filterbank
f_min = 0
f_max = sr / 2
mel_min = 0
mel_max = 2595 * np.log10(1 + f_max / 700)
mel_points = np.linspace(mel_min, mel_max, n_mels + 2)
f_points = 700 * (10**(mel_points / 2595) - 1)
hz_points = np.floor((n_fft + 1) * f_points / sr)
filterbank = np.zeros((n_mels, int(np.floor(n_fft / 2 + 1))))
for m in range(1, n_mels + 1):
f_m_minus = int(hz_points[m - 1])
f_m = int(hz_points[m])
f_m_plus = int(hz_points[m + 1])
for k in range(f_m_minus, f_m):
filterbank[m - 1, k] = (k - hz_points[m - 1]) / (hz_points[m] - hz_points[m - 1])
for k in range(f_m, f_m_plus):
filterbank[m - 1, k] = (hz_points[m + 1] - k) / (hz_points[m + 1] - hz_points[m])
return filterbank
def normalize_mel_filterbank(filterbank):
# Normalize Mel filterbank
for i in range(filterbank.shape[0]):
c = np.sqrt(2 / np.sum(np.square(filterbank[i, :])))
filterbank[i, :] *= c
return filterbank
```
其中, `sr` 表示采样率, `n_fft` 表示FFT的大小, `n_mels` 表示梅尔滤波器数量。 `compute_mel_filterbank` 函数用于计算梅尔滤波器组,`normalize_mel_filterbank` 函数用于对梅尔滤波器组进行归一化。
function cc=mfcc(x) %%-------准备工作------------- %归一化mel滤波器组系数(24个窗) bank=melbankm2(24,256,8000,0,0.5,'m'); bank=full(bank); bank=bank/max(bank(:)); %DCT系数,12(欲求的mfcc个数)×24 for k=1:12 n=0:23; dctcoef(k,:)=cos(pi*k*(2*n+1)/(2*24)); end %归一化的倒谱提升窗口 w=1+6*sin(pi*[1:12]./12); w=w/max(w); %--------提取特征------------- %预加重滤波器 xx=double(x); xx=filter([1 -0.9375],1,xx); %语音信号分帧 xx=enframe(x,256,80); %计算每帧的MFCC参数 for i=1:size(xx,1) y=xx(i,:); s=y'.*hamming(256); t=abs(fft(s)); t=t.^2; c1=log(bank*t(1:129)); c1=dctcoef*c1; c2=c1.*w'; m(i,:)=c2'; end %差分系数 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,:); end dtm=dtm/3; %合并成帧数×24的特征向量矩阵 cc=[m dtm]; cc=cc(3:size(m,1)-2,:);
这是一个MATLAB语言编写的MFCC特征提取函数,主要实现以下步骤:
1. 归一化mel滤波器组系数:使用melbankm2函数生成24个滤波器组,通过full函数转换为完整矩阵,并进行归一化处理。
2. 计算DCT系数:由于MFCC的计算过程中需要进行DCT变换,因此需要先计算DCT系数,这里计算得到一个12×24的矩阵。
3. 归一化的倒谱提升窗口:为了强化MFCC的高频部分信息,需要对MFCC系数进行谱平滑处理,这里采用倒谱提升窗口实现,得到一个12维的向量。
4. 预加重滤波器:对原始语音信号进行预处理,使用一个一阶高通滤波器进行预加重。
5. 语音信号分帧:将预处理后的语音信号分帧,每帧长度为256,帧移为80。
6. 计算每帧的MFCC参数:对每一帧进行MFCC参数计算,包括梅尔频率倒谱系数和一阶差分系数,得到一个帧数×24的特征向量矩阵。
7. 计算一阶差分系数:为了进一步提取MFCC的动态特征,需要计算一阶差分系数,得到一个帧数×24的特征向量矩阵。
8. 合并MFCC和一阶差分系数:将MFCC和一阶差分系数合并成一个帧数×24×2的特征向量矩阵。
9. 去掉首尾两帧:由于计算一阶差分系数需要用到前后两帧,因此去掉前两帧和后两帧。
该函数主要用于语音信号处理领域,对于语音信号的特征提取非常有用。
阅读全文