9.6. EQ

概述

本工程展示了EQ工具使用示例:

    1. 如何使用EQ工具在线调试;

    1. 如何使用EQ导入/导出EQ配置文件;

    1. 如何使用EQ离线编辑模式;

9.6.1. 配置说明

  • example: 进入 demo_DevKitBoard/include/demo_config.h ,开启宏 USE_AUDIO_DEMO

  • 在app_config.h中打开支持在线EQ调试为EQ在线编辑,在线EQ关闭时为离线模式,EQ配置参数从bin文件中读取。使用在线EQ时,EQ文件不生效。

#define TCFG_EQ_ENABLE                            1     //支持EQ功能
#define TCFG_EQ_ONLINE_ENABLE                     1     //支持在线EQ调试
#define TCFG_HW_SOFT_EQ_ENABLE                    1     //前3段使用软件运算(仅用于790x)
#define TCFG_LIMITER_ENABLE                       1     //限幅器
#define TCFG_EQ_FILE_ENABLE                       1     //从bin文件读取eq配置数据
#define TCFG_DRC_ENABLE                           TCFG_LIMITER_ENABLE //DRC使能
#define TCFG_ONLINE_ENABLE                        TCFG_EQ_ONLINE_ENABLE
  • 外部库依赖libcompressor.a、lib_crossover_coff.a、media_app.a,工程需要添加 apps/common/audio_music/eq_config_new.c apps/common/config/ci_transport_uart.c

9.6.2. 操作说明

  • 打开EQ调试工具 AC791N_配置工具入口:cpu/wl82/tools/AC791N_config_tool/AC791N_配置工具入口(Config Tools Entry).jlxproj) ,选择“打开音效配置工具(新EQ工具)”

  • 1.在线模式
    • 1.1 在线调试通过串口进行与上位机通讯,配置好串口端口,波特率后(波特率对应板级的uart1_data),点击打开(暂时不支持蓝牙串口模式),注意引脚是否同时复用问题,串口引脚可以修改,详情查询UART文档。直接点击【打开】按钮,进行通讯,通讯成功以后会跳转到【EQ】界面,进行EQ各模式参数配置。

    UART1_PLATFORM_DATA_BEGIN(uart1_data)
        .baudrate = 115200,
        .port = PORTUSB_A,
        .tx_pin = IO_PORT_USB_DPA,
        .rx_pin = IO_PORT_USB_DMA,
        .max_continue_recv_cnt = 1024,
        .idle_sys_clk_cnt = 500000,
        .clk_src = PLL_48M,
        .flags = UART_DEBUG,
    UART1_PLATFORM_DATA_END();
    
    • 1.2 选择对应的模式,然后点击编辑,普通音频EQ为播歌及提示音等音源配置模式。

    • 1.3 进入播歌EQ界面, 可以通过调节段点,或修改对应段点数据,进行频率、增益和高/低/带通等的设置,若当前设备在播放音乐,能直接听到修改前后的差别,根据需要进行调节。

    • 1.4 打开DRC设置:可以使用限幅器、多带限幅器、压缩器和多带压缩器。多带是进行分频器处理,可以设置低中分频点和中高分频点,也可调节分频器阶数。
      • 限幅器:使音频信号维持在一定的幅度范围内并且不引起饱和失真

        阈值:是指限幅器启动的信号能量阈值

        启动时间:是指当信号能量超过阈值后限幅器启动滞后的时间

        释放时间:是指当信号能量从超过阈值回落到阈值之下时,衰减恢复所需的时间

      • 压缩器:使音频信号按比例进行压缩

        阈值:是指压缩器启动的信号能量阈值

        压缩比:是指信号的压缩比例

        启动时间:是指当信号能量超过阈值后压缩器启动滞后的时间

        释放时间:是指当信号能量从超过阈值回落到阈值之下时,衰减恢复所需的时间

      • 分频器:根据低频与中高频设置的频率,处理输入数据,输出低频、中频、和高频的三组数据,分频器为多带限幅或者多带压缩器服务

        分频器阶数:分频器过渡带的陡峭程度(值越大越陡峭,随之消耗的 mips 也会变大)

    • 1.5 修改完后,点击”导出固件配置“,生成“eq_cfg_hw.bin”配置文件,将该文件放置 cpu/wl82/tools/cfg 目录下,重新烧录的时候会将该文件烧写进设备(重新烧写前记得设置#define TCFG_EQ_ONLINE_ENABLE 0 且 #define TCFG_EQ_FILE_ENABLE 1) 。

    //*********************************************************************************//
    //                                  EQ配置                                         //
    //*********************************************************************************//
    #define CONFIG_VOLUME_TAB_TEST_ENABLE             0     //音量表测试
    //EQ配置,使用在线EQ时,EQ文件和EQ模式无效。有EQ文件时,默认不用EQ模式切换功能
    #define TCFG_EQ_ENABLE                            1     //支持EQ功能
    #define TCFG_EQ_ONLINE_ENABLE                     0     //支持在线EQ调试
    #define TCFG_HW_SOFT_EQ_ENABLE                    1     //前3段使用软件运算
    #if __FLASH_SIZE__ > (1 * 1024 * 1024)
    #define TCFG_LIMITER_ENABLE                       1     //限幅器
    #else
    #define TCFG_LIMITER_ENABLE                       0     //限幅器
    #endif
    #define TCFG_EQ_FILE_ENABLE                       1     //从bin文件读取eq配置数据
    #define TCFG_DRC_ENABLE                           TCFG_LIMITER_ENABLE
    #define TCFG_ONLINE_ENABLE                        TCFG_EQ_ONLINE_ENABLE
    
    • 1.6 若客户需要查看或修改EQ的配置,可以直接导入固件配置后,点击编辑修改。

  • 2.离线模式
    • 2.1 没有在线调试串口时,可离线生成一个配置文件:选择对应芯片和EQ版本,芯片[AC700N],EQ版本[0.8.0.0](注意需要对应 apps/common/audio_music/eq_config_new.c 里面填写的芯片型号和版本号,后续会补充AC791N芯片型号),点击【离线编辑】按钮即可生成,生成后进行各模式的段数设置,之后进入EQ配置界面,完成参数配置调节后,点击导出固件配置,即可离线生成新配置文件。

    • 2.2 已有一个配置文件,需要离线编辑这个文件,可以在主界面中选择【打开固件配置(离线编辑)】按钮

    1. SDK代码需要在请求打开解码器时需要加上以下参数才会有EQ效果

#if TCFG_EQ_ENABLE
#if defined EQ_CORE_V1
    req.dec.attr |= AUDIO_ATTR_EQ_EN;
#if TCFG_LIMITER_ENABLE
    req.dec.attr |= AUDIO_ATTR_EQ32BIT_EN;
#endif
#if TCFG_DRC_ENABLE
    req.dec.attr |= AUDIO_ATTR_DRC_EN;
#endif
#else
    struct eq_s_attr eq_attr = {0};
    extern void set_eq_req_attr_parm(struct eq_s_attr * eq_attr);
    set_eq_req_attr_parm(&eq_attr);
    req.dec.eq_attr = &eq_attr;
    req.dec.eq_hdl = __this->eq_hdl;
#endif
#endif

9.6.3. 常见问题

Note

  • 在线调试发送命令一直提示超时,请检查USB IO是否被其他模块占用,串口线不要太长,以免收发数据出错

  • 在线调试完成导出配置文件到相应位置以后,需关闭在线调试功能,之后再编译烧录后生效

9.6.4. API参考

Enums

enum [anonymous]

EQ运行模式

Values:

enumerator NORMAL

正常模式

enumerator MONO

单声道模式

enumerator STEREO

立体声模式

enum [anonymous]

输出数据类型

Values:

enumerator DATO_SHORT

short短整型

enumerator DATO_INT

int整型

enumerator DATO_FLOAT

float浮点型

enum [anonymous]

输入数据类型

Values:

enumerator DATI_SHORT

short短整型

enumerator DATI_INT

int整型

enumerator DATI_FLOAT

float浮点型

enum [anonymous]

输入数据存放模式

Values:

enumerator BLOCK_DAT_IN

块模式,例如输入数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据

enumerator SEQUENCE_DAT_IN

序列模式,例如输入数据是2通道,先存放第1通道的第一个数据,再存放第2个通道的第一个数据,以此类推

enum [anonymous]

输出数据存放模式

Values:

enumerator BLOCK_DAT_OUT

块模式,例如输出数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据

enumerator SEQUENCE_DAT_OUT

序列模式,例如输入数据是2通道,先存放第1通道的第一个数据,再存放第2个通道的第一个数据,以此类推

enum EQ_IIR_TYPE

eq IIR type滤波器类型

Values:

enumerator EQ_IIR_TYPE_HIGH_PASS

高通滤波器

enumerator EQ_IIR_TYPE_LOW_PASS

低通滤波器

enumerator EQ_IIR_TYPE_BAND_PASS

带通滤波器

enumerator EQ_IIR_TYPE_HIGH_SHELF

高架滤波器

enumerator EQ_IIR_TYPE_LOW_SHELF

低架滤波器

enumerator EQ_IIR_TYPE_HIGH_PASS
enumerator EQ_IIR_TYPE_LOW_PASS
enumerator EQ_IIR_TYPE_BAND_PASS
enumerator EQ_IIR_TYPE_HIGH_SHELF
enumerator EQ_IIR_TYPE_LOW_SHELF

Functions

void design_lp(int fc, int fs, float quality_factor, float *coeff)

低通滤波器

Parameters
  • fc:中心截止频率

  • fs:采样率

  • quality_factor:q值

  • coeff:计算后,系数输出地址

void design_hp(int fc, int fs, float quality_factor, float *coeff)

高通滤波器

Parameters
  • fc:中心截止频率

  • fs:采样率

  • quality_factor:q值

  • coeff:计算后,系数输出地址

void design_pe(int fc, int fs, float gain, float quality_factor, float *coeff)

带通滤波器

Parameters
  • fc:中心截止频率

  • fs:采样率

  • gain:增益

  • quality_factor:q值

  • coeff:计算后,系数输出地址

void design_ls(int fc, int fs, float gain, float quality_factor, float *coeff)

低频搁架式滤波器

Parameters
  • fc:中心截止频率

  • fs:采样率

  • gain:增益

  • quality_factor:q值

  • coeff:计算后,系数输出地址

void design_hs(int fc, int fs, float gain, float quality_factor, float *coeff)

高频搁架式滤波器

Parameters
  • fc:中心截止频率

  • fs:采样率

  • gain:增益

  • quality_factor:q值

  • coeff:计算后,系数输出地址

int eq_stable_check(float *coeff)

滤波器系数检查

Parameters

coeff:滤波器系数

Returns

0:成功 -1:失败

float eq_db2mag(float x)
void eq_get_AllpassCoeff(void *Coeff)

获取直通的滤波器系数

Parameters

coeff:滤波器系数

int eq_seg_design(struct eq_seg_info *seg, int sample_rate, float *coeff)

滤波器计算管理函数

Parameters
  • seg:提供给滤波器的基本信息

  • sample_rate:采样率

  • coeff:计算后,系数输出地址

Returns

true:成功 false:失败

int audio_hw_eq_init(struct hw_eq *eq, u32 eq_section_num)

EQ初始化

Parameters

eq:句柄

Returns

0:成功 -1:失败

int audio_hw_eq_ch_open(struct hw_eq_ch *ch, struct hw_eq *eq)

打开一个通道

Parameters
  • ch:通道句柄

  • eq:句柄

Returns

0:成功 -1:失败

int audio_hw_eq_ch_set_handler(struct hw_eq_ch *ch, struct hw_eq_handler *handler)

设置回调接口

Parameters
  • ch:通道句柄

  • handler:回调的句柄

Returns

0:成功 -1:失败

int audio_hw_eq_ch_set_info(struct hw_eq_ch *ch, u8 channels, u8 out_32bit)

设置通道基础信息

Parameters
  • ch:通道句柄

  • channels:通道数

  • out_32bit:是否输出32bit位宽数据 – 1:是 0:16bit位宽

Returns

0:成功 -1:失败

int audio_hw_eq_ch_set_coeff(struct hw_eq_ch *ch, struct eq_coeff_info *info)

设置硬件转换系数

Parameters
  • ch:通道句柄

  • info:系数、增益等信息

Returns

0:成功 -1:失败

int audio_hw_eq_ch_start(struct hw_eq_ch *ch, void *input, void *output, int len)

启动一次转换

Parameters
  • ch:eq句柄

  • input:输入数据地址

  • output:输出数据地址

  • len:输入数据长度

Returns

输出数据的长度

int audio_hw_eq_ch_close(struct hw_eq_ch *ch)

关闭一个通道

Parameters

ch:eq句柄

Returns

0:成功 -1:失败

int audio_hw_eq_flush_out(struct hw_eq *eq)

挤出eq中的数据

Parameters

eq:eq句柄

Returns

0:成功 -1:失败

int audio_hw_eq_is_running(struct hw_eq *eq)

获取eq是否正在运行状态

Parameters

eq:eq句柄

Returns

true or false

struct eq_seg_info
#include <eq.h>

eq段信息

Public Members

u16 index

eq段序号

u16 iir_type

滤波器类型EQ_IIR_TYPE

int freq

中心截止频率

float gain

增益(-12 ~12 db)

float q

q值(0.3~30)

struct eq_coeff_info
#include <eq.h>

eq系数信息

Public Members

u16 nsection

eq段数

u16 no_coeff

不是滤波系数

float *L_coeff

左声道滤波器系数地址

float *R_coeff

右声道滤波器系数地址

float L_gain

左声道总增益(-20~20db)

float R_gain

右声道总增益(-20~20db)

float *N_coeff[8]

滤波器系数

float N_gain[8]

滤波器增益

struct hw_eq
#include <eq.h>

硬件eq

Public Members

struct list_head head

链表头

OS_MUTEX mutex

互斥锁

struct hw_eq_ch *cur_ch

当前需要处理的eq通道

struct hw_eq_handler
#include <eq.h>

硬件eq句柄

Public Members

int (*eq_probe)(struct hw_eq_ch*)

eq驱动内前处理

int (*eq_output)(struct hw_eq_ch*, s16*, u16)

eq驱动内输出处理回调

int (*eq_post)(struct hw_eq_ch*)

eq驱动内处理后回调

int (*eq_input)(struct hw_eq_ch*, void**, void**)

eq驱动内输入处理回调

struct hw_eq_ch
#include <eq.h>

硬件eq通道信息

Public Members

unsigned int updata_coeff_only

只更新参数,不更新中间数据

unsigned int no_wait

是否是异步eq处理 0:同步的eq 1:异步的eq

unsigned int channels

输入通道数

unsigned int SHI

eq运算输出数据左移位数控制,记录

unsigned int countL

eq运算输出数据左移位数控制临时记录

unsigned int stage

eq运算开始位置标识

unsigned int nsection

eq段数

unsigned int no_coeff

非滤波系数

unsigned int reserve
volatile unsigned char updata

更新参数以及中间数据

volatile unsigned char active

已启动eq处理 1:busy 0:处理结束

volatile unsigned char need_run

多eq同时使用时,未启动成功的eq,是否需要重新唤醒处理 1:需要 0:否

unsigned short run_mode

0按照输入的数据排布方式 ,输出数据 1:单入多出, 2:立体声入多出

unsigned short in_mode

输入数据的位宽 0:short 1:int 2:float

unsigned short out_32bit

输出数据的位宽 0:short 1:int 2:float

unsigned short out_channels

输出通道数

unsigned short data_in_mode

输入数据存放模式

unsigned short data_out_mode

输出数据存放模式

float *L_coeff

输入给左声道系数地址

float *R_coeff

输入给右声道系数地址

float L_gain

输入给左声道总增益(-20~20)

float R_gain

输入给右声道总增益(-20~20)

float *N_coeff[8]
float N_gain[8]
float *eq_LRmem

eq系数地址(包含运算的中间数据)

s16 *out_buf

输出buf地址

s16 *in_buf

输入buf地址

int in_len

输入数据长度

void *priv

保存eq管理层的句柄

OS_SEM sem

信号量,用于通知驱动,当前一次处理完成

struct list_head entry

当前eq通道的节点

struct hw_eq *eq

底层eq操作句柄

const struct hw_eq_handler *eq_handler

q操作的相关回调函数句柄

void *irq_priv

eq管理层传入的私有指针

void (*irq_callback)(void *priv)

需要eq中断执行的回调函数