# MFCC — MindSpore Signal+ 使用手册 alpha 文档

# MFCC

计算梅尔频率倒谱系数（Mel-Frequency Cepstral Coefficients）。

\[MFCC_i = f(Input_i)\]

输入：

  - mfcc_params - MFCC 计算相关的配置参数，如采样率、梅尔滤波器数量等。

  - spec_params - 频谱计算参数，定义了FFT窗口大小、重叠长度等。

  - mfcc_workspace - 工作空间参数，包括计算所需的中间缓冲区。

  - spec_workspace - 频谱计算的工作空间，包括FFT的窗口、输入数据等。

  - core_mask (可选) - 核掩码（仅适用于多核版本）。

输出：

  - output(mfcc_params中) - 计算结果地址，存储MFCC特征。

  - output_shape(mfcc_params中) - 输出数据的形状，描述MFCC特征的维度。

结构体定义：

       1    typedef struct {
       2        // 输入/输出
       3        float* input;           // 输入数据地址
       4        int* input_shape;       // 输入数据形状
       5        float* output;          // 输出数据地址
       6        int* output_shape;      // 输出数据形状
       7
       8        // 配置参数
       9        int sample_rate;        // 采样率
      10        int n_mfcc;            // MFCC系数数量
      11        int dct_type;           // DCT变换类型
      12        bool log_mels;          // 是否对梅尔频谱取对数
      13        float f_min;            // 最小频率
      14        float f_max;            // 最大频率
      15        int n_mels;             // 梅尔滤波器数量
      16        NormType norm;          // 归一化类型
      17        NormMode norm_M;        // 归一化模式
      18        MelType mel_scale;      // 梅尔尺度类型
      19    } MfccParam;
      20
      21    typedef struct {
      22        // 输入
      23        float* input;           // 输入数据地址
      24        int input_len;          // 输入数据长度
      25
      26        // 输出
      27        float* output;          // 输出数据地址
      28        int* output_shape;      // 输出数据形状
      29
      30        // 配置参数
      31        int pad;                // 填充大小
      32        WindowType window_type; // 窗函数类型
      33        int n_fft;              // FFT点数
      34        int hop_length;         // 帧移长度
      35        int win_length;         // 窗长度
      36        float power;            // 功率值
      37        bool normalized;        // 是否归一化
      38        bool center;            // 是否中心化
      39        BorderType pad_mode;    // 填充模式
      40        bool onesided;          // 是否单边频谱
      41    } SpectrogramParam;
      42
      43    typedef struct {
      44        // 滤波器组计算缓冲区
      45        float *all_freqs;       // 所有频率点
      46        float *m_pts;           // 梅尔频率点
      47        float *f_pts;           // 线性频率点
      48        float *fb;              // 滤波器组
      49
      50        // 三角滤波器计算缓冲区
      51        float *f_diff;          // 频率差值
      52        float *slopes;          // 斜率
      53        float *down_slopes;     // 下降斜率
      54        float *up_slopes;       // 上升斜率
      55
      56        // DCT变换缓冲区
      57        float* dct_mat;         // DCT矩阵
      58
      59        // 中间结果缓冲区
      60        float* spectrogram_output;          // 频谱图输出
      61        float* mel_spectrogram_output;      // 梅尔频谱输出
      62    } MfccWorkspaceParam;
      63
      64    typedef struct {
      65        float* fft_window;          // FFT窗函数缓冲区
      66        float* fft_window_later;    // 后续FFT窗缓冲区
      67        float* input_data_pad;      // 填充后的输入数据
      68        float* input_data;          // 输入数据缓冲区
      69        float* input_win;           // 加窗输入数据
      70        float* exp_complex;         // 复数指数缓冲区
      71        float* spec_f;              // 频谱频率缓冲区
      72        float* output_onsided;      // 单边输出缓冲区
      73    } WorkspaceParam;

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持 fp32

- MT7004 支持 fp32, fp16

共享存储版本:

void fp_mfcc_s(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace, int core_mask)

void hp_mfcc_s(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace, int core_mask)

  C调用示例：

       1//FT78NE示例
       2#include <stdio.h>
       3
       4int main(int argc, char* argv[]) {
       5    float* input_data = (float*)0x81000000;
       6    float* output_mfcc = (float*)0x82000000;
       7    int input_shape[2] = {1, 4000};
       8    int output_shape[2] = {0, 0, 0};
       9    MfccParam* mfcc_params = (MfccParam*)0x83100000;
      10    SpectrogramParam* spec_params = (SpectrogramParam*)0x83200000;
      11    MfccWorkspaceParam* mfcc_workspace = (MfccWorkspaceParam*)0x83300000;
      12    WorkspaceParam* spec_workspace = (WorkspaceParam*)0x83400000;
      13
      14    mfcc_params->input = input_data;
      15    mfcc_params->input_shape = input_shape;
      16    mfcc_params->output = output_mfcc;
      17    mfcc_params->output_shape = output_shape;
      18    mfcc_params->sample_rate = 800;
      19    mfcc_params->n_mfcc = 6;
      20    mfcc_params->dct_type = 2;
      21    mfcc_params->log_mels = true;
      22    mfcc_params->f_min = 0.0f;
      23    mfcc_params->f_max = 400.0f;
      24    mfcc_params->n_mels = 8;
      25    mfcc_params->norm = NORM_SLANEY;
      26    mfcc_params->norm_M = NORM_MODE_ORTHO;
      27    mfcc_params->mel_scale = MEL_HTK;
      28
      29    // 结构体 2: SpectrogramParam
      30    spec_params->pad = 0;
      31    spec_params->window_type = kHann;
      32    spec_params->n_fft = 32;
      33    spec_params->hop_length = 16;
      34    spec_params->win_length = 32;
      35    spec_params->power = 2.0f;
      36    spec_params->normalized = false;
      37    spec_params->center = false;
      38    spec_params->pad_mode = kConstant;
      39    spec_params->onesided = true;
      40
      41    int core_mask = 0xff;
      42    //为mfcc_workspace和spec_workspace里每个中间缓冲区指针分配地址
      43    //...
      44
      45    fp_mfcc_s(mfcc_params, spec_params, mfcc_workspace, spec_workspace, core_mask);
      46    return 0;
      47}

私有存储版本:

void fp_mfcc_p(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace)

void hp_mfcc_p(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace)

  C调用示例：

       1//FT78NE示例
       2#include <stdio.h>
       3
       4int main(int argc, char* argv[]) {
       5    MfccParam mfcc_params;
       6    SpectrogramParam spec_params;
       7    MfccWorkspaceParam mfcc_workspace;
       8    WorkspaceParam spec_workspace;
       9
      10    float* input_data = (float*)0x10810000;
      11    float* output_mfcc = (float*)0x10820000;
      12    int input_shape[2] = {1, 4000};
      13    int output_shape[2] = {0, 0, 0};
      14
      15    mfcc_params.input = input_data;
      16    mfcc_params.input_shape = input_shape;
      17    mfcc_params.output = output_mfcc;
      18    mfcc_params.output_shape = output_shape;
      19    mfcc_params.sample_rate = 800;
      20    mfcc_params.n_mfcc = 6;
      21    mfcc_params.dct_type = 2;
      22    mfcc_params.log_mels = true;
      23    mfcc_params.f_min = 0.0f;
      24    mfcc_params.f_max = 400.0f;
      25    mfcc_params.n_mels = 8;
      26    mfcc_params.norm = NORM_SLANEY;
      27    mfcc_params.norm_M = NORM_MODE_ORTHO;
      28    mfcc_params.mel_scale = MEL_HTK;
      29
      30    // 结构体 2: SpectrogramParam
      31    spec_params.pad = 0;
      32    spec_params.window_type = kHann;
      33    spec_params.n_fft = 32;
      34    spec_params.hop_length = 16;
      35    spec_params.win_length = 32;
      36    spec_params.power = 2.0f;
      37    spec_params.normalized = false;
      38    spec_params.center = false;
      39    spec_params.pad_mode = kConstant;
      40    spec_params.onesided = true;
      41
      42    //为mfcc_workspace和spec_workspace里每个中间缓冲区指针分配地址
      43    //...
      44
      45    fp_mfcc_p(&mfcc_params, &spec_params, &mfcc_workspace, &spec_workspace);
      46    return 0;
      47}