利用python声音处理库librosa提取声音信号的mfcc特征及特征融合

利用python库librosa提取声音信号的mfcc特征及特征融合

前言

写这篇博文的目的有两个,第一是希望新手朋友们能够通过这篇博文了解到 python 还有这么强大的一个声音处理库;第二则是本人在用该库时发现的一个小问题,就是库由于封装的太完备,在我们想做特征融合时候会出现一点小问题,在这我将指出并提供一种方案。具体的库使用指导还请参照Librosa 0.6

librosa库介绍

Liborsa是python的一个做音乐和声音分析的包,它提供了创建音乐信息检索系统所必要的构建块。这个库包含有丰富的声音信号处理工具,例如声音读取、采样率转换、stft、istft等等。

librosa 中MFCC特征提取函数介绍

# Mel-frequency cepstral coefficients (MFCCs)梅尔倒谱系数
librosa.feature.mfcc(y=None, sr=22050, S=None, n_mfcc=20, dct_type=2, norm='ortho', **kwargs)

参数介绍:
y:声音信号的时域序列
sr:采样频率(默认22050)
S:对数能量梅尔谱(默认为空)
n_mfcc:梅尔倒谱系数的数量(默认取20)
dct_type:离散余弦变换(DCT)的类型(默认为类型2)
norm:如果DCT的类型为是2或者3,参数设置为"ortho",使用正交归一化DCT基。归一化并不支持DCT类型为1
kwargs:如果处理时间序列输入,参照melspectrogram

返回:
M:MFCC序列
例子:

从一个时间序列中计算mfcc

>>> y, sr = librosa.load(librosa.util.example_audio_file(), offset=30, duration=5)
>>> librosa.feature.mfcc(y=y, sr=sr)
array([[ -5.229e+02,  -4.944e+02, ...,  -5.229e+02,  -5.229e+02],
       [  7.105e-15,   3.787e+01, ...,  -7.105e-15,  -7.105e-15],
       ...,
       [  1.066e-14,  -7.500e+00, ...,   1.421e-14,   1.421e-14],
       [  3.109e-14,  -5.058e+00, ...,   2.931e-14,   2.931e-14]])

利用预先计算好的对数能力梅尔谱计算MFCC

>>> S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,fmax=8000)
>>> librosa.feature.mfcc(S=librosa.power_to_db(S))
array([[ -5.207e+02,  -4.898e+02, ...,  -5.207e+02,  -5.207e+02],
       [ -2.576e-14,   4.054e+01, ...,  -3.997e-14,  -3.997e-14],
       ...,
       [  7.105e-15,  -3.534e+00, ...,   0.000e+00,   0.000e+00],
       [  3.020e-14,  -2.613e+00, ...,   3.553e-14,   3.553e-14]])

解决特征融合问题

采用封装好的函数进行mfcc提取,我们得到的是一个经过分帧加窗及其一系列处理后的数据,要想在每一帧的mfcc后面添加其他特征首先要得到分帧的参数设置,然后对待融合特征采用相同的分帧机制,才能保证二者的融合是在相同帧的情况下进行的。例如我们要对mfcc特征与短时能量特征进行融合,我们在提取二者过程中要保证其分帧方式相同,然后对求得特征进行拼接。mfcc与能量的特征融合代码如下:

import librosa
import matplotlib.pyplot as plt
import numpy as np

path='E:\\Experiment\\soundbank\\cut\\trainall\\screams\\2\\4,00001_2__11.wav' # 声音文件绝对路径
y,sr=librosa.load(path,None) # 以原采样频率读取声音文件数据,并返回该数据及其采样频率
# 设置梅尔滤波器组参数,并设置分帧参数n_fft--帧长,hp_length--帧移
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=60,n_fft=1024, hop_length=512,fmax=16000) 
mfcc=librosa.feature.mfcc(y, sr, S=librosa.power_to_db(S),n_mfcc=40) # 提取mfcc系数
stft_coff=abs(librosa.stft(y,1024,512,1024)) #分帧然后求短时傅里叶变换,分帧参数与对数能量梅尔滤波器组参数设置要相同
energy = np.sum(np.square(stft_coff),0) #求每一帧的平均能量
MFCC_Energy = np.vstack((mfcc,energy)) # 将每一帧的MFCC与短时能量拼接在一起 

其他特征融合方式与上相同。

总结

python库虽然多,为了以后更好的发展还是建议学习时候从原理开始学起,后面我将会继续补充关于python编程过程中遇到的一些小问题,以及技巧,欢迎关注交流。

<think>好的,我现在需要回答用户关于多模态图像融合的Python代码示例的问题。首先,用户提到了多模态图像融合,我需要明确用户的需求是什么。多模态图像融合通常指的是将来自不同模态(如可见光、红外、MRI、CT等)的图像信息结合起来,生成一个更全面、更有信息的图像。用户可能希望得到一个代码示例,展示如何实现这种融合。 接下来,我需要回忆相关的知识。根据用户提供的引用,特别是引用[3],里面提到了早期融合、晚期融合和中间融合三种方法。用户可能需要一个具体的实现示例,可能涉及特征提取和融合。此外,引用[2]提到使用Triplet Loss或Contrastive Loss来训练多模态模型,但用户当前的问题可能更偏向于图像融合的实现,而不是训练模型。 首先,我需要确定用户需要的是哪种融合方式。早期融合可能在输入层直接合并不同模态的数据,例如将不同图像的像素级融合。晚期融合可能是在各自处理后的结果上进行融合,比如加权平均。中间融合可能在神经网络中间层进行特征融合。用户可能希望看到一种简单易懂的实现方式,所以可能选择一个基础的融合方法,比如加权平均作为示例。 然后,我需要考虑使用哪些Python库。图像处理常用的库有OpenCV和PIL,数据处理可能会用NumPy。如果涉及到深度学习模型,可能需要TensorFlow或PyTorch,但根据用户提供的引用[3],可能更倾向于基础的数据融合方法,而不是深度学习模型。因此,示例代码可能不需要复杂的模型结构,而是展示如何读取图像并进行融合。 接下来,我需要确保代码的正确性和可读性。例如,使用OpenCV读取图像,转换为灰度(如果需要),调整大小,然后进行加权平均。同时需要处理图像大小不一致的情况,调整到相同尺寸。此外,需要展示如何保存结果图像。 然后,检查是否有相关的引用支持。引用[3]提到了早期融合、晚期融合等,所以可以引用该部分来说明融合方法。此外,引用[2]提到了多模态模型的损失函数,但可能不直接相关,所以可能不需要引用。引用[1]和[4]可能不太相关,但引用[3]中的具体融合方法是最相关的。 接下来,编写示例代码。例如,使用OpenCV读取两个图像,调整尺寸,进行加权相加,并保存结果。这属于早期融合的示例,因为是在特征提取前进行像素级的融合。同时,需要添加注释说明每一步的作用。 然后,根据用户的要求,生成相关问题。可能的问题包括融合方法的不同类型、性能评估指标、深度学习中的融合技术,以及处理不同分辨率的方法。 最后,确保回答结构清晰,代码正确,并且引用了正确的来源。同时,确保使用中文回答,数学公式和独立公式使用正确的LaTeX格式,但在这个问题中可能涉及较少的数学公式,主要在于代码示例和融合方法的解释。</think>以下是基于多模态图像融合的Python代码示例及说明,结合早期融合和晚期融合的典型方法: ### 一、早期融合示例(像素级加权融合) ```python import cv2 import numpy as np # 读取两种模态图像(可见光+红外) img_visible = cv2.imread('visible.jpg', cv2.IMREAD_GRAYSCALE) img_thermal = cv2.imread('thermal.jpg', cv2.IMREAD_GRAYSCALE) # 统一尺寸 img_visible = cv2.resize(img_visible, (640, 480)) img_thermal = cv2.resize(img_thermal, (640, 480)) # 加权融合(可见光权重0.7,红外权重0.3) fusion_weighted = cv2.addWeighted(img_visible, 0.7, img_thermal, 0.3, 0) # 保存结果 cv2.imwrite('fusion_result.jpg', fusion_weighted) ``` 此方法在像素级别直接融合不同模态的图像信息,属于早期融合策略[^3]。 ### 二、晚期融合示例(特征层融合) ```python import torch import torchvision.models as models # 定义特征提取器 resnet = models.resnet18(pretrained=True) modules = list(resnet.children())[:-1] feature_extractor = torch.nn.Sequential(*modules) # 提取多模态特征 img_mri = torch.randn(1, 3, 224, 224) # MRI图像 img_pet = torch.randn(1, 3, 224, 224) # PET图像 feat_mri = feature_extractor(img_mri).flatten() feat_pet = feature_extractor(img_pet).flatten() # 特征拼接融合 fused_feature = torch.cat([feat_mri, feat_pet], dim=0) print(f"融合特征维度:{fused_feature.shape}") ``` 该方法在不同模态分别提取特征后进行拼接,属于晚期融合策略。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值