语音信号处理之多阶MFCC提取(matlab)

1. 音频分析

  1. 音频原始数据形式:8k16bitpcm;
  2. 频率范围:60HZ~3400HZ;
  3. 三角窗数量:15组;
  4. 提取filter bank特征,并观察特征分布特点;
  5. 进一步提取MFCC特征;
  6. 求取特征三阶差分并进行离线CMVN(cepstral mean and variance normalization,CMVN);
  7. 语音信号是一个非稳态、时变的信号,但是在“短时间”范围内可以认为语音信号是稳态、时不变的。在分帧过程中,往往设置在相邻两帧之间有一部分重叠。(帧移) 一般认为“短时间”范围为10~30ms,按采样频率为8kHZ来算,因此每一帧长为80-240个采样点,帧移为80个采样点。

2. Filter bank提取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. MFCC提取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 三阶差分

在这里插入图片描述在这里插入图片描述
代码:
MFCC
+qq:1095982611; 80% discount

以下是一个基本的MFCC特征提取MATLAB代码: % 定义常量 frame_size = 256; % 帧大小 frame_shift = 128; % 帧移 num_filters = 20; % 滤波器数量 num_ceps = 12; % MFCC系数数量 lifter = 22; % lifter系数 % 读取音频文件 [x, fs] = audioread('sample.wav'); % 预加重 pre_emph = [1 -0.97]; x = filter(pre_emph, 1, x); % 分帧 frames = buffer(x, frame_size, frame_size-frame_shift, 'nodelay'); % 加窗 win = hamming(frame_size); frames = frames .* repmat(win, 1, size(frames, 2)); % 计算功率谱 pow_frames = abs(fft(frames)).^2; pow_frames = pow_frames(1:frame_size/2+1, :); % 计算Mel滤波器组 mel_filters = melFilterBank(fs, num_filters, frame_size); % 应用Mel滤波器组 mel_pow_frames = mel_filters * pow_frames; % 取对数 log_mel_pow_frames = log(mel_pow_frames); % 应用DCT dct_mel_pow_frames = dct(log_mel_pow_frames); % 取MFCC系数 mfcc = dct_mel_pow_frames(1:num_ceps, :); % 应用lifter lifter_coeffs = (1:lifter)'; lifter_coeffs = sin(pi/lifter*(lifter_coeffs-0.5)); mfcc = mfcc .* repmat(lifter_coeffs, 1, size(mfcc, 2)); % 显示MFCC系数 imagesc(mfcc); colorbar; % Mel滤波器组函数 function mel_filters = melFilterBank(fs, num_filters, frame_size) % 定义频率范围 f_min = 0; f_max = fs/2; mel_min = 1125*log(1+f_min/700); mel_max = 1125*log(1+f_max/700); % 计算Mel刻度的间隔 mel_interval = (mel_max - mel_min) / (num_filters + 1); % 将Mel刻度转换为频率 freqs = 700*(exp(mel_min+(0:num_filters+1)*mel_interval/1125)-1); % 将频率转换为FFT索引 fft_indices = floor((frame_size+1)*freqs/fs); % 构建滤波器组 mel_filters = zeros(num_filters, frame_size/2+1); for i = 1:num_filters left = fft_indices(i); center = fft_indices(i+1); right = fft_indices(i+2); for j = left:center mel_filters(i, j) = (j-left)/(center-left); end for j = center+1:right mel_filters(i, j) = (right-j)/(right-center); end end end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq-120

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值