【音频处理】梅尔频率倒谱系数(MFCC)

闲来无事,整理了一下一些大学的学习音频处理的一些资料,当时用的是matlab,记录一下。

MFCC简介

梅尔频率倒谱系数(Mel-frequency cepstral coefficients 简称MFCC)。是在Mel标度频率域提取出来的倒谱参数,Mel标度描述了人耳频率的非线性特性,极好的模拟了人类听觉感知的处理。

matlab实现

MFCC与频率的关系是:
其中f为频率,单位为Hz在这里插入图片描述MFCC的基本步骤为:在这里插入图片描述
使用matlab实现:先是使用audioread函数导入wav数据,返回样本数据 x 以及该数据的采样率 Fs
首先是进行预加重。预加重,其实预加重就是相当于一个高通滤波器,滤波器函数在matlab中实现如:x=filter([1-alpha],1,x);其中,alpha就是预加重系数,speech还是原来得到的语音信号。预加重系数通常取在[0.95,0.97]区间取值。
接下来是分帧,在matlab中,分帧可以使用enframe函数解决,enframe函数将信号分成帧,每行一帧。调用格式形如:y=enframe(x,framelength,step)。enframe函数对x进行分帧,每帧长framelength,分得的帧数是nf = fix((nx-framelength+step)/step);
加窗,对于加窗,首先是进行窗函数的选择,在诸多窗函数中,目前应用最广泛的就是汉明窗。在matlab中,汉明窗在matlab中有自己的函数hamming(256)。将每一帧乘以汉明窗。在matlab中调用循环,将分好的帧乘以汉明窗函数,在matlab中,分好的帧以行的形式存在,将每一行乘以汉明窗。
接着是做快速傅里叶,将处理完的信号做FFT,在matlab中,fft(x)是FFT函数对x进行FFT处理。将FFT处理完的信号取绝对值或是平方值,假设取平方值,得到处理完的信号。
Mel滤波,在matlab中,先设定mel滤波系数,matlab函数melbankm,滤波器个数一般取20~26个。调用函数,将处理完的矩阵做全矩阵和归一化处理。得到mel滤波器系数。 接下来在mel频谱上进行到倒谱分析,在matlab中设置归一化倒谱提升窗口,对FFT参数进行mel滤波再进行倒谱分析。取对数,做逆变换,实际逆变换一般是通过DCT离散余弦变换来实现。设置DCT参数,做DCT运算后乘上倒谱系数得到MFCC参数。
最后,对数字信号做一阶差分处理,使得信号变得平滑,得到最后结果。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在Matlab中提取翻转梅尔频率倒谱系数MFCC)的示例代码: ```matlab % 读取音频文件 [y, Fs] = audioread('example.wav'); % 预处理:对信号进行预加重,使用高通滤波器 preemph = [1, -0.97]; y = filter(preemph, 1, y); % 帧分割:将信号分为若干个帧 frame_size = 0.025; % 帧长(单位:秒) frame_shift = 0.01; % 帧移(单位:秒) frame_length = frame_size * Fs; % 帧长(单位:采样点) frame_step = frame_shift * Fs; % 帧移(单位:采样点) num_frames = floor((length(y) - frame_length) / frame_step) + 1; frames = zeros(frame_length, num_frames); for i = 1:num_frames start_idx = (i-1) * frame_step + 1; frames(:, i) = y(start_idx : start_idx + frame_length - 1); end % 加窗:对每个帧进行汉明窗加窗 window = hamming(frame_length); frames = bsxfun(@times, frames, window); % 快速傅里叶变换:对每个帧进行FFT计算 NFFT = 512; fft_frames = fft(frames, NFFT, 1); % 能量谱:计算每个帧的能量谱 power_frames = abs(fft_frames).^2 / NFFT; % 梅尔滤波器组:计算梅尔滤波器组的系数 num_filters = 20; mel_low_freq = 0; % 梅尔滤波器组的最低频率 mel_high_freq = 2595 * log10(1 + (Fs/2) / 700); % 梅尔滤波器组的最高频率 mel_points = linspace(mel_low_freq, mel_high_freq, num_filters + 2); hz_points = 700 * (10.^(mel_points / 2595) - 1); bin = floor((NFFT + 1) * hz_points / Fs); fbank = zeros(num_filters, NFFT / 2 + 1); for m = 1:num_filters f_m_minus = bin(m); f_m = bin(m+1); f_m_plus = bin(m+2); for k = f_m_minus:f_m fbank(m, k+1) = (k - bin(m)) / (bin(m+1) - bin(m)); end for k = f_m:f_m_plus fbank(m, k+1) = (bin(m+2) - k) / (bin(m+2) - bin(m+1)); end end % 翻转梅尔频率倒谱系数:计算每个帧的MFCC num_ceps = 12; mfcc = zeros(num_ceps, num_frames); for i = 1:num_frames % 将能量谱乘以梅尔滤波器组的系数,得到每个滤波器的输出能量 filter_energies = fbank * power_frames(:, i); % 取对数,得到滤波器组的对数输出能量 log_filter_energies = log(filter_energies + eps); % 对上面的对数输出能量进行离散余弦变换(DCT) mfcc(:, i) = dct(log_filter_energies); % 取前 num_ceps 个系数作为MFCC mfcc(:, i) = mfcc(1:num_ceps, i); end % 翻转MFCC:对每个MFCC向量进行翻转 rfcc = flipud(mfcc); ``` 以上代码中,翻转MFCC的操作是通过 `flipud` 函数实现的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值