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.

[参考译文] TAS5825M:均衡计算

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1477320/tas5825m-eq-calculation

器件型号:TAS5825M

工具与软件:

你好  

我将在 LCD 屏幕上创建 EQ 频带、并根据滑块值设置 TAS5825M 的 EQ。 我在 GUI 屏幕上总共有7个 EQ 滑块(3个低音、1个中音、3个高音)。 我们将 TAS5825M 用于我们的定制硬件设计。您能解释一下并提供一些参考代码、以便我们可以根据滑块值计算系数并写入 TAS 寄存器。 此外、我还不确定应该写入哪个寄存器以及如何计算相应的值。

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

    尊敬的 Sagar:

    配置双二阶滤波器的最佳方法是使用 EVM 的 GUI。 这样、您便可以根据需要配置双二阶滤波器、然后输出配置脚本和所配置的双二阶滤波器。 GUI 具有多个滤波器选项和一个图、有助于直观显示频率响应。 有关如何存储数据的更多信息、可以参阅此 调优指南 和此 应用手册。 调优指南介绍了寄存器格式、该应用程序没有介绍双二阶配置和变量定义的部分。

    此致、

    Ramsey

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

    您好、Ramsey、

    我知道 PPC 可以生成可以写入的寄存器文件。 但我有不同的疑问
    1.我在 GUI 上有一个滑块、我应该相对于滑块(频率、带宽、增益)改变哪个值
    2. PPC3生成头文件,但滑块可以在运行时更改,那么如何计算运行时的参数和写入 i2c 寄存器?
    还使用了哪些 I2C 寄存器来计算 EQ。 我是音频领域的新手、因此请为我提供更多信息。

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

    尊敬的 Sagar:

    使用双二阶滤波器进行调优时、选择的滑块将取决于您的目标。 例如、假设我想添加一个截止频率为100Hz 的高通滤波器。 为此、我要选择一个高通滤波器选项、然后将"frequency"滑块向下移动到100Hz。 如果我想增加增益、我可以调整增益。 不同的滤波器类型可能具有不同的参数、如陷波、其中具有决定陷波频率和陷波宽度的频率和带宽参数。

    若要在初始化后生成用于更改参数的脚本、您可以点击 PPC3窗口底部的"I2C"按钮以打开 I2C 监控器。 然后转到日志页面、点击圆圈以开始记录 I2C 命令。 您现在在 PPC3中执行的任何操作都会在显示器中记录相应的 I2C 代码、然后您便可以在系统中使用该代码。

    每个双二阶都有几个与它们关联的用于滤波的寄存器。 我之前链接的应用手册针对每个过程流程提供了一个寄存器映射、该映射会告诉您哪个寄存器对应哪个双二阶滤波器。

    此致、

    Ramsey

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

    您好、Ramsey、

    我是音频相关事物的新手。 我已经研究了很多文件,但事情仍然不是很清楚。 我理解的是、我希望创建7频带均衡器、以便我选择7个不同的频率、例如100,300,600,100、3000、 6,000,12000。  

    我会将 Q 值视为固定值1。 并根据 GUI 上的滑块值将增益从-20更改为+20范围。 我将根据以下代码计算系数。 计算后、这些寄存器需要在某个地址上写入。 请告诉我如何找到该地址?

     如果下面的代码有任何错误、请更正我。  

    void updateBiquadFilter(int band, float f0, float gain, float Q) {
        // Calculate coefficients based on given formula
        float A = pow(10, gain / 40);
        float omega0 = 2 * PI * f0 / 48000.0; // Assuming fs=48000Hz
        float alpha = sin(omega0) / (2 * Q);
        
        float b0 = 1 + alpha * A;
        float b1 = -2 * cos(omega0);
        float b2 = 1 - alpha * A;
        float a0 = 1 + alpha / A;
        float a1 = -2 * cos(omega0);
        float a2 = 1 - alpha / A;
        
        float A0 = b0 / a0;
        float A1 = b1 / a0;
        float A2 = b2 / a0;
        float B1 = a1 / a0;
        float B2 = a2 / a0;
        
        // Write these coefficients to the TAS5825M
        writeBiquadCoefficients(band, A0, A1, A2, B1, B2);
    }
    

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

    尊敬的 Sagar:

    该代码在计算方面看起来不错、但您可能需要重命名最终系数、以便交换 A 项和 B 项(a1变为 b1、也是如此)。 这将与我之前指出的文档中的定义更匹配。 寄存器将取决于从器件中选择的处理流。 每个工艺流程的寄存器映射可以在我之前链接的应用手册中找到。 要将值转换为 I2C 数据、您需要生成一个函数来将十进制数据转换为二进制数据。 每个系数为4个字节长、并以5.27数据格式存储、调优指南和应用手册中也对此进行了说明。

    此致、

    Ramsey

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

    您好、Ramsey、

    我已经使用上述代码计算了 Fs = 100Hz、Q = 0.4、增益为20db 时的系数。 我收到以下值。  
    B0 = 1.046327
    B1 = -1.989535
    B2 = 0.943378
    A1 = -1.989535
    A2 = 0.989705
    Biquad Coefficients (5.27 format):
    0x085EE0DF
    0xF0156EE7
    0x078C0999
    0x0FEA9119
    0xF8151588

    我在 PPC 工具上完成了相同的操作、并根据图像收到了以下值。



    请问为什么 PPC 和我的计算结果存在这一差异?

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

    尊敬的 Sagar:

    数值差异可能是由于进行了一些舍入操作造成的。 A1和 A2上的负号被器件的系数吸收,因此变量应为-1*A1和-1*A2。

    此致、

    Ramsey

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

    您好、Ramsey、

    这是否意味着,我需要在上面的代码中更改计算? 并将 A1和 A2反转?

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

    尊敬的 Sagar:

    产生的滤波器几乎完全相同(存在 舍入差异)。  是的、应将 A1和 A2反转以匹配 PPC3。

    此致、

    Ramsey

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

    您好、Ramsey、


    我测试了以下代码。 更改滑块时会调用"Calculate Biquad"。 增益范围为-20至+20dB。  我们按照如下顺序操作:"Start Music (开始音乐)"->"Go to Screen (转到屏幕)"、然后更改滑块。 一旦滑块值被改变音乐停止播放。 您能否回顾一下代码并指出可能存在的问题?  

    最初、我们更改 PPC 中的增益0、1和20、并观察到某些寄存器值发生了变化。 基于这一点、我们将写入这些寄存器。 请对此发表评论。

    // Convert floating-point to Q5.27 fixed-point format
    static int32_t float_to_5_27(float value) {
        return (int32_t)(value * (1 << 27));
    }
    
    // Function to calculate biquad coefficients for a peaking filter
    static void calculate_biquad(float fc, float gain_db) {
        float A = pow(10, gain_db / 40.0);
        float omega = 2.0 * PI * fc / FS;
        float alpha = sin(omega) * (Q / 2.0);
    
        // Compute biquad coefficients
        float B0 = 1 + alpha * A;
        float B1 = -2 * cos(omega);
        float B2 = 1 - alpha * A;
        float A0 = 1 + alpha / A;
        float A1 = -2 * cos(omega);
        float A2 = 1 - alpha / A;
    
    //  double A = pow(10, Gain / 40.0);
    //	double omega = 2.0 * M_PI * Fc / SAMPLE_RATE;
    //	double alpha = sin(omega) / (2.0 * Q);
    //
    //	double b0 = 1 + alpha * A;
    //	double b1 = -2 * cos(omega);
    //	double b2 = 1 - alpha * A;
    //	double a0 = 1 + alpha / A;
    //	double a1 = -2 * cos(omega);
    //	double a2 = 1 - alpha / A;
    
        // Normalize coefficients
        float b0 = B0 / A0;
        float b1 = B1 / A0;
        float b2 = B2 / A0;
        float a1 = A1 / A0;
        float a2 = A2 / A0;
    
        // Convert to fixed-point Q5.27 format
        int32_t b0_fixed = float_to_5_27(b0);
        int32_t b1_fixed = float_to_5_27(b1);
        int32_t b2_fixed = float_to_5_27(b2);
        int32_t a1_fixed = float_to_5_27(a1);
        int32_t a2_fixed = float_to_5_27(a2);
    
        // Print results
        PRINTF("f_c = %.1f Hz, Gain = %.1f dB\n", fc, gain_db);
        PRINTF("b0 = 0x%08X\n", b0_fixed);
        PRINTF("b1 = 0x%08X\n", b1_fixed);
        PRINTF("b2 = 0x%08X\n", b2_fixed);
        PRINTF("a1 = 0x%08X\n", a1_fixed);
        PRINTF("a2 = 0x%08X\n\n", a2_fixed);
    
        // TODO: Send coefficients to TAS5825M via I²C
        uint8_t data[21];
        memset(data, 0x00, sizeof(data));
        data[0] = 0x30;
        for (int i = 0; i < 5; i++) {
    		data[1 + (i * 4)] = (coeffs[i] >> 24) & 0xFF;
    		data[2 + (i * 4)] = (coeffs[i] >> 16) & 0xFF;
    		data[3 + (i * 4)] = (coeffs[i] >> 8) & 0xFF;
    		data[4 + (i * 4)] = (coeffs[i]) & 0xFF;
    	}
    
        cfg_reg config_reg =
        {
    		{ 0x00, 0x00 },
    		{ 0x7f, 0xAA },
    		{ 0x00, 0x01 },
        };
    
        for(int i = 0; i < 3; i++)
        {
        	ret = tas5825_write(config_reg[0].command, (unsigned char *)&config_reg[0].param, 1);
    		if(ret != kStatus_Success)
    		{
    			PRINTF("TAS I2C register write error");
    			break;
    		}
        }
    
        ret = tas5825_write(data[0], (unsigned char *)&data[1], 20);
    	if(ret != kStatus_Success)
    	{
    		PRINTF("TAS I2C register write error");
    		break;
    	}
    
    }

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

    尊敬的 Sagar:

    您能否向我发送导致器件无法输出的 I2C 写入? 此外、您是否可以读取寄存器0x70至0x73以查看是否引发了故障?

    此致、

    Ramsey

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

    您好、Ramsey、


    请参阅随附的日志文件。  

    TAS 读取值表示0x70至0x73寄存器值。 请检查并提供建议。

    e2e.ti.com/.../TAS_5F00_Logs.txt

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

    附加另一个日志文件、其中我在0x70到0x73寄存器中遇到了一些故障。

    /cfs-file/__key/communityserver-discussions-components-files/6/TAS_5F00_Logs_5F00_with_5F00_falut.txt

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

    尊敬的 Sagar:

    器件似乎遇到时钟故障。 如果将0x80写入寄存器0x78、器件是否恢复播放?

    此致、

    Ramsey

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

    您好、Ramsey、

    我已经尝试将0x80写入0x78寄存器、但没有变化... 一旦滑块值更改、语音就会停止。

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

    尊敬的 Sagar:

    写入命令时、您是否能够探测 I2S 信号?

    此致、

    Ramsey