Python音频特征-梅尔滤波器

简介: 梅尔滤波器组是一种基于梅尔刻度的三角滤波器组,常用于音频信号处理。其构建步骤包括:获取梅尔刻度的范围、生成梅尔刻度序列、构建三角滤波器组并进行归一化处理。梅尔刻度反映了人耳对频率的感知特性,能更有效地表示音频特征。

梅尔滤波器组:是梅尔刻度上的一组三角滤波器组的归一化形式。实现步骤如下:

(1)获取梅尔刻度最大最小值。(m_min, m_max)

(2)获取梅尔刻度序列。序列最大最小值为:刻度最大最小值,长度为:滤波器个数+2

(3)构建三角滤波器组。根据全量频率区间和梅尔刻度序列,构建三角滤波器组。

(4)滤波器组归一化。

梅尔刻度

梅尔刻度(Mel scale)是一种基于人类听觉感知特性的频率尺度,用于表示音频信号的频率。

在处理音频数据时,常常需要将频率从赫兹(Hz)转换为梅尔刻度,或者反过来操作。

image.png

import numpy as np
import matplotlib.pyplot as plt

# 从Hz到梅尔刻度
def hz_to_mel(f):
    return 2595.0 * np.log10(1.0 + f / 700.0)
# 从梅尔刻度到Hz
def mel_to_hz(m):
    return 700.0 * (10.0 ** (m / 2595.0) - 1.0)

# Hz和梅尔刻度关系图
sample_rate = 16000
# Hz
f = np.linspace(0, sample_rate // 2, 16000)
# 梅尔刻度
mel = hz_to_mel(f)
# 绘制关系图
plt.figure(figsize=(5, 3))
plt.plot(f, mel)
plt.xlabel('Hz')
plt.ylabel('Mel')
plt.grid(True)
plt.show()

image.png

梅尔滤波器组

# 基本参数
n_fft = 512
n_mels = 64
f_min = 0.0
f_max = sample_rate / 2.0
n_freqs = int(n_fft // 2 + 1)

# 所有频率
all_freqs = np.linspace(0, sample_rate // 2, n_freqs)
# 最大最小频率
m_min = hz_to_mel(f_min)
m_max = hz_to_mel(f_max)
# 梅尔刻度
m_pts = np.linspace(m_min, m_max, n_mels + 2)
# 转换为Hz
f_pts = mel_to_hz(m_pts)
# 梅尔刻度和Hz图像
_, axs = plt.subplots(1, 2)
axs[0].plot(m_pts)
axs[0].grid(True)
axs[1].plot(f_pts)
axs[1].grid(True)
plt.tight_layout()
plt.show()

image.png

# 手敲三角梅尔滤波器组
def create_triangular_fbank(all_freqs, m_pts, norm=None):
    # 滤波器
    filter_fbank = np.zeros((len(all_freqs), len(m_pts) - 2))
    # 实现三角滤波器
    for i in range(n_mels):
        left = m_pts[i]
        center = m_pts[i+1]
        right = m_pts[i+2]
        # up
        up = (all_freqs >= left) & (all_freqs < center)
        filter_fbank[up, i] = (all_freqs[up] - left) / (center - left)
        # down
        down = (all_freqs >= center) & (all_freqs <= right)
        filter_fbank[down, i] = (right - all_freqs[down]) / (right - center)
        # 是否归一化
        if norm is not None and norm == "slaney":
            # 三角形面积 = (底 * 高)/ 2 => 高 = 面积 * 2 / 底
            high = (1 * 2) / (right - left)
    return filter_fbank

# 创建一个三角梅尔滤波器组
triangular_fbank = create_triangular_fbank(all_freqs, f_pts)
print(triangular_fbank.shape)
# 对比两个滤波器
mse = np.square(triangular_fbank - mel_fbanks.numpy()).mean()
mse

1.703962094077431e-13

# 绘图对比
_, axs = plt.subplots(1, 2)
axs[0].imshow(triangular_fbank, aspect='auto')
axs[1].imshow(mel_fbanks, aspect='auto')
plt.show()

image.png

滤波器组归一化

# 手动实现归一化
enorm = 2.0 / (f_pts[2 : n_mels + 2] - f_pts[: n_mels])
triangular_fbank_ser = triangular_fbank * np.expand_dims(enorm, 0)

# pytorch归一化
mel_fbanks_ser = F.melscale_fbanks(
    n_freqs=n_freqs,
    n_mels=n_mels,
    f_min=f_min,
    f_max=f_max,
    sample_rate=sample_rate,
    norm='slaney'
)

# 均方差
mse = np.square(triangular_fbank_ser - mel_fbanks_ser.numpy()).mean()
mse

6.676824653494738e-18

# 绘图比较
_, axs = plt.subplots(1, 2)
axs[0].imshow(triangular_fbank_ser, aspect='auto')
axs[1].imshow(mel_fbanks_ser, aspect='auto')
plt.show()

image.png

# 绘制三维图看看
filter_fbank = triangular_fbank_ser.T
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
for i in range(filter_fbank.shape[1]):
    x = np.full(filter_fbank.shape[0], i)
    y = np.arange(filter_fbank.shape[0])
    z = filter_fbank[:, i]
    # 绘制
    ax.plot(x, y, z)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.view_init(elev=50, azim=-30)
plt.show()

image.png

相关文章
|
4月前
|
PyTorch 算法框架/工具 图计算
Python音频处理-频谱图实现
本教程介绍如何使用 PyTorch 提取音频特征,重点实现频谱图的生成。内容包括使用 torchaudio 进行频谱提取、频谱图维度解析、手动实现频谱计算步骤,并对两种方法的结果进行对比分析,展示其差异与实现细节。
333 0
|
自然语言处理 PyTorch 算法框架/工具
modelscope问题之安装失败如何解决
本合集将提供ModelScope安装步骤、配置要求和环境准备,以便用户顺利启动ModelScope进行模型开发和测试。
2090 1
|
机器学习/深度学习 存储 人工智能
5秒实现AI语音克隆(Python)
推荐一个有趣的AI黑科技--MockingBird,该项目集成了Python开发,语音提取、录制、调试、训练一体化GUI操作,号称只需要你的 5 秒钟的声音,就能实时克隆出你的任意声音
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
964 0
|
4月前
|
机器学习/深度学习 移动开发 算法
【语音识别】基于K近邻分类算法的语音情感识别(Matlab代码实现)
【语音识别】基于K近邻分类算法的语音情感识别(Matlab代码实现)
197 4
|
3月前
|
Java 测试技术 编译器
@GrpcService使用注解在 Spring Boot 中开始使用 gRPC
本文介绍了如何在Spring Boot应用中集成gRPC框架,使用`@GrpcService`注解实现高效、可扩展的服务间通信。内容涵盖gRPC与Protocol Buffers的原理、环境配置、服务定义与实现、测试方法等,帮助开发者快速构建高性能的微服务系统。
563 0
|
机器学习/深度学习 Python
在Python中监听变量值的变化
在Python中监听变量值的变化
1230 2
|
存储 缓存 网络协议
网络编程初学者必备:从零开始的详细教程与资源汇总
网络编程初学者必备:从零开始的详细教程与资源汇总
435 0
|
机器学习/深度学习 人工智能 计算机视觉
AIGC基础模型——Vision Transformer (ViT)
【1月更文挑战第12天】AIGC基础模型——Vision Transformer (ViT)
625 6
AIGC基础模型——Vision Transformer (ViT)
|
12月前
|
机器学习/深度学习 PyTorch 算法框架/工具
详解三种常用标准化Batch Norm & Layer Norm & RMSNorm
通过本文的介绍,希望您能够深入理解Batch Norm、Layer Norm和RMSNorm的原理和实现,并在实际应用中灵活选择和使用,提升深度学习模型的性能和稳定性。
2766 5