9.6. EQ
概述
本工程展示了EQ工具使用示例:
如何使用EQ工具在线调试;
如何使用EQ导入/导出EQ配置文件;
如何使用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 已有一个配置文件,需要离线编辑这个文件,可以在主界面中选择【打开固件配置(离线编辑)】按钮
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
立体声模式
-
enumerator NORMAL
-
enum [anonymous]
输出数据类型
Values:
-
enumerator DATO_SHORT
short短整型
-
enumerator DATO_INT
int整型
-
enumerator DATO_FLOAT
float浮点型
-
enumerator DATO_SHORT
-
enum [anonymous]
输入数据类型
Values:
-
enumerator DATI_SHORT
short短整型
-
enumerator DATI_INT
int整型
-
enumerator DATI_FLOAT
float浮点型
-
enumerator DATI_SHORT
-
enum [anonymous]
输入数据存放模式
Values:
-
enumerator BLOCK_DAT_IN
块模式,例如输入数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据
-
enumerator SEQUENCE_DAT_IN
序列模式,例如输入数据是2通道,先存放第1通道的第一个数据,再存放第2个通道的第一个数据,以此类推
-
enumerator BLOCK_DAT_IN
-
enum [anonymous]
输出数据存放模式
Values:
-
enumerator BLOCK_DAT_OUT
块模式,例如输出数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据
-
enumerator SEQUENCE_DAT_OUT
序列模式,例如输入数据是2通道,先存放第1通道的第一个数据,再存放第2个通道的第一个数据,以此类推
-
enumerator BLOCK_DAT_OUT
-
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
-
enumerator EQ_IIR_TYPE_HIGH_PASS
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:失败
-
struct eq_seg_info
- #include <eq.h>
eq段信息
-
struct eq_coeff_info
- #include <eq.h>
eq系数信息
-
struct hw_eq
- #include <eq.h>
硬件eq
-
struct hw_eq_handler
- #include <eq.h>
硬件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通道的节点
-
const struct hw_eq_handler *eq_handler
q操作的相关回调函数句柄
-
void *irq_priv
eq管理层传入的私有指针
-
void (*irq_callback)(void *priv)
需要eq中断执行的回调函数
-
unsigned int updata_coeff_only