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 滤波器参数的动态配置不正确

Guru**** 2482225 points
Other Parts Discussed in Thread: TLV320AIC3204

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1113564/tlv320aic3204-dynamic-configuration-of-biquad-filter-parameters-is-incorrect

器件型号:TLV320AIC3204

降级:

  TLV320AIC3204无法配置 Biquad 滤波器参数。 如何动态生成参数和写入配置?

   客户使用随附参考中的 C 语言程序来编写参数、发现 EQ 的中心频率和增益不正确。

   e2e.ti.com/.../TLV320AIC3xxx_E46EE26C68568476BE8B6E7F0E4E9E5BF665038C8282_.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅以下应用程序。有关详细信息、请注意:

    http://proddms.itg.ti.com/stage/lit/an/slaa447/slaa447.pdf

    https://www.ti.com/lit/an/slaa425d/slaa425d.pdf?ts=1656515185608&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FTLV320AIC3204

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    降级:

      下面的 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 代码作为附件。

    e2e.ti.com/.../aic3204_5F00_eq.cpp

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否交叉检查了寄存器数据是否与您编程的值匹配、以及在何处获得系数?

    首先尝试手动更改系数、而不是在运行时更改系数、以确保您从系统正确配置器件。

    确认之后、您可以参考应用程序。请注意、我在上面附加了在运行时更改系数的说明。