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.

[参考译文] TLV320AIC3111:生成Biquar IIR系数的算法不可能正确

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/656270/tlv320aic3111-the-correctness-of-the-algorithm-for-generating-the-biquar-iir-coefficients-is-not-possible

部件号:TLV320AIC3111

为TLV320AIC3111创建5频段均衡器是一项任务。 系数必须由微控制器根据给定频率的带宽和必要增益(衰减)计算。 系数是使用第12页(附录C)的slaa447脚本计算的。 然后使用TIBQ.exe中计算的系数检查获得的系数。 值​​不同。 即使是附录C中给出的示例的计算也与TIBQ.exe程序所做的计算不一致。 附件A和附件B中给出的例子的计算结果是一致的,但负系数除外,负系数的数值​​相差一个,我理解这是完全可以接受的。 可能是什么问题? 下面我举一个脚本的例子。

% C.1 MATLAB脚本计算[N0,N1,N2,D1,D2]

%用户定义的参数:
FS = 4.8万;%采样频率
F0 = 600;
dBgain = 10;%10 dB
Q = 1;

%intermediate参数
WO=2*PI*f0/FS;
cosW = cos (WO);
Sin W = sin (wo);
A = 10^(dBgain /40);
alpha = sinW/(2*Q*A);

%峰值均衡系数
B0 = 10^(dBgain /20)*(1 + alpha*A);
B1 = 10^(dBgain /20)*(-2*cos (WO));
B2 = 10^(dBgain /20)*(1 - alpha*A);
A0 = 1 +(字母/字母);
a1 =-2*cos(WO);
A2 = 1 -(α/α);

%normalize使A0 = 1
b0 = b0/a0;
B1 = B1/(2*a0);
B2 = B2/a0;
A1 = A1/(-2*a0);
A2 = A2/(-a0);

MX =最大值(abs ([B0,B1,B2]);
如果MX > 1
B0new = B0/MX;
B1new = B1/MX;
B2new = B2/MX;
否则
B0new = B0;
B1new = B1;
B2new = B2;
结束

NB = 16;%位数
范围= 2^(NB-1)-1;

N0 =地板(B0new*Range);
N1 =地板(B1new*系列);
N2 =楼层(B2new*Range);
d1 =楼层(A1*范围);
d2 =地板(A2*Range);


f = 6.5535万;

如果N0 < 0
HEX_N0 = DEC2HEX (BITXOR (ABS (N0),F)+ 1);
否则
HEX_N0 = DEC2HEX (N0,5);
结束

显示('十进制十六进制')
x =[' N0 ',num2str (N0,5),',num2str (hex_N0)];
显示(X)


如果N1 < 0
HEX_N1 = DEC2HEX (BITXOR (ABS (N1),F)+ 1);
否则
HEX_N1 = DEC2HEX (N1,5);
结束

x =[' N1 ',num2str (N1,5),',num2str (hex_N1)];
显示(X)


如果N2 < 0
HEX_N2 = DEC2HEX (BITXOR (ABS (N2),F)+ 1);
否则
HEX_N2 = DEC2HEX (N2,5);
结束

x =[' N2 ',num2str (N2,5),',num2str (hex_N2)];
显示(X)

如果d1 < 0
HEX_D1 = DEC2HEX (BITXOR (ABS (D1),F)+ 1);
否则
HEX_D1 = DEC2HEX (D1,5);
结束

x =[' d1 ',num2str (D1.5),',num2str (hex_d1)];
显示(X)


如果D2 < 0
HEX_D2 = DEC2HEX (BITXOR (ABS (D2),F)+ 1);
否则
HEX_D2 = DEC2HEX (D2,5);
结束

x =[' d2 ',num2str (D2,5),',num2str (hex_d2)];
显示(X)

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

    感谢您提请我们注意此事。 我将评估脚本并回复给您。 这是否阻碍了您的发展? 还是出于好奇?

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

    您好Steve:

    不,这不是一个好奇的问题,我们正在进行第一个具有声音处理的项目,因此在这方面的经验仍然不足。 因此,我们正在努力利用已经准备好的解决办法和发展。 为了验证他们自己计算的正确性,我们尝试使用已经准备好的程序来计算筛选系数(TIBQ.exe),并在计算的数据中遇到差异。 现在,我们分别试图了解我们的错地方。 因此,请帮助处理此问题。

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

    亚历山大

    很抱歉回复延迟。  这一个最初看起来很简单,但每次我以为我做了,就有更多的事情要弄清楚了。

    首先, TIBQ和AIC310x GUI在软件方面相当旧, 我正在尝试查找源代码以查看这些程序如何计算双四倍系数, 但我仍在研究这一点。

    第二, 这两个程序都很好计算系数,但不正确,有一个水平的位移,即 中心频率不正确。  我生成了600 Hz的结果,它给了我一个以630-635 Hz或左右为中心的曲线。 带宽是正确的。

    第三, MATLAB脚本在中间参数定义 中似乎有错误alpha定义为alpha = sinW/(2*Q*A)。 这应该是alpha = sinW/(2*Q)

    第四, TIBQ要求BW, 而Matlab脚本要求Q  和BW当然相关,(Q = F0/BW) 因此,如果您想要拥有100 Hz BW,F0为600, 则Q需要为6。  

    对MATLAB脚本进行这些修改后 ,应该能够生成适当的系数。 我将继续研究为什么TIBQ没有给出正确的系数,  但很难说如果我们最终要更新TIBQ, 那么更有意义的是,我们只需提供某种Excel文件,就可以让人们执行相同的操作。

    以下是MATLAB生成的双四屏响应的屏幕截图。 使用AP获取。  忽略6k以上的回滚, 我使用的EVM 具有无源LPF,可在以较低采样率使用时过滤带外噪声。

    此致,

    -Steve Wilson

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

    您好,Alexandr:  

    我刚刚意识到当我用TIBQ生成系数时,我必须将FS设置为44.1k,所以我的系数是不正确的,这就是为什么要转换的原因。
    我以为我已经仔细检查过了, 但显然我犯了一个错误。

    TIBQ系数是正确的, MATLAB脚本中似乎有一个错误, 我将更仔细地查看它,然后再找您。但现在您可以信任TIBQ

    我使用TIBQ生成的系数为600Hz f0100Hz bw,48K FS,10dB, 峰值EQ与修改后的MATLAB脚本(具有相同参数)附加了一个响应图表。  您可以看到MATLAB脚本响应不对称 ,而TIBQ是对称的。   

    此致,
    -Steve