梅尔倒谱分析MFCC

梅尔倒谱系数(MFCC)是一种基于人类听觉特性的语音分析方法,用于模拟人耳对声音频率的感知。预处理包括预加重、分帧加窗和FFT转换。接着,通过梅尔滤波器组进行滤波,将频率转换到梅尔尺度,并取对数以符合人耳对声音强度的感知。通常,会使用24个梅尔滤波器,输出为24维特征向量。MFCC广泛应用于语音识别、情感分析等领域。
摘要由CSDN通过智能技术生成

梅尔倒谱系数

MFCC

梅尔频率倒谱系数的分析是基于人的听觉特性机理,即根据人的听觉实验结果来分析语音的频谱。因为人耳所能听到的声音高低与声音的频率并不成线性正比关系,所以用mel频率尺度更符合人耳的听觉特性。
在这里插入图片描述
预加重部分用一个一阶高通滤波器,目的是为了补偿高频分量的损失,提升高频分量。滤波器常设为:
在这里插入图片描述
分帧:把每一帧信号当作稳定信号来处理。

加窗:减少频谱泄漏。

FFT:把时域转化为频域,计算谱线能量。

mel滤波:

MEL滤波器滤波:

梅尔频率尺度和实际频率的对应关系
在这里插入图片描述
在这里插入图片描述
美尔滤波器的传递函数
在这里插入图片描述
在梅尔频

以下是在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` 函数实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值