Mel滤波器的原理

您所在的位置:网站首页 Mel频率滤波器组的滤波器常用的个数为 Mel滤波器的原理

Mel滤波器的原理

2024-07-10 21:20| 来源: 网络整理| 查看: 265

推荐阅读

http://fancyerii.github.io/books/mfcc/

1. Mel滤波器如何生成的

Mel滤波器是一种用于语音信号处理的滤波器,通常用于语音识别、语音合成和音频处理等任务中。它的设计基于人类听觉系统对声音的频率响应的特性。

Mel滤波器的生成过程如下:

选择一个三角滤波器组(Triangular filter bank),通常包括20-40个三角滤波器。每个三角滤波器的中心频率和带宽都是根据梅尔刻度(Mel scale)来确定的,梅尔刻度是一种基于人耳感知音高的非线性频率刻度。

计算三角滤波器组在频域上的响应。每个滤波器的响应函数是一个三角形,在中心频率处取到最大值,然后向左右两边逐渐变小,直到频率为0为止。

将每个滤波器的响应函数与频谱图进行卷积,得到每个滤波器在频域上的输出。这个输出代表了在该频段内声音的强度,相当于将原始信号分成了若干个不同频率的带通信号。

取每个滤波器输出的对数作为特征向量。这样做的原因是人耳的感知是对数刻度的,因此对数变换可以更好地模拟人耳对声音的感知。

这样就得到了一个Mel滤波器组,它将语音信号分成了若干个不同的频带,每个频带的强度可以用一个对数值表示。这些对数值通常被用作声学特征,在语音识别等任务中进行分类和建模。

1.1 生成Mel 滤波器的代码 import numpy as np import scipy.signal as signal # 定义参数 sample_rate = 16000 # 采样率 num_filters = 40 # 滤波器组的数量 min_freq = 0 # 最小频率 max_freq = sample_rate / 2 # 最大频率 num_fft_points = 2048 # FFT的点数 # 计算梅尔刻度 mel_min = 0 mel_max = 2595 * np.log10(1 + max_freq / 700) mel_centers = np.linspace(mel_min, mel_max, num_filters + 2) # 将梅尔刻度转换为频率 freq_centers = 700 * (10**(mel_centers / 2595) - 1) # 计算滤波器组的频率响应 filter_banks = np.zeros((num_filters, num_fft_points // 2 + 1)) for i in range(num_filters): # 计算滤波器的左右边界频率 left = int(np.floor(freq_centers[i] / max_freq * (num_fft_points // 2 + 1))) center = int(np.floor(freq_centers[i+1] / max_freq * (num_fft_points // 2 + 1))) right = int(np.floor(freq_centers[i+2] / max_freq * (num_fft_points // 2 + 1))) # 定义三角形滤波器 filter_window = signal.triang(right - left) # 将三角形滤波器应用于频率响应 filter_banks[i, left:center] = np.linspace(0, 1, center - left) filter_banks[i, center:right] = np.linspace(1, 0, right - center) filter_banks[i, left:right] *= filter_window # 将频率响应转换为Mel滤波器组的系数 mel_filters = np.dot(signal.fftshift(signal.dct(filter_banks, type=2, norm='ortho'), axes=0), np.sqrt(2.0/num_filters))

这个代码使用Numpy和Scipy库来计算梅尔刻度、频率响应和Mel滤波器组的系数。其中,sample_rate表示采样率,num_filters表示滤波器组的数量,min_freq和max_freq表示最小和最大的频率,num_fft_points表示FFT的点数。

代码的核心部分是计算滤波器组的频率响应,它使用三角形滤波器来模拟人耳对声音频率的感知。然后,使用离散余弦变换(DCT)将频率响应转换为Mel滤波器组的系数。

这个代码只是一个简单的示例,实际应用中可能需要根据具体任务和数据进行调整。

2. gamma滤波器的生成过程,并给出代码

Gamma滤波器是一种常见的用于预加重的滤波器。它的频率响应类似于高通滤波器,但具有更平滑的过渡和更大的斜率。在语音信号处理中,Gamma滤波器通常用于增强高频信号的强度,以提高信噪比和语音质量。

Gamma滤波器的频率响应可以表示为:

H ( z ) = 1 − z − γ 1 − z − 1 H(z) = \frac{1-z^{-\gamma}}{1-z^{-1}} H(z)=1−z−11−z−γ​

其中, γ \gamma γ是滤波器的控制参数。通常, γ \gamma γ的值在1.0到1.2之间。

下面是一个使用Python生成Gamma滤波器的简单代码示例:

这个代码使用Numpy和Scipy库来计算Gamma滤波器的系数,并使用signal.firwin()函数生成一个长度为128的窗口函数(hann窗口),然后将窗口函数与Gamma滤波器的系数相乘,以生成最终的Gamma滤波器。

其中,sample_rate表示采样率,gamma表示Gamma值,num_taps表示滤波器的长度。b是Gamma滤波器的系数,它使用幂次函数来计算,归一化后,即可用于生成滤波器。最后,使用signal.firwin()函数生成一个窗口函数,并将其与Gamma滤波器的系数相乘,以生成最终的Gamma滤波器。

import numpy as np import scipy.signal as signal # 定义参数 sample_rate = 16000 # 采样率 gamma = 1.0 # Gamma值 num_taps = 128 # 滤波器的长度 # 计算Gamma滤波器的系数 b = np.zeros(num_taps) for i in range(num_taps): b[i] = (i+1)**(gamma-1) - i**(gamma-1) # 归一化系数 b /= np.sum(b) # 使用系数生成滤波器 gamma_filter = signal.firwin(num_taps, cutoff=4000, window='hann') * b


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3