梅尔频谱图的相关知识见梅尔频率倒谱系数和声信号处理简介两个文档,以及文章语音信号特征提取——梅尔频率倒谱系数MFCC(含Matlab代码)和语音信号处理之(四)梅尔频率倒谱系数(MFCC)。
由于笔者现在还用不到,就暂时不深入研究了(我的求知欲不见了)。
melSpectrogram介绍了梅尔频谱图计算和展示的方法,本文主要对其内容进行整理和说明。
S = melSpectrogram(audioIn,fs) % 以采样率fs返回音频输入的mel频谱图。 该函数将输入的列视为单独的通道。
S = melSpectrogram(audioIn,fs,Name,Value) % 使用一个或多个Name,Value对参数指定选项。
[S,F,T] = melSpectrogram() % 返回以Hz为单位的频段的中心频率以及以秒为单位的每个数据窗口的位置。 该位置对应于每个窗口的中心。 您可以将此输出语法与任何先前的输入语法一起使用。
melSpectrogram() %在当前图形的表面上绘制mel频谱图。
% 使用默认设置可以计算整个音频文件的mel频谱图
[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');%从文件中读取数据,并返回样本数据y(n*1)以及该数据的采样率 Fs
S = melSpectrogram(audioIn,fs); % S为计算得到的mel频谱图
% 打印滤光片组中的带通滤光片的数量和梅尔光谱图中的帧数。
[numBands,numFrames] = size(S);
fprintf("滤波器组中的带通滤波器的数量:%d\n",numBands)
fprintf("频谱图中的帧数:%d\n",numFrames)
% 绘制梅尔频谱图。
melSpectrogram(audioIn,fs)
运行结果
滤波器组中的带通滤波器的数量:32
频谱图中的帧数:1551
% 计算2048点窗口的梅尔光谱
[audioIn,fs] = audioread('FunkyDrums-44p1-stereo-25secs.mp3');%从文件中读取数据,并返回样本数据 y 以及该数据的采样率 Fs
% 计算具有1024点重叠的2048点窗口的梅尔光谱,使用4096点FFT转换到频域,将频域表示通过64个半重叠的三角带通滤波器,其范围为62.5 Hz至8 kHz
S = melSpectrogram(audioIn,fs, ...
'WindowLength',2048,...
'OverlapLength',1024, ...
'FFTLength',4096, ...
'NumBands',64, ...
'FrequencyRange',[62.5,8e3]);
% 再次调用melSpectrogram,这一次不使用任何输出参数,可视化mel频谱图。输入音频是多声道信号。如果使用多通道输入且没有输出参数调用melSpectrogram,则仅绘制第一个通道
melSpectrogram(audioIn,fs, ...
'WindowLength',2048,...
'OverlapLength',1024, ...
'FFTLength',4096, ...
'NumBands',64, ...
'FrequencyRange',[62.5,8e3])
melSpectrogram将频域滤波器组应用于在时间上经过窗口处理的音频信号,可以从melSpectrogram获取滤波器的中心频率和与分析窗口相对应的时刻,作为第二和第三个输出参数。
获取梅尔频谱图,滤波器组中心频率以及多通道音频信号的分析窗口时刻,使用中心频率和瞬时时间绘制每个通道的mel频谱图。
% 获取筛选器库中心频率和分析窗口相对应的时刻
[audioIn,fs] = audioread('AudioArray-16-16-4channels-20secs.wav');% 从文件中读取数据,并返回样本数据 y 以及该数据的采样率 Fs
[S,cF,t] = melSpectrogram(audioIn,fs); % 计算得梅尔频谱,滤波器组中心频率以及多通道音频信号的分析窗口时刻
S = 10*log10(S+eps); % 转换为dB进行绘图
% 针对S的各个通道进行绘制
for i = 1:size(S,3)
subplot(size(S,3)/2,2,i);% 这一行替换为figure(i)即可独立输出
surf(t,cF,S(:,:,i),'EdgeColor','none');
xlabel('Time (s)')
ylabel('Frequency (Hz)')
view([0,90])
title(sprintf('Channel %d',i))
axis([t(1) t(end) cF(1) cF(end)])
end
audioIn —— 音频输入,指定为列向量或矩阵。 如果指定为矩阵,此功能会将列视为独立的音频通道。
fs —— 输入采样率(以Hz为单位),指定为正标量。
'WindowLength' — Analysis window length (samples)
round(0.03*fs) (default) | integer in the range [2, size(audioIn,1)]
样本中的分析窗口长度,即一次分析选取的信号长度。指定为以逗号分隔的一对,由 ‘WindowLength’ 和范围为 [2,size(audioIn,1)] 的整数组成。默认为输入数据采样率*0.03的值(或近似值)。
'OverlapLength' — Analysis window overlap length (samples)
round(0.02*fs) (default) | integer in the range [0, (WindowLength - 1)]
样本中的分析窗口重叠长度,即两个相邻窗口的重叠长度。指定为以逗号分隔的一对,由 ‘OverlapLength’ 和 [0,(WindowLength-1)] 范围内的整数组成。默认为输入数据采样率*0.02的值(或近似值)。
'FFTLength' — Number of DFT points
WindowLength (default) | positive integer
用于计算DFT的点数,指定为逗号分隔的对,由 ‘FFTLength’ 和大于或等于WindowLength的正整数组成。 如果未指定,则FFTLength默认为WindowLength。
'NumBands' — Number of mel bandpass filters
32 (default) | positive integer
梅尔带通滤波器的数量,指定为以逗号分隔的一对,由 ‘NumBands’ 和一个正整数组成。默认为32。
'FrequencyRange' — Frequency range over which to compute mel spectrogram (Hz)
[0 fs/2] (default) | two-element row vector
计算以赫兹为单位的梅尔频谱图的频率范围,指定为由 ‘FrequencyRange’ 和[0,fs/2]范围内单调递增的值的两元素行向量组成的逗号分隔对。默认为[0 fs/2]。
'SpectrumType' — Type of mel spectrogram
'power' (default) | 'magnitude'
梅尔频谱图的类型,指定为逗号分隔的一对,由 ‘SpectrumType’ 和 ‘power’ 或 ‘magnitude’ 组成,默认为前者。
S — Mel spectrogram
column vector | matrix | 3-D array
S为梅尔频谱图,以列向量,矩阵或3-D数组形式返回。 S的尺寸为L×M×N,其中:
L是每个mel频谱中频点的数量。 NumBand和fs确定L。
M是音频信号被分割成的帧数。 size(audioIn,1),WindowLength和OverlapLength确定M。
N是声道数,因此N = size(audioIn,2)。
尾随的单例尺寸从输出S中删除。
F — Center frequencies of mel bandpass filters (Hz)
row vector
F是梅尔带通滤波器的中心频率(以Hz为单位),以长度为size(S,1)的行向量返回。
T — Location of each window of audio (s)
row vector
T是每个音频分析窗口的位置(以秒为单位),以行向量长度size(S,1)返回。该位置对应于每个窗口的中心。
melSpectrogram函数遵循通用算法来计算mel频谱图,如[1]中所述。
在这种算法中,音频输入首先被缓冲到WindowLength个样本的帧中。帧与帧之间有OverlapLength个样本重叠。将周期性的hamming窗应用于每个帧,然后将该帧转换为具有FFTLength个点的频域表示。 频域表示可以是幅度或功率,由SpectrumType指定。频域表示的每一帧都经过一个mel滤波器组。将从mel滤波器组输出的光谱值相加,然后合并通道,以便将每个帧转换为NumBands元素列向量。
mel滤波器组设计为在梅尔刻度上等距分布的半重叠三角形滤波器。NumBands控制mel带通滤波器的数量。FrequencyRange控制mel滤波器组中第一个和最后一个滤波器的频带边缘。滤波器通过其带宽进行归一化,因此,如果将白噪声输入到系统,则每个滤波器将输出等量的能量。
[1] Rabiner, Lawrence R., and Ronald W. Schafer. Theory and Applications of Digital Speech Processing. Upper Saddle River, NJ: Pearson, 2010.