AudioSpectrogram
===================

音频频谱（Audio Spectrogram）是一种常用的音频信号特征表示方式，通过将时域音频信号转换为频域信号，提供了时间和频率的双重信息。

参数说明：
    - **params** - 频谱图参数配置结构体指针
    - **workspace** - 工作空间缓冲区结构体指针
    - **core_mask** - 核掩码，指定参与计算的处理器核（仅共享存储版本）

**结构体定义：**
    .. code-block:: c
        :linenos:

            typedef struct {
                // 输入
                float* input;           // 输入数据地址
                int input_len;          // 输入数据长度
                
                // 输出
                float* output;          // 输出数据地址
                int* output_shape;      // 输出数据形状
                
                // 配置参数
                int pad;                // 填充大小
                WindowType window_type; // 窗函数类型
                int n_fft;              // FFT点数
                int hop_length;         // 帧移长度
                int win_length;         // 窗长度
                float power;            // 功率值
                bool normalized;        // 是否归一化
                bool center;            // 是否中心化
                BorderType pad_mode;    // 填充模式
                bool onesided;          // 是否单边频谱
            } SpectrogramParam;
            typedef struct {
                float* fft_window;          // FFT窗函数缓冲区
                float* fft_window_later;    // 后续FFT窗缓冲区
                float* input_data_pad;      // 填充后的输入数据
                float* input_data;          // 输入数据缓冲区
                float* input_win;           // 加窗输入数据
                float* exp_complex;         // 复数指数缓冲区
                float* spec_f;              // 频谱频率缓冲区
                float* output_onsided;      // 单边输出缓冲区
            } WorkspaceParam;
支持平台：
    ``FT78NE``  
    ``MT7004``  

.. note::
    - FT78NE 支持 fp32
    - MT7004 支持 fp32   

**共享存储版本：**

.. c:function:: void fp_audio_spectrogram_s(SpectrogramParam* params, WorkspaceParam* workspace, int core_mask)

    **C调用示例：**

    .. code-block:: c
        :linenos:
        :emphasize-lines: 30

        //FT78NE示例
        #include <stdio.h>
        
        int main(int argc, char* argv[]) {
            float* input_data = (float*)0x81000000;
            float* output = (float*)0x82000000;
            int output_shape[2] = {0, 0, 0};
            SpectrogramParam* spec_params = (SpectrogramParam*)0x83200000;
            WorkspaceParam* spec_workspace = (WorkspaceParam*)0x83400000;

            // 结构体 SpectrogramParam
            spec_params->input = input_data;
            spec_params->input_len = 4000;
            spec_params->output = output;
            spec_params->output_shape = output_shape;
            spec_params->pad = 0;
            spec_params->window_type = kHann;
            spec_params->n_fft = 32;
            spec_params->hop_length = 16;
            spec_params->win_length = 32;
            spec_params->power = 2.0f;
            spec_params->normalized = false;
            spec_params->center = false;
            spec_params->pad_mode = kConstant;
            spec_params->onesided = true;

            int core_mask = 0xff;
            //spec_workspace里每个中间缓冲区指针分配地址
            //...
            fp_audio_spectrogram_s(spec_params, spec_workspace, core_mask);
            return 0;
        }

**私有存储版本:**

.. c:function:: void fp_audio_spectrogram_p(SpectrogramParam* params, WorkspaceParam* workspace)

    **C调用示例：**

    .. code-block:: c
        :linenos:
        :emphasize-lines: 29

        //FT78NE示例
        #include <stdio.h>
        
        int main(int argc, char* argv[]) {
            float* input_data = (float*)0x10810000;
            float* output_mfcc = (float*)0x10820000;
            SpectrogramParam* spec_params = (SpectrogramParam*)0x10830000;
            WorkspaceParam* spec_workspace = (WorkspaceParam*)0x10840000;
            int output_shape[2] = {0, 0, 0};

            spec_params->input = input_data;
            spec_params->input_len = 4000;
            spec_params->output = output;
            spec_params->output_shape = output_shape;
            spec_params->pad = 0;
            spec_params->window_type = kHann;
            spec_params->n_fft = 32;
            spec_params->hop_length = 16;
            spec_params->win_length = 32;
            spec_params->power = 2.0f;
            spec_params->normalized = false;
            spec_params->center = false;
            spec_params->pad_mode = kConstant;
            spec_params->onesided = true;

            //为spec_workspace里每个中间缓冲区指针分配地址
            //...

            fp_audio_spectrogram_p(spec_params, spec_workspace);
            return 0;
        }
