STFT和声谱图,梅尔频谱(Mel Bank Features)与梅尔倒谱(MFCCs)

最近小编在做ASC(Acoustic Scene Classification)问题,不管是用传统的GMM模型,还是用机器学习中的SVM或神经网络模型,提取声音特征都是第一步。梅尔频谱和梅尔倒谱就是使用非常广泛的声音特征形式,小编与它们斗争已有一段时间了,在此总结一下使用它们的经验。

STFT和声谱图(Spectrogram)

声音信号本是一维的时域信号,直观上很难看出频率变化规律。如果通过傅里叶变换把它变到频域上,虽然可以看出信号的频率分布,但是丢失了时域信息,无法看出频率分布随时间的变化。为了解决这个问题,很多时频分析手段应运而生。短时傅里叶,小波,Wigner分布等都是常用的时频域分析方法。

短时傅里叶变换(STFT)是最经典的时频域分析方法。傅里叶变换(FT)想必大家都不陌生,这里不做专门介绍。所谓短时傅里叶变换,顾名思义,是对短时的信号做傅里叶变化。那么短时的信号怎么得到的? 是长时的信号分帧得来的。这么一想,STFT的原理非常简单,把一段长信号分帧、加窗,再对每一帧做傅里叶变换(FFT),最后把每一帧的结果沿另一个维度堆叠起来,得到类似于一幅图的二维信号形式。如果我们原始信号是声音信号,那么通过STFT展开得到的二维信号就是所谓的声谱图。
声谱图示意图

有很多工具方便地支持STFT展开,如果你是和小编一样是python爱好者,可以使用scipy库中的signal模块。如果你想做STFT分解的音频信号(wav文件)的路径存在path变量中,可通过下面的代码得到STFT数据。

import wavio
import numpy as np
from scipy import signal

wav_struct=wavio.read(path)
<think>好的,我现在需要帮助用户了解如何从音频信号计算梅尔频谱并对数幅度特征,并且用户希望有一个Python的教程。首先,我得回忆一下音频处理的基本流程,确保每个步骤都正确无误。 首先,用户提到了梅尔对数幅度特征,这通常涉及梅尔频率系数(MFCC)相关的处理,但可能用户具体需要的是梅尔频谱而不是MFCC本身。根据引用[3]和[4],处理流程可能包括原始音频读取、预加重、分帧、加窗、STFT、计算幅度、应用梅尔滤波器组,然后取对数。需要确认每个步骤的作用和实现方法。 第一步,读取音频文件。用户提到使用Python,所以常用的库是librosa或soundfile。例如,librosa.load可以读取音频文件,返回波形数据和采样率。这里需要注意采样率的一致性,可能需要进行重采样。 接下来是预加重。预加重的目的是增强高频信号,通常通过一阶滤波器实现,公式是y[n] = x[n] - α*x[n-1],其中α通常取0.97或0.95。在Python中可以用卷积或者直接循环处理,不过使用librosa的话可能有现成的函数。 然后是分帧。音频信号是时变的,分帧将信号分成短时段,通常每帧20-40ms,帧移10ms。例如,16kHz采样率下,20ms就是320个样本点。分帧可以通过numpy的数组切片实现,计算总帧数,然后生成帧的数组。 加窗是为了减少频谱泄漏,常用汉明窗。每个帧乘以窗函数,可以使用numpy.hamming或者librosa的窗函数。 接下来计算STFT,得到复数频谱。使用np.fft.rfft计算每一帧的FFT,取绝对值得到幅度,平方得到功率。这里要注意参数如n_fft,通常取2的幂次,比如512或1024。 应用梅尔滤波器组。梅尔滤波器组将线性频率转换为梅尔频率,模仿人耳感知。引用[2]提到梅尔频谱是通过将每个频率带的幅度相加得到的。可以使用librosa.filters.mel来生成滤波器组,然后将幅度滤波器组相乘,得到梅尔频谱。 取对数是为了压缩动态范围,使用np.log。这样得到的对数梅尔频谱就是最终的特征。 现在需要将这些步骤转化为Python代码,可能需要用到librosa、numpy等库。需要检查每个步骤的参数是否正确,例如n_fft、hop_length、n_mels等。同时,要确保用户了解每个步骤的作用,例如预加重为什么重要,分帧加窗的原因等。 用户可能的问题包括:如何选择梅尔滤波器的数量,n_fft的大小影响,窗函数的选择,以及是否需要归一化等。在教程中需要适当解释这些参数的作用,但用户的问题可能主要集中在步骤实现上。 另外,引用[3]提到了声谱图梅尔频谱的关系,需要确保代码中正确应用了梅尔滤波器组到声谱图上。可能还需要提到librosa中的melspectrogram函数可以直接生成梅尔频谱,但分步讲解更有利于理解。 最后,示例代码需要测试是否正确,例如使用一个示例音频文件,并可视化结果。可能还需要提醒用户安装必要的库,如librosa和matplotlib。 总结步骤:读取音频→预加重→分帧→加窗→STFT→幅度梅尔滤波器→对数幅度。代码中需要逐步实现这些,或者利用librosa的快捷函数,但分步展示更清晰。</think>### 从音频信号计算梅尔频谱及对数幅度特征的步骤 以下是使用Python实现音频信号到梅尔对数幅度特征转换的完整流程: --- #### 1. **读取音频信号** ```python import librosa # 读取音频文件(支持wav/mp3等格式) audio_path = "sample.wav" raw_waveform, sample_rate = librosa.load(audio_path, sr=16000) # 强制采样率为16kHz[^4] ``` --- #### 2. **预加重** 增强高频分量,补偿语音信号的高频衰减: ```python pre_emphasis = 0.97 emphasized_signal = librosa.effects.preemphasis(raw_waveform, coef=pre_emphasis) ``` --- #### 3. **分帧加窗** 将信号分割为短时段(帧长25ms,帧移10ms): ```python frame_length = int(0.025 * sample_rate) # 400 samples(16kHz时) hop_length = int(0.01 * sample_rate) # 160 samples # 分帧并加汉明窗 frames = librosa.util.frame(emphasized_signal, frame_length, hop_length) window = librosa.filters.get_window('hann', frame_length) windowed_frames = frames * window.reshape(-1, 1) ``` --- #### 4. **计算短时傅里叶变换(STFT)** 获取幅度: ```python import numpy as np # 计算每帧的FFT(n_fft通常取512或1024) n_fft = 512 stft = np.fft.rfft(windowed_frames, n=n_fft, axis=0) magnitude_spectrogram = np.abs(stft) ** 2 # 功率[^4] ``` --- #### 5. **应用梅尔滤波器组** 将线性频率转换为梅尔频率: ```python n_mels = 40 # 梅尔滤波器数量 mel_basis = librosa.filters.mel(sr=sample_rate, n_fft=n_fft, n_mels=n_mels) # 将滤波器组作用于幅度 mel_spectrogram = np.dot(mel_basis, magnitude_spectrogram) ``` --- #### 6. **取对数幅度** 压缩动态范围,增强特征鲁棒性: ```python log_mel_spectrogram = librosa.amplitude_to_db(mel_spectrogram, ref=np.max) ``` --- #### 7. **可视化结果** ```python import matplotlib.pyplot as plt plt.figure(figsize=(10, 4)) librosa.display.specshow(log_mel_spectrogram, sr=sample_rate, hop_length=hop_length, x_axis='time', y_axis='mel') plt.colorbar(format='%+2.0f dB') plt.title('Log-Mel Spectrogram') plt.show() ``` --- ### 关键参数说明 - **n_fft**: 控制频率分辨率,值越大频率划分越细 - **n_mels**: 梅尔滤波器数量,影响特征维度(常用40-128) - **hop_length**: 帧移,决定时间轴的分辨率 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值