最近在看AB5800平台的代码功能是通过电阻器来调整高中低频率增益开始进入正题。主要文件: app/modules/audio/bsp_eq.c截取的代码段如下bass_treb_loud_param_t msc_bass_treb_loud_param; struct eq_coef_t msc_bass { .param0 CAL_FIX(0.0261732112), //BASS:300Hz(alpha) .param1 CAL_FIX(0.9992290362), //BASS:300Hz(cos_w0) }; #if MUSIC_EFFECT_BASS_TREB_LOUD_EN struct eq_coef_t msc_loud { .param0 CAL_FIX(0.0696856441), //LOUD:800Hz(alpha) .param1 CAL_FIX(0.9945218951), //LOUD:800Hz(cos_w0) }; #endif struct eq_coef_t msc_treb { .param0 CAL_FIX(0.2551222950), //TREB:3000Hz(alpha) .param1 CAL_FIX(0.9238795283), //TREB:3000Hz(cos_w0) }; void bsp_bass_treble_init(void) { memset(msc_bass_treb_loud_param, 0, sizeof(bass_treb_loud_param_t)); msc_bass.coef (u32*)bsp_music_bass_eq_coef_get(); //初始化band0参数的数组 msc_treb.coef (u32*)bsp_music_treb_eq_coef_get(); //初始化band1参数的数组 #if MUSIC_EFFECT_BASS_TREB_LOUD_EN msc_loud.coef (u32*)bsp_music_loud_eq_coef_get(); eq_coef_cal(msc_loud,0); #endif bass_treble_coef_cal(msc_bass, 0, 0); bass_treble_coef_cal(msc_treb, 0, 1); music_bass_treble_enable(1); print_r32(msc_bass.coef,5); print_r32(msc_treb.coef,5); }struct eq_coef_t { u32 param0; //频点参数由工具计算 u32 param1; u32 *coef; //频段参数由eq_coef_cal计算 };struct eq_coef_t msc_bass { .param0 CAL_FIX(0.0261732112), //BASS:300Hz(alpha) .param1 CAL_FIX(0.9992290362), //BASS:300Hz(cos_w0) };我们主要探讨一下这个eq_coef_t结构体由param0, param1, coef组成接下来以300HZ为例解析这两个参数是怎么生成的一. 结论这两个参数是二阶搁架滤波器(2nd Order Shelving Filter)预先计算的中间变量.param0 CAL_FIX(0.0261732112) // 对应滤波器的 α 参数(与 Q 值和增益相关) .param1 CAL_FIX(0.9992290362) // 对应 cos(ω₀), 其中 ω₀ 是数字角频率(单位:弧度) CAL_FIX(x)将浮点数转换为定点数二. 推导过程Fc的推导(从结果反推FS使用的是48000,并非44100,但相同文件里面tbl_coef数组用的就是44100) 1. 从cos(ω₀)反推数字角频率 ω₀ arccos(0.9992290362)-0.0392699弧度 2. 数字角频率推导模拟频率 ω₀ 2πf₀(目标频率) / Fs(采样率) 得出 f₀(目标频率) ω₀ * Fs(采样率) / 2π 即: f₀ 0.0392699 × 48000 / (2×3.1415926535) 所以得出 f₀ ≈ 300HZ Q值的推导 1. α sin(ω₀) / (2Q) 带入推导FC中得到的弧度0.0392699 sin(ω₀) sin(0.0392699) ≈ 0.0392688 得 Q sin(ω₀) / (2α) 0.0392688 / (2×0.0261732112) ≈ 0.75据此我们得出Fc 300Hz Q 0.75, 计算结果如下三. 如何生成这两个系数MATLAB CODE: clear;clc; f0 800; % FC频率, 你需要频率 Fs 48000; % 采样率 Q 0.75; % Q值 w0 2*pi*f0/Fs; cos_w0 cos(w0); alpha sin(w0)/(2*Q); fprintf(.param0 CAL_FIX(%.10f), // %.0fHz(alpha)\n,alpha,f0); fprintf(.param1 CAL_FIX(%.10f), // %.0fHz(cos_w0)\n,cos_w0,f0);效果图如下