如何用Librosa对非音频IMF信号提取MFCC?解决空白图与警告问题
解决MFCC处理EMD信号时的空白图像与滤波器警告问题
我尝试用MFCC分析经验模态分解(EMD)得到的信号(形状为(165,)的浮点数组imfs['0']),但运行代码后出现滤波器空值警告,生成的图像也是空白的,调整参数后问题依旧。
原始代码
import librosa import librosa.display import matplotlib.pyplot as plt import numpy as np import pandas as pd imfs = pd.read_csv('/B0005_soh_EMD.csv') data = pd.read_csv('/feat_B0005.csv') y = imfs['0'].to_numpy() #print(y.shape) mfccs = librosa.feature.mfcc(y=y, n_fft = 10) #print(y.shape) #print(sr) #print(mfccs) plt.figure(figsize=(10, 4)) librosa.display.specshow(mfccs), plt.colorbar() plt.title('MFCC') plt.ylabel('MFCC Coefficient') plt.show()
运行警告
/usr/local/lib/python3.10/dist-packages/librosa/feature/spectral.py:2143: UserWarning: Empty filters detected in mel frequency basis. Some channels will produce empty responses. Try increasing your sampling rate (and fmax) or reducing n_mels.
问题根源
- 采样率缺失:librosa默认使用22050Hz音频采样率,但你的EMD信号属于非音频时序数据,采样率不匹配会导致频谱计算逻辑混乱。
- FFT参数不合理:
n_fft=10远小于信号长度(165),梅尔滤波器组无法覆盖有效频率范围,触发空滤波器警告。 - 维度与渲染不匹配:MFCC默认输出维度为
(n_mfcc, time_steps),未转置直接传入specshow会导致时间轴显示异常,最终出现空白图像。
修正方案
1. 核心参数调整
- 指定与原始信号匹配的采样率(比如你的EMD信号来自100Hz采样的原始数据,就设置
sr=100)。 - 调整
n_fft为大于信号长度1/2的数值(比如n_fft=64),保证频谱计算有效;hop_length设为n_fft//2平衡时间与频率分辨率。 - 根据采样率减少
n_mels数量,避免空滤波器(比如100Hz采样下设置n_mels=10)。
2. 修正后的代码
import librosa import librosa.display import matplotlib.pyplot as plt import numpy as np import pandas as pd imfs = pd.read_csv('/B0005_soh_EMD.csv') data = pd.read_csv('/feat_B0005.csv') y = imfs['0'].to_numpy() # 替换为你的原始信号实际采样率 sr = 100 mfccs = librosa.feature.mfcc( y=y, sr=sr, n_fft=64, hop_length=32, n_mels=10, n_mfcc=13 ) # 转置MFCC,让时间轴对应x轴 mfccs = mfccs.T plt.figure(figsize=(10, 4)) librosa.display.specshow( mfccs, sr=sr, hop_length=32, x_axis='time', y_axis='mfcc' ) plt.colorbar() plt.title('MFCC of EMD IMF') plt.ylabel('MFCC Coefficient') plt.xlabel('Time') plt.show()
3. MFCC实用性说明
MFCC虽起源于音频领域,但在机械振动、电池健康监测等非音频时序场景中也能有效提取频谱特征,只要参数匹配信号特性,可用于后续分类、回归等任务。
内容的提问来源于stack exchange,提问作者Lloyd Byrne
相关产品推荐
相关产品推荐

