降级:
TLV320AIC3204无法配置 Biquad 滤波器参数。 如何动态生成参数和写入配置?
客户使用随附参考中的 C 语言程序来编写参数、发现 EQ 的中心频率和增益不正确。
e2e.ti.com/.../TLV320AIC3xxx_E46EE26C68568476BE8B6E7F0E4E9E5BF665038C8282_.pdf
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
降级:
TLV320AIC3204无法配置 Biquad 滤波器参数。 如何动态生成参数和写入配置?
客户使用随附参考中的 C 语言程序来编写参数、发现 EQ 的中心频率和增益不正确。
e2e.ti.com/.../TLV320AIC3xxx_E46EE26C68568476BE8B6E7F0E4E9E5BF665038C8282_.pdf
您好!
请参阅以下应用程序。有关详细信息、请注意:
http://proddms.itg.ti.com/stage/lit/an/slaa447/slaa447.pdf
此致。
降级:
下面的 C 代码、您能帮您查看并给出一些建议、 EQ 的中心频率和增益不正确、谢谢!
#include
#include
int main (int argc、char **argv){
双精度= 8388607;//这是一个常量:(2^(B-1)–1);24位系数:8388607, 16位:32767 *
双 dBVal = 3;/*增益*/
双 SRVal = 48000;//采样率*/
双 F0Val = 300;//频点*/
双 BWVal = 100;//带宽*/
double a、ω、sn、cs、alpha; /*中间量,S域到Z域双线性变换使用*/
double a0、A1、A2、b0、b1、 B2;/*系数,计算用中间量*
double absMax = 0;/*将b0、b1、b2转为小数时使用*/
INT N0、N1、N2、D1、D2; /*保存计算的系数结果*/
A = pow (10、(dBVal)/40);
Omega = 2 * M_PI *(F0Val)/(SRVal);
SN = sin (ω);
Cs = cos (ω);
Alpha = A*SN/(2*F0Val / BWVal);//对于Peak EQ、Q = Q/A */
B0 = 1 +(alpha*a);/*这里开始根据S域到Z域的映射计算Z域的系数*/
B1 =-1 * cs;/*这里在转换的时候本应当乘以-2、但是CODEC内部已经乘以2,所以这里只能乘以1 */
b2=1 -(alpha*a);
A0 = 1 +(alpha/a);
A1 =-1 * cs;//同上,这里本应乘以-2 */
A2 = 1 -(alpha/a);
b0 /= a0;/*这里开始将a0变换为1 */
if (fabs (b0)> absMax) absMax = fabs (b0);//获取b0、b1、b2的最大绝对值*
B1 /= a0;
if (fabs (b1)> absMax) absMax = fabs (b1);
b2 /= a0;
if (fabs (b2)> absMax) absMax = fabs (b2);
A1 /=(-1*a0);/* A1、a2乘以- 1是因为CODEC滤波器的设计,参见第一章的逻辑方框图*/
a2 /=(-1*a0);
if (absMax > 1.0){/*确保b0、b1、b2为纯小数*/
b0 /= absMax;
b1 /= absMax;
b2 /= absMax;
}
/*转换为整数并打印结果。在显示的时候,因为最高位是符号位,所以如果超出位宽24 / 16位则需要去掉纯符号位,比如FF81AA09实际数
值取0x81AA09就是用于写到CODEC的系数数值*/
N0 = floor (b0*res);
N1 =楼层(B1*res);
n2 = floor (b2*res);
d1 = floor (a1*res);
d2 = floor (a2*res);
printf ("N0:%04X、N1:%04X、N2:%04X\r\nND1:%04X、D2:%04X\r\n"、N0、 N1、N2、D1、D2);
返回0;
}
客户 C 代码作为附件。