梅尔频谱(Mel spectrum)简介及Python实现
- 1. 梅尔频谱(Mel spectrum)简介
- 2. Python可视化测试
- 3.频谱可视化
- 3.1 Mel 频谱可视化
- 3.2 STFT spectrum
- 参考文献资料
1. 梅尔频谱(Mel spectrum)简介
在信号处理上,声信号(噪声信号)是一种重要的传感监测手段。对于语音分类任务,常常采用梅尔频谱作为信号处理手段,将信号变成spectrum的图片形式。作为一种重要的语音信号处理包,librosa包通过内置函数能够很快的将原始音频信号处理为梅尔频谱图。
2. Python可视化测试
下面是一个将一段旋转机械支座采集的噪声信号可视化的代码:
内置函数的参数如下:
参数:
- path :音频文件的路径。
- sr :采样率,如果为“None”使用音频自身的采样率
- mono :bool,是否将信号转换为单声道
- offset :float,在此时间之后开始阅读(以秒为单位)
- duration 持续时间:float,仅加载这么多的音频(以秒为单位)
import librosa
import matplotlib.pyplot as plt
path = r"...\data\train_audio_inner_rpm1000_load20_1.wav"
y, sr = librosa.load(path,duration=2)
librosa.display.waveshow(y, sr=sr)
plt.title('Rotating machinery Acoustics Signal')
plt.xlabel('samples')
plt.ylabel('Amplitude')
plt.show()
3.频谱可视化
3.1 Mel 频谱可视化
要绘制音频信号的mel频谱,可以使用librosa库提供的librosa.feature.melsspectrogram函数。以下是可视化的结果:
import librosa
import librosa.display
import matplotlib.pyplot as plt
path = r"...\Mel_spectrum_acoustics\data\train_audio_inner_rpm1000_load20_1.wav"
y, sr = librosa.load(path, duration=2)
# compute mel spectrogram
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,
fmax=8000)
# convert to decibels
S_dB = librosa.power_to_db(S, ref=np.max)
# plot the mel spectrogram
librosa.display.specshow(S_dB, x_axis='time',
y_axis='mel', sr=sr,
fmax=8000)
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-frequency spectrogram')
plt.tight_layout()
plt.show()
作为一种一种新的声谱图——它在机器学习领域被广泛使用,因为它很好地代表了一种类人的感知方式。人类对低频信号更敏感, 人类可以很容易区分500HZ 和1000HZ的声音, 但区分不清楚9000HZ和9500HZ的声音。 但在物理上却很容易区分。 把频率信号做一个非线性映射,对数形式的mel scale和人类的感知方式较为类似。应用 librosa库可以很容易计算spectrogram和mel spectrogram,下图分别是mel-spectrum和spectrum的结果比较。
- mel spectrum
3.2 STFT spectrum
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
path = r"...\Mel_spectrum_acoustics\data\train_audio_inner_rpm1000_load20_1.wav"
y, sr = librosa.load(path, duration=2)
# compute the short-time Fourier transform (STFT) of the signal
D = librosa.stft(y)
# convert the complex STFT data to magnitude
mag = np.abs(D)
# convert magnitude to decibels (dB) using log scale
log_mag = librosa.amplitude_to_db(mag, ref=np.max)
# plot the spectrum
librosa.display.specshow(log_mag, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrum of Rotating Machinery Acoustics Signal')
plt.xlabel('Time (seconds)')
plt.ylabel('Frequency (Hz)')
plt.show()
参考文献资料
【1】Mel-frequency spectrum - Wikipedia