9.5. SRC变采样

概述

  • SRC变采样模块用于将输入的音频信号从一个采样频率转换为另一个采样频率输出

  • 详细参数设置可参考例程 apps/common/example/audio/src_test

9.5.1. 使用原理

  • SRC变采样主要用于
    • 1.做n倍插值,即低采样率转换为高采样率

    • 2.做n倍抽样,即高采样率转换为低采样率

  • SRC模块直接支持1-8条通道的转换,前提是这些通道具有相同的转换设置。如果转换设置不同,则需要软件配合做分次转换。

  • in_chinc和in_spinc用于设置输入数据的组织结构,out_chinc和out_spinc用于设置输出数据的组织结构,建议使用交织方式存放

  • 顺序方式为ch0dat0 ch0dat1 … ch0datN ch1dat0 ch1dat1 …

  • 交织方式为ch0dat0 ch1dat0 ch0dat1 ch1dat1 … ch0datN ch1datN

  • 当为单通道时,数据只能为顺序方式

  • 当为多通道时,可为:
    • 输入:交织方式 输出:交织方式

    • 输入:交织方式 输出:顺序方式

    • 输入:顺序方式 输出:交织方式

    • 输入:顺序方式 输出:顺序方式

  • in_len和out_len为用于一次转换的输入和输出数据的数目即长度,由于进行变采样的操作进行插值或者抽样,输入数据和输出数据数目是不一样的,当其中有一个数目完成时,本次转换过程就会停止

/**
* @brief src配置参数结构体
*/
typedef struct {
    u8 nchannel;        /*!< 一次转换的通道个数,取舍范围(1 ~ 8),最大支持8个通道 */
    u8 reserver[3];     /*!< 未使用 */
    u16 in_rate;        /*!< 输入采样率 */
    u16 out_rate;       /*!< 输出采样率 */
    u16 in_chinc;       /*!< 输入方向,多通道转换时,每通道数据的地址增量 */
    u16 in_spinc;       /*!< 输入方向,同一通道后一数据相对前一数据的地址增量 */
    u16 out_chinc;      /*!< 输出方向,多通道转换时,每通道数据的地址增量 */
    u16 out_spinc;      /*!< 输出方向,同一通道后一数据相对前一数据的地址增量 */
    s16 *in_addr;           /*!< 输入数据地址指针 */
    u32 in_len;                     /*!< 输入数据长度 */
    s16 *out_addr;          /*!< 输出数据地址指针 */
    u32 out_len;            /*!< 输入数据长度 */
    void (*output_cbk)(void *priv, u8 *, u16, u8); /*!< 一次转换完成后,输出中断会调用此函数用于接收输出数据,数据量大小由outbuf_len决定 */
    void *priv;                     /*!< 指针 */
} src_param_t;

/**
    * @brief src滤波器参数结构体
    */
    typedef struct {
        u16 fltb_buf[24 * 2]; /*!< 滤波器buf */
        u32 phase;                    /*!< 相位 */
        u8 fltb_offset;       /*!< 滤波器偏移量 */
    } src_fltb_t;

9.5.1.1. 应用示例

  • apps/demo/demo_DevKitBoard/include/demo_config.h 打开 #define USE_SRC_TES 宏使用,例程文件为 apps/common/example/audio/src_test/main.c

  • 该例子中以正弦波pcm数据作为输入数据,进行采样率16k转8k的操作

  • situaiton四种状况:
    • situaiton=0 输入:交织方式 输出:交织方式

    • situaiton=1 输入:交织方式 输出:顺序方式

    • situaiton=2 输入:顺序方式 输出:交织方式

    • situaiton=3 输入:顺序方式 输出:顺序方式

  • 查看例程效果:

  • 将打印出来的输入输出数据使用winhex软件生成文件后,将文件以原始数据导入音频分析软件后可查看变采样前后数据结果

  • 1.打开winhex新建文件选择1byte

  • 2.winhex将打印输出的situation = 0的bufin数据从文件开头复制后选择

  • 3.winhex保存数据文件,任意取文件名不需加格式

  • 4.打开音频分析软件Audacity,选择 文件-导入-原始数据 bufin采样率选择16k bufout采样率选择8k

  • 5.situation = 0的bufout数据重复上述步骤

  • 下图为situaiton=0 输入(交织方式) 输出(交织方式),上方双通道为输入数据采样率16k正弦波数据,下方双通道为变采样后采样率8k正弦波数据

9.5.2. API参考

struct src_param_t
struct src_fltb_t