mfcc提取c函数
### MFCC提取C函数知识点详解 #### 一、MFCC简介 MFCC(Mel Frequency Cepstral Coefficients,梅尔频率倒谱系数)是一种广泛应用于语音识别与处理中的特征提取方法。它模拟了人耳对不同频率声音的感知特性,并通过一系列数学变换将语音信号转换为一组特征向量,以便于进行后续的分析或识别任务。 #### 二、关键参数解析 根据提供的代码片段,我们可以看到几个重要的参数定义: - `FE_CEP_ORDER`: 定义了倒谱系数的数量,包括`c0`在内共13个系数。 - `FE_DELTA` 和 `FE_DDELTA`: 分别表示一阶差分和二阶差分的阶数,用于计算动态特征。 - `FE_NUM_CHANNELS`: 梅尔滤波器组的通道数量,通常设置为23或更少。 - `FE_FBANK_FLOOR`, `FE_MIN_ENERGY`, `FE_MIN_LOG_ENERGY`: 用于滤波器组的能量阈值设定,确保能量值在合理的范围内。 - `M_PI`: 圆周率的近似值,常用于数学运算。 #### 三、关键结构体与函数 - **结构体**: - `MfccMelFB`: 用于定义梅尔滤波器组的基本属性,如低频、中心频和高频等。 - `WfMelFB`: 类似于`MfccMelFB`,但增加了`sumWeight`成员,用于噪声抑制的梅尔滤波器组。 - **函数**: - `preemphasize`: 预加重函数,通过对原始信号进行滤波来强调高频部分,提高语音清晰度。 - `preprocessing`: 预处理函数,通常包含预加重步骤及其它预处理操作。 - `Do_hamm_window`: 汉明窗函数,用于减少频谱泄漏。 - `mel_cepstrum_basic`: 基本的梅尔倒谱计算函数。 - `MfccInitDCTMatrix`: 初始化离散余弦变换矩阵,用于计算MFCC系数。 - `_mel_cepstrum_basic`: 一个内部函数,用于实现`mel_cepstrum_basic`功能。 - `MfccInitMelFilterBanks`: 初始化梅尔滤波器组。 - `LogE`: 自然对数函数,用于计算能量值的对数。 - `PRFFT_NEW`: 快速傅里叶变换(FFT)函数,用于将时域信号转换到频域。 - `MfccMelFilterBank`: 梅尔滤波器组应用函数,将频域信号映射到梅尔频率尺度上。 - `_filterbank_basic`: 内部函数,用于实现梅尔滤波器组的功能。 - `MfccDCT`: 应用离散余弦变换(DCT)的函数,用于计算MFCC系数。 #### 四、核心流程解析 1. **预处理**:包括预加重、加窗等操作。 2. **快速傅里叶变换(FFT)**:将时间域信号转换为频域信号。 3. **梅尔滤波器组**:将频域信号通过梅尔滤波器组转换为梅尔频率尺度上的能量谱。 4. **离散余弦变换(DCT)**:将梅尔能量谱转换为梅尔频率倒谱系数(MFCC)。 5. **动态特征提取**:计算MFCC的一阶差分和二阶差分,以捕获语音信号的时间变化特性。 #### 五、具体实现细节 - **预加重**:通过简单的数字滤波器实现,其传递函数形式为\(H(z) = 1 - \alpha z^{-1}\),其中\(\alpha\)为预加重系数。 - **汉明窗**:用于减少频谱泄漏,公式为\(w(n) = 0.54 - 0.46 \cos \left(\frac{2 \pi n}{N - 1}\right)\),其中\(N\)是窗口长度。 - **初始化梅尔滤波器组**:涉及计算每个滤波器的中心频率及其带宽,以及滤波器组的起始频率。 - **离散余弦变换**:用于计算MFCC系数的核心步骤,通常使用预先计算好的DCT矩阵。 通过以上分析,我们了解到MFCC提取的整个过程,以及实现这一过程所需的各个组件和步骤。这些知识点对于理解并实现基于C语言的MFCC提取算法具有重要意义。
mfcc.h
// Cepstrum
#define FE_CEP_ORDER 12 /* Number of cepstral coefficients is CEPORDER+1 including c0 */
// Dynamic features
#define FE_DELTA 5 /* Order of delta coefficients */
#define FE_DDELTA 3 /* Order of acceleration (delta-delta) coefficients */
// Filter bank
#define FE_NUM_CHANNELS 23 /* Number of bands in filter bank */
#define FE_FBANK_FLOOR (-50.0) /* Energy floor for filter bank coefficients */
#define FE_MIN_ENERGY (1)
#define FE_MIN_LOG_ENERGY (0)
#define M_PI 3.14159265358979323846
#define NR_NUM_CHANNELS 23
#define NR_FL 17
typedef struct { /* mel filter banks */
int m_lowX;
int m_centerX;
int m_highX;
} MfccMelFB;
typedef struct {
int m_lowX;
int m_centerX;
int m_highX;
float m_sumWeight;
int preemphasize(float *sample, int sampleN);
int preprocessing(short *sample, int sampleN, float *out);
int Do_hamm_window(float *inputA, int inputN);
int mel_cepstrum_basic(short *sample, int frameSize, float *mel_cep, int ceporder, int fft_size);
int MfccInitDCTMatrix (float *dctMatrix, int ceporder, int numChannels);
int _mel_cepstrum_basic(float *sample, int frameSize, float *mel_cep, int fborder, int ceporder, int fft_size);
void MfccInitMelFilterBanks (float startingFrequency, float samplingRate, int fftLength, int numChannels);
float LogE(float x);
void PRFFT_NEW(float *a, float *b, int m, int n_pts, int iff);
void MfccMelFilterBank (float *sigFFT, int numChannels, float* output, int normalize);
int _filterbank_basic(float *sample, int frameSize, float *filter_bank, int fborder, int fftSize, int cep_smooth, int cepFilterLen);
void MfccDCT (float *x, float *dctMatrix, int ceporder, int numChannels, float *mel_cep);
mfcc.c
#include "mfcc.h"
#include <math.h>
#include <stdio.h>
int m_cepOrder = 12;
int m_fbOrder = 23;
float m_dctMatrix[(12+1)*23];
int m_sampleRate=32000;
WfMelFB m_MelFB[23];
float m_MelWeight[512/2+1];
剩余12页未读,继续阅读
- wuyougaozhen2013-05-09还可以吧,也没用得着
- lwchao2371302013-02-26效果一般 测试来数值与AD转换后大小有关
- brave1myth2013-04-17我一共下了将近十个mfcc提取程序,没一个结果是一样的。。。。
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助