跳转至

SGS SRC 算法使用参考

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 09/12/2020
    1.1
  • Modified API
  • 10/15/2020
    1.2
  • Added new low pass filter
  • 06/01/2021
    1.21
  • Added some details about point number
  • 08/18/2022
    1.22
  • Added some details about channel number
  • 12/15/2022
    1.3
  • Add 24kHz sample rate
  • 12/20/2023
    1.31
  • Add Json API description
  • 12/09/2024
    1.32
  • Update file description and copyright
  • 04/24/2025
    1.33
  • Remove copyright
  • 05/14/2025
    1.34
  • Corrected format
  • 10/28/2025
    1.35
  • Add and update description of Chapter 1
  • 11/25/2025

    1. 概述


    1.1. 算法说明

    SRC(Sample Rate Conversion)重采样,用于对音频流做采样频率转换,以获取不同采样频率的音频流。

    关键词说明

    采样频率: 每秒从连续讯号中取样的样本数。

    注意

    为方便调试和确认算法效果,需要用户应用自行实现替换算法参数和抓取音频数据的逻辑。


    1.2. 基本结构

    当SRC算法配置好内存、完成参数初始化与设定后,SRC只需要输入讯号Buffer,并将输入讯号Buffer按设定参数与算法处理后,将转换取样率后的结果输出到SRC输出讯号Buffer。


    1.3. 功能介绍

    重采样 :

    16K取样率下采样至8K之范例:

    16K取样率上采样至48K之范例:

    所有可支持的取样率转换请参考 SrcConversionMode


    1.4. 应用场景

    转换取样率至相关应用之需求,例如不同音讯设备间的取样率匹配问题。


    1.5. 芯片差异说明

    在不同系列芯片,目前SRC算法效果上没有差异。


    1.6. 实例介绍

    使用SRC API获取SRC算法运行需要的内存大小、初始化SRC算法handle并配置相关参数、运行SRC算法与释放SRC算法资源。

        #include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
        #include <fcntl.h>
        #include <string.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <sys/time.h>
    
        #include "AudioSRCProcess.h"
    
    
        float AVERAGE_RUN(int a)
        {
            static unsigned int num = 0;
            static float avg = 0;
            if(num == 0) avg = 0;
            num++;
            avg = avg + ((float)a - avg) / ((float)num);
            return avg;
        }
        unsigned int _OsCounterGetMs(void)
        {
            struct  timeval t1;
            gettimeofday(&t1,NULL);
            unsigned int T = ( (1000000 * t1.tv_sec)+ t1.tv_usec ) / 1000;
            return T;
        }
    
        typedef struct{
            char chunkID[4];
            int chunkSize;
            char format[4];
            char subchunk1ID[4];
            int subchunk1Size;
            short audioFormat;
            short numChannels;
            int sampleRate;
            int byteRate;
            short blockAlign;
            short bitsPerSample;
            char subchunk2ID[4];
            int subchunk2Size;
        }WaveHeaderStruct;
    
        WaveHeaderStruct Header_struct;
    
        void SetWaveHeader(int newSampleRate, char newBitDepth, char newNumChans)
        {
        // set all the ASCII literals
        memcpy(Header_struct.chunkID, "RIFF", 4);
        memcpy(Header_struct.format, "WAVE", 4);
        memcpy(Header_struct.subchunk1ID, "fmt ", 4);
        memcpy(Header_struct.subchunk2ID, "data", 4);
    
        // set all the known numeric values
        Header_struct.audioFormat = 1;
        Header_struct.chunkSize = 36;
        Header_struct.subchunk1Size = 16;
        Header_struct.subchunk2Size = 0;
    
        // set the passed-in numeric values
        Header_struct.sampleRate = newSampleRate*1000;
        Header_struct.bitsPerSample = newBitDepth;
        Header_struct.numChannels = newNumChans;
    
        // calculate the remaining dependent values
        Header_struct.blockAlign = Header_struct.numChannels * Header_struct.bitsPerSample / 8;
        Header_struct.byteRate = Header_struct.sampleRate * Header_struct.blockAlign;
        }
    
        void WaveHeaderUpdate(int numBytes)
        {
            Header_struct.subchunk2Size = numBytes;
            Header_struct.chunkSize = Header_struct.subchunk2Size + 36;
        }
    
        void WaveHeaderInfo(int* dataArray)
        {
        memcpy(dataArray, &Header_struct, (char) sizeof(Header_struct));
        }
    
        int GetHeaderResult(int numBytes, int* dataArray)
        {
            WaveHeaderUpdate(numBytes);
            WaveHeaderInfo(dataArray);
            return 0;
        }
    
        int GetSrcOutSampleRate(SrcConversionMode mode)
        {
            int outsamplerate;
            switch (mode)
            {
            case SRC_8k_to_16k:
                outsamplerate = SRATE_16K;
                break;
            case SRC_8k_to_32k:
                outsamplerate = SRATE_32K;
                break;
            case SRC_8k_to_48k:
                outsamplerate = SRATE_48K;
                break;
            case SRC_16k_to_8k:
                outsamplerate = SRATE_8K;
                break;
            case SRC_16k_to_32k:
                outsamplerate = SRATE_32K;
                break;
            case SRC_16k_to_48k:
                outsamplerate = SRATE_48K;
                break;
            case SRC_32k_to_8k:
                outsamplerate = SRATE_8K;
                break;
            case SRC_32k_to_16k:
                outsamplerate = SRATE_16K;
                break;
            case SRC_32k_to_48k:
                outsamplerate = SRATE_48K;
                break;
            case SRC_48k_to_8k:
                outsamplerate = SRATE_8K;
                break;
            case SRC_48k_to_16k:
                outsamplerate = SRATE_16K;
                break;
            case SRC_48k_to_32k:
                outsamplerate = SRATE_32K;
                break;
            }
            return outsamplerate;
        }
        int main(int argc, char *argv[])
        {
            //For file I/O
            char infile_name[512],outfile_name[512];
            // char old_header[100],
            char new_header[100];
            FILE *fin, *fout;
            int total_size = 0, counter = 0;
            int WaveOut_srate = 0;
            ALGO_SRC_RET ret = 0;
            unsigned int T0, T1;
            float avg = 0;
            unsigned int frame_size = (256); // Support 256, 512, 1024 and 2880
    
            //For Lib usage
            char *working_buf_ptr;
            short audio_input[frame_size*2], audio_output[frame_size*12];
            int OutputSampleNum;
            unsigned int buf_size;
            SRCStructProcess src_struct;
    
            /*Specify input/output file */
            if (argc > 1)
                strcpy(infile_name, argv[1]);
            else
                sprintf(infile_name, "./../sample/data/Sweep_48000_6s_stereo.wav");
    
            fin = fopen(infile_name, "rb");
            if (!fin)
            {
                fprintf(stderr, "Error opening file: %s\n", infile_name);
                return -1;
            }
    
            /* SRC parameter setting */
            src_struct.WaveIn_srate = SRATE_48K;
            src_struct.channel = 2;
            src_struct.mode = SRC_48k_to_8k;
            src_struct.order = ORDER_HIGH;
            src_struct.point_number = frame_size;
            printf("Supported sample rate : 8k, 16k, 32k, 48k Hz\n");
    
    
            //Set output file header
            WaveOut_srate = GetSrcOutSampleRate(src_struct.mode);
            SetWaveHeader(WaveOut_srate,16,src_struct.channel);
            printf("output sample rate = %dk\n",WaveOut_srate);
            if(src_struct.channel ==2)
                sprintf(outfile_name, "./SRC_Out_%d_%dK_stereo.pcm",src_struct.WaveIn_srate, WaveOut_srate);
            else
                sprintf(outfile_name, "./SRC_Out_%d_%dK_mono.pcm"  ,src_struct.WaveIn_srate, WaveOut_srate);
    
            fout = fopen(outfile_name, "wb");
            if (!fout)
            {
                fprintf(stderr, "Error opening file: %s\n", outfile_name);
                return -1;
            }
    
            /* SRC init */
            buf_size = IaaSrc_GetBufferSize(src_struct.mode);
            working_buf_ptr = malloc(buf_size);
            SRC_HANDLE handle = IaaSrc_Init(working_buf_ptr, &src_struct);
    
            //main process
    
            fread(audio_input, sizeof(char), 44, fin);
            while(fread(audio_input, sizeof(short), frame_size*src_struct.channel, fin))
            {
                counter++;
                /* Run SRC process */
                T0  = (long)_OsCounterGetMs();
                ret = IaaSrc_Run(handle, audio_input,audio_output, &OutputSampleNum);
                T1  = (long)_OsCounterGetMs();
                avg += (T1 - T0);
                if(ret != 0)
                {
                    printf("Error occured in Sampling rate converter\n");
                    return -1;
                }
                //write output file information
                total_size += src_struct.channel*OutputSampleNum*sizeof(short);
                fwrite(audio_output, sizeof(short), src_struct.channel*OutputSampleNum, fout);
            }
            GetHeaderResult(total_size,(int*)new_header);
            fseek(fout,0,SEEK_SET);
            fwrite(new_header, sizeof(char),44, fout);
            avg /= counter;
            printf("AVG is %.2f ms\n",avg);
    
            fclose(fin);
            fclose(fout);
            IaaSrc_Release(handle);
            free(working_buf_ptr);
            printf("SRC done\n");
        return 0;
        }
    

    使用SRC API读取SRC json档参数、获取SRC算法运行需要的内存大小、初始化SRC算法handle并配置相关参数、运行SRC算法与释放SRC算法资源。

        #include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
        #include <fcntl.h>
        #include <string.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <sys/time.h>
    
        #include "AudioSRCProcess.h"
    
    
        float AVERAGE_RUN(int a)
        {
            static unsigned int num = 0;
            static float avg = 0;
            if(num == 0) avg = 0;
            num++;
            avg = avg + ((float)a - avg) / ((float)num);
            return avg;
        }
        unsigned int _OsCounterGetMs(void)
        {
            struct  timeval t1;
            gettimeofday(&t1,NULL);
            unsigned int T = ( (1000000 * t1.tv_sec)+ t1.tv_usec ) / 1000;
            return T;
        }
    
        typedef struct{
            char chunkID[4];
            int chunkSize;
            char format[4];
            char subchunk1ID[4];
            int subchunk1Size;
            short audioFormat;
            short numChannels;
            int sampleRate;
            int byteRate;
            short blockAlign;
            short bitsPerSample;
            char subchunk2ID[4];
            int subchunk2Size;
        }WaveHeaderStruct;
    
        WaveHeaderStruct Header_struct;
    
        void SetWaveHeader(int newSampleRate, char newBitDepth, char newNumChans)
        {
        // set all the ASCII literals
        memcpy(Header_struct.chunkID, "RIFF", 4);
        memcpy(Header_struct.format, "WAVE", 4);
        memcpy(Header_struct.subchunk1ID, "fmt ", 4);
        memcpy(Header_struct.subchunk2ID, "data", 4);
    
        // set all the known numeric values
        Header_struct.audioFormat = 1;
        Header_struct.chunkSize = 36;
        Header_struct.subchunk1Size = 16;
        Header_struct.subchunk2Size = 0;
    
        // set the passed-in numeric values
        Header_struct.sampleRate = newSampleRate*1000;
        Header_struct.bitsPerSample = newBitDepth;
        Header_struct.numChannels = newNumChans;
    
        // calculate the remaining dependent values
        Header_struct.blockAlign = Header_struct.numChannels * Header_struct.bitsPerSample / 8;
        Header_struct.byteRate = Header_struct.sampleRate * Header_struct.blockAlign;
        }
    
        void WaveHeaderUpdate(int numBytes)
        {
            Header_struct.subchunk2Size = numBytes;
            Header_struct.chunkSize = Header_struct.subchunk2Size + 36;
        }
    
        void WaveHeaderInfo(int* dataArray)
        {
        memcpy(dataArray, &Header_struct, (char) sizeof(Header_struct));
        }
    
        int GetHeaderResult(int numBytes, int* dataArray)
        {
            WaveHeaderUpdate(numBytes);
            WaveHeaderInfo(dataArray);
            return 0;
        }
    
        int GetSrcOutSampleRate(SrcConversionMode mode)
        {
            int outsamplerate;
            switch (mode)
            {
            case SRC_8k_to_16k:
                outsamplerate = SRATE_16K;
                break;
            case SRC_8k_to_32k:
                outsamplerate = SRATE_32K;
                break;
            case SRC_8k_to_48k:
                outsamplerate = SRATE_48K;
                break;
            case SRC_16k_to_8k:
                outsamplerate = SRATE_8K;
                break;
            case SRC_16k_to_32k:
                outsamplerate = SRATE_32K;
                break;
            case SRC_16k_to_48k:
                outsamplerate = SRATE_48K;
                break;
            case SRC_32k_to_8k:
                outsamplerate = SRATE_8K;
                break;
            case SRC_32k_to_16k:
                outsamplerate = SRATE_16K;
                break;
            case SRC_32k_to_48k:
                outsamplerate = SRATE_48K;
                break;
            case SRC_48k_to_8k:
                outsamplerate = SRATE_8K;
                break;
            case SRC_48k_to_16k:
                outsamplerate = SRATE_16K;
                break;
            case SRC_48k_to_32k:
                outsamplerate = SRATE_32K;
                break;
            }
            return outsamplerate;
        }
        int main(int argc, char *argv[])
        {
            //For file I/O
            char infile_name[512],outfile_name[512];
            // char old_header[100],
            char new_header[100];
            FILE *fin, *fout;
            int total_size = 0, counter = 0;
            int WaveOut_srate = 0;
            ALGO_SRC_RET ret = 0;
            unsigned int T0, T1;
            float avg = 0;
            // unsigned int frame_size = (256); // Support 256, 512, 1024 and 2880
    
            //For Lib usage
            char *working_buf_ptr;
            int OutputSampleNum;
            unsigned int buf_size;
            SRCStructProcess src_struct;
    
            char src_para_json_file[512];
            sprintf(src_para_json_file,"%s","./../sample/data/SrcParamJson.json");
            unsigned int src_para_buffersize = IaaSrc_GetJsonFileSize(src_para_json_file);
            char *src_para_json_buf_ptr = (char*)malloc(src_para_buffersize);
    
            memset(&src_struct,0,sizeof(SRCStructProcess));
            ret = IaaSrc_StructReadFromJson(&src_struct, src_para_json_buf_ptr, src_para_json_file, src_para_buffersize);
    
            short audio_input[src_struct.point_number*2], audio_output[src_struct.point_number*12];
            /*Specify input/output file */
            if (argc > 1)
                strcpy(infile_name, argv[1]);
            else
                sprintf(infile_name, "./../sample/data/Sweep_16000_6s.wav");
    
            fin = fopen(infile_name, "rb");
            if (!fin)
            {
                fprintf(stderr, "Error opening file: %s\n", infile_name);
                return -1;
            }
    
    
            //Set output file header
            WaveOut_srate = GetSrcOutSampleRate(src_struct.mode);
            SetWaveHeader(WaveOut_srate,16,src_struct.channel);
            printf("output sample rate = %dk\n",WaveOut_srate);
            if(src_struct.channel ==2)
                sprintf(outfile_name, "./../sample/data/SRC_Out_%d_%dK_stereo.wav",src_struct.WaveIn_srate, WaveOut_srate);
            else
                sprintf(outfile_name, "./../sample/data/SRC_Out_%d_%dK_mono.wav"  ,src_struct.WaveIn_srate, WaveOut_srate);
    
            fout = fopen(outfile_name, "wb");
            if (!fout)
            {
                fprintf(stderr, "Error opening file: %s\n", outfile_name);
                return -1;
            }
    
            /* SRC init */
            buf_size = IaaSrc_GetBufferSize(src_struct.mode);
            working_buf_ptr = malloc(buf_size);
            SRC_HANDLE handle = IaaSrc_Init(working_buf_ptr, &src_struct);
    
            //main process
    
            fread(audio_input, sizeof(char), 44, fin);
            while(fread(audio_input, sizeof(short), src_struct.point_number*src_struct.channel, fin))
            {
                counter++;
                /* Run SRC process */
                T0  = (long)_OsCounterGetMs();
                ret = IaaSrc_Run(handle, audio_input,audio_output, &OutputSampleNum);
                T1  = (long)_OsCounterGetMs();
                avg += (T1 - T0);
                if(ret != 0)
                {
                    printf("Error occured in Sampling rate converter\n");
                    return -1;
                }
                //write output file information
                total_size += src_struct.channel*OutputSampleNum*sizeof(short);
                fwrite(audio_output, sizeof(short), src_struct.channel*OutputSampleNum, fout);
            }
            GetHeaderResult(total_size,(int*)new_header);
            fseek(fout,0,SEEK_SET);
            fwrite(new_header, sizeof(char),44, fout);
            avg /= counter;
            printf("AVG is %.2f ms\n",avg);
    
            fclose(fin);
            fclose(fout);
            IaaSrc_Release(handle);
            free(working_buf_ptr);
            printf("SRC done\n");
        return 0;
        }
    

    2. API 参考


    2.1. 功能模块API

    API名 功能
    IaaSrc_GetBufferSize 获取Src算法运行需要的内存大小
    IaaSrc_Init 初始化Src算法
    IaaSrc_Run Src算法处理
    IaaSrc_Release 释放Src算法资源
    IaaSrc_GetJsonFileSize SRC 获取解析Json文件内容所需要的内存大小
    IaaSrc_StructReadFromJson 配置Json参数到SRC算法的结构体指针

    2.2. IaaSrc_GetBufferSize

    • 功能

      获取Src算法运行所需要的内存大小。

    • 语法

      unsigned int IaaSrc_GetBufferSize(SrcConversionMode mode);
      
    • 形参

      参数名称 描述 输入/输出
      SrcConversionMode mode 采样速率转换类型 输入
    • 返回值

      返回值为Src算法运行所需要的内存大小。

    • 依赖

      • 头文件: AudioSRCProcess.h

      • 库文件: libSRC_LINUX.so/ libSRC_LINUX.a

    • 注意

      该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。

    • 举例

      请参考实例介绍


    2.3. IaaSrc_Init

    • 功能

      初始化Src算法。

    • 语法

      SRC_HANDLE IaaSrc_Init(char *workingBufferAddress, SRCStructProcess *src_struct);
      
    • 形参

      参数名称 描述 输入/输出
      working_buffer_address Src算法所使用的内存地址 输入
      SRCStructProcess Src算法的初始化结构体指针 输入
    • 返回值

      返回值 结果
      非NULL 成功
      NULL 失败
    • 依赖

      • 头文件: AudioSRCProcess.h

      • 库文件: libSRC_LINUX.so/ libSRC_LINUX.a

    • 注意

      无。

    • 举例

      请参考实例介绍


    2.4. IaaSrc_Run

    • 功能

      Src算法处理。

    • 语法

      ALGO_SRC_RET IaaSrc_Run(SRC_HANDLE handle, short *audio_input, short *audio_output, int* output_size);
      
    • 形参

      参数名称 描述 输入/输出
      handle Src算法handle 输入
      audio_input 重采样前的数据指针 输入
      audio_output 重采样输出的数据指针 输出
      output_size 重采样输出的数据长度,会根据SRCStructProcess中设定的point_number和SRC mode转换的比例而改变。
      举例:从8K转换到48K,则Point number等比例上升至六倍。
      输出
    • 返回值

      返回值 结果
      0 成功
      非0 失败,参照 错误码
    • 依赖

      • 头文件: AudioSRCProcess.h

      • 库文件: libSRC_LINUX.so/ libSRC_LINUX.a

    • 注意

      • audio_output存放的buffer也需要应用程序申请传入。

      • Npoints的取值范围:≤1536

    • 举例

      请参考实例介绍


    2.5. IaaSrc_Release

    • 功能

      释放Src算法资源。

    • 语法

      ALGO_SRC_RET IaaSrc_Release(SRC_HANDLE handle);
      
    • 形参

      参数名称 描述 输入/输出
      handle Src算法handle 输入
    • 返回值

      返回值 结果
      0 成功
      非0 失败,参照 错误码
    • 依赖

      • 头文件: AudioSRCProcess.h

      • 库文件: libSRC_LINUX.so/ libSRC_LINUX.a

    • 注意

      无。

    • 举例

      请参考实例介绍

    2.6. IaaSrc_GetJsonFileSize

    • 功能

      SRC 获取解析Json文件内容所需要的内存大小

    • 语法

      unsigned int IaaSrc_GetJsonFileSize(char* jsonfile);
      
    • 形参

      参数名称 描述 输入/输出
      jsonfile Json檔名 输入
    • 返回值

      返回值为解析Json文件内容所需要的内存大小

    • 依赖

      • 头文件: AudioSrcProcess.h

      • 库文件: libSRC_LINUX.so/ libSRC_LINUX.a

    • 注意

      • 无。
    • 举例

      • 无。

    2.7. IaaSrc_StructReadFromJson

    • 功能

      配置Json参数到SRC算法的结构体指针

    • 语法

      ALGO_SRC_RET IaaSrc_StructReadFromJson(SRCStructProcess* src_struct, char* jsonBuffer, char* jsonfile, unsigned int buffSize);
      
    • 形参

      参数名称 描述 输入/输出
      src_struct SRC 算法结构体 输入
      jsonBuffer 解析Json文件内容所使用的内存地址 输入
      jsonfile Json檔名 输入
      buffSize 解析Json文件内容所需要的内存大小 输入
    • 返回值

      返回值 结果
      0 成功
      非0 失败,参考 错误码
    • 依赖

      • 头文件: AudioSrcProcess.h

      • 库文件: libSRC_LINUX.so/ libSRC_LINUX.a

    • 注意

      • 无。
    • 举例

      • 无。

    3. SRC 数据类型


    3.1. SRC模块相关数据类型定义

    数据类型 定义
    SrcConversionMode Src算法采样率转换类型
    SRCStructProcess Src算法初始化参数结构体类型
    SrcInSrate Src算法的采样速率类型
    SRC_HANDLE Src算法句柄类型
    SrcFilterOrder 定义Src算法的低通滤波器阶数

    3.2. SrcConversionMode

    • 说明

      定义Src算法的采样率转换类型。

    • 定义

      typedef enum{
      
          SRC_8k_to_16k,
      
          SRC_8k_to_32k,
      
          SRC_8k_to_48k,
      
          SRC_16k_to_8k,
      
          SRC_16k_to_32k,
      
          SRC_16k_to_48k,
      
          SRC_32k_to_8k,
      
          SRC_32k_to_16k,
      
          SRC_32k_to_48k,
      
          SRC_48k_to_8k,
      
          SRC_48k_to_16k,
      
          SRC_48k_to_32k,
      
          SRC_24k_to_8k,
      
          SRC_24k_to_16k,
      
          SRC_24k_to_32k,
      
          SRC_24k_to_48k,
      
          SRC_8k_to_24k,
      
          SRC_16k_to_24k,
      
          SRC_32k_to_24k,
      
          SRC_48k_to_24k
      
      }SrcConversionMode;
      
    • 成员

      成员名称 描述
      SRC_8k_to_16k 8K重采样到16K
      SRC_8k_to_32k 8K重采样到32K
      SRC_8k_to_48k 8K重采样到48K
      SRC_16k_to_8k 16K重采样到8K
      SRC_16k_to_32k 16K重采样到32K
      SRC_16k_to_48k 16K重采样到48K
      SRC_32k_to_8k 32K重采样到8K
      SRC_32k_to_16k 32K重采样到16K
      SRC_32k_to_48k 32K重采样到48K
      SRC_48k_to_8k 48K重采样到8K
      SRC_48k_to_16k 48K重采样到16K
      SRC_48k_to_32k 48K重采样到32K
      SRC_24k_to_8k 24K重采样到8K
      SRC_24k_to_16k 24K重采样到16K
      SRC_24k_to_32k 24K重采样到32K
      SRC_24k_to_48k 24K重采样到48K
      SRC_8k_to_24k 8K重采样到24K
      SRC_16k_to_24k 16K重采样到24K
      SRC_32k_to_24k 32K重采样到24K
      SRC_48k_to_24k 24K重采样到24K
    • 注意事项

      无。

    • 相关数据类型及接口

      IaaSrc_GetBufferSize


    3.3. SRCStructProcess

    • 说明

      定义Src算法的初始化参数结构体类型。

    • 定义

      typedef struct{
      
          SrcInSrate WaveIn_srate;
      
          SrcConversionMode mode;
      
          unsigned int channel;
      
          SrcFilterOrder order;
      
          unsigned int point_number;
      
      }SRCStructProcess;
      
    • 成员

      成员名称 描述
      WaveIn_srate 输入源数据的采样频率
      mode 采样频率转换的模式,请根据源数据采样频率与输出数据采样频率搭配做选择。
      channel 源数据的通道数,可支持4声道
      order 低通滤波器阶数
      point_number 输入讯号每帧包含的点数,预设小于1536,并须符合转换后依然为整数。下面指令可确认
      strings libSRC_LINUX.so | grep PN
    • 注意事项

      • 无。
    • 相关数据类型及接口

      IaaSrc_Init

      IaaSrc_StructReadFromJson


    3.4. SrcInSrate

    • 说明

      定义Src算法的采样率类型。

    • 定义

      typedef enum{
      
          SRATE_8K = 8,
      
          SRATE_16K = 16,
      
          SRATE_32K = 32,
      
          SRATE_48K = 48,
      
          SRATE_24K = 24
      
      }SrcInSrate;
      
    • 成员

      成员名称 描述
      SRATE_8K 8K采样频率
      SRATE_16K 16K采样频率
      SRATE_32K 32K采样频率
      SRATE_48K 48K采样频率
      SRATE_24K 24K采样频率
    • 注意事项

      无。

    • 相关数据类型及接口

      SRCStructProcess


    3.5. SRC_HANDLE


    3.6. SrcFilterOrder

    • 说明

      定义Src算法的低通滤波器阶数。

    • 定义

      typedef enum{
          ORDER_LOW = 0,
          ORDER_HIGH = 1
      }SrcFilterOrder;
      
    • 成员

      成员名称 描述
      ORDER_LOW 阶数低
      ORDER_HIGH 阶数高,滤波效果较好
    • 注意事项

      无。

    • 相关数据类型及接口

      SRCStructProcess


    4. Error Code

    SRC API 错误码如下表所示:

    错误码 宏定义 描述
    0x00000000 ALGO_SRC_RET_SUCCESS 运行成功
    0x10000601 ALGO_SRC_INIT_ERROR 算法尚未初始化
    0x10000602 ALGO_SRC_RET_INVALID_MODE 模式参数设置无效
    0x10000603 ALGO_SRC_RET_INVALID_HANDLE HANDLE无效
    0x10000604 ALGO_SRC_RET_INVALID_CHANNEL 通道数不支持
    0x10000605 ALGO_SRC_RET_INVALID_POINT_NUMBER 每帧点数不支援
    0x10000606 ALGO_SRC_RET_INVALID_SAMPLE_RATE 采样频率不支持
    0x10000607 ALGO_SRC_RET_API_CONFLICT 其他API正在运行
    0x10000608 ALGO_SRC_RET_INVALID_CALLING 呼叫API顺序错误
    0x10000609 ALGO_SRC_RET_INVALID_JSONFILE SRC解析Json相关错误