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.

[参考译文] PCM3070:双二阶滤波器-->计算传递函数的系数 N0、N1、N2、D1、D2

Guru**** 2473810 points
Other Parts Discussed in Thread: PCM3070

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1534993/pcm3070-biquad-filter----calculate-the-coefficients-n0-n1-n2-d1-d2-for-the-transfer-function

部件号:PCM3070

工具/软件:

尊敬的 TI:

 

在 PCM3070 上、我想使用一个双二阶滤波器、我尝试使用从“PCM3070 应用参考指南“ SLAU332 第 23 页中获得的传递函数计算系数 N0、N1、N2、D1 和 D2:

 

我使用 Spyder v6.0.6 进行以下代码的计算:

 

将 NumPy 导入为 NP
将 matplotlib.pyplot 作为 plt 导入
从 scipy 导入信号

 

#参数输入
fc = 1000       # frekuensi center dalam Hz
Gain_db = 6     #增益达拉姆 dB
Q = 1.0         # Q 因子
Fs = 44100      #采样率

 

#比例因子 Q23
a = 2**23

 

#命中参数双二阶滤波器(峰值 EQ)
A_GAIN = 10**(gain_db/40)
Omega = 2 * NP.PI * fc / FS
Alpha = np.sin (omega)/(2 * Q)

 

# Koefisien 浮点(双二阶峰值 EQ)
B0 = 1 +α* A_GAIN
B1 =–2 * np.cos(ω)
B2 = 1 — α* A_GAIN
A0 = 1 +α/ A_GAIN
A1 =–2 * np.cos(ω)
A2 = 1 — α/A_gain

 

# Normalizasi agar a0 = 1.
b0 /= a0
B1 /= a0
b2 /= a0
a1 /= a0
a2 /= a0

 

#康维尔斯克定点 Q23(PCM3070 型)
N0 = int (b0 * A)
N1 = int (B1 * A / 2) # Karena di H(z) ada 2*N1
n2 = int (B2 * A)
D1 = int (-A1 * A / 2)
D2 = int (-A2 * A)

 

 

打印(“N0 =“、N0)
打印(“N1 =“、N1)
打印(“N2 =“、N2)
打印(“D1 =“、d1)
打印(“D2 =“、D2)

 

# Frekuensi respon
W、h = signal.freqz([b0、B1、B2]、[1、 A1、A2]、磨损=2048、FS=FS)

 

#绘制幅度响应图
PLT.Figure(图大小=(10、5))
plt.semilogx(w、20 * np.log10 (abs (h))
PLT.TITLE (f'Biquad 滤波器频率响应((fc ={<xmt-block1>fc</xmt-block>}Hz、Gain ={gain_db}dB、Q ={Q})</s>fc
PLT.xlabel ('频率 (Hz)')
PLT.ylabel(“经度 (dB)“)
plt.grid(which='both'、LineStyle='--'、linewidth=0.5)
PLT.axvline (fc、color=red'、LineStyle=':'、label=f' fc ={fc}Hz')
plt.legense()
PLT.xlim (20、Fs/2)
PLT.ylim(–15、15)
plt.show()

参数条目:
频率中心= 1000Hz     
增益 = 6dB
Q factor = 1.0
采样率= 44100Hz
A = 2^23

系数输出结果由您自己计算:

N0 = 8788157
N1 =–7906226
N2 = 7186155
D1 = 7906226
D2 =–7585704

 

通过 PurePath Studio 计算系数输出结果:

N0 = 8388607
N1 =–7543271
N2 = 6852365
D1 = 7904299
D2 =–7581812

 

问题是、为什么我的计算结果与 PurePath Studio 生成的结果不同?
我使用的代码/公式是否有问题?

 

请告知:

此致、

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

    您好、

    您能否分享设置 PurePath Studio 筛选器的屏幕截图? 我想知道“扩展精度“和非扩展精度滤波器之间是否存在一些差异(会影响精度的舍入和长度,这可能会在 Python 和 PPS 代码之间有所不同)、以及所选滤波器的类型(这将影响数学运算)。 另外、这两组值的差异也很小、我不确定它是否会对频率响应产生很大影响。 我在 PPS N0 方面进行了归一化:

    计算得出的 N0、N1、N2、D1、D2:1.0476 - 0.9425 0.8567 0.9425 - 0.9043
    PPS N0、N1、N2、D1、D2:1.0000 –0.8992 0.8169 0.9423 –0.9038

    请告诉我这一点。

    此致、
    Mir

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

    感谢您的答复、  

    随函附上 PPS 的屏幕截图:

    另一方面

    我发现 PCM3070 系数的上限为 2^23 = 8388607、
    在 python 代码中、结果为:
    N0 = 8788157(高于 PCM3070 的上限)
    N1 =–7906226
    N2 = 7186155
    D1 = 7906226
    D2 =–7585704

     

    在 PPS 中、无超过上限:
    N0 = 8388607
    N1 =–7543271
    N2 = 6852365
    D1 = 7904299
    D2 =–7581812

     

    我认为似乎每个系数都有一个缩放比例、以便其不会超过上限。
    或者、可能需要对参数增益、fc 或 Q 系数进行校正、以便系数结果不会超过上限。

    此致、

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

    您好、

    给我几天时间来尝试解决这个问题。 在这里坐下来做一些数学运算需要几个小时、明天是我们在 TI 的假期。 我认为、结果应该是大致相同的滤波器、但我同意可能需要进行一些校正、以便系数保持在器件上处理器和寄存器空间允许的范围内。

    此致、
    Mir

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

    您好、

    我在这里有更新 — 您可以在此处下载 TI 双二阶系数计算器工具: https://www.ti.com/tool/COEFFICIENT-CALC

    虽然该器件并不明确、但它可以计算滤波器的系数、我能够采用 24 位分辨率、其中数字看起来与您的值非常接近。 但是,您的设置有几个方面我不确定 — 首先,我们要确保带宽为 1kHz、我想这来自 PPS 双二阶设计工具。 但是、屏幕截图中没有说明。 以下是我在我的 PPS 中看到的内容:

    其次、双二阶系数计算器使用巴特沃斯 1 型滤波器、但 PPS 滤波器未说明它是什么类型的滤波器、我在任何地方都找不到这些文档。  另一个问题 — 您在哪里可以获得 PPS 的 N0、N1、N2、D1、D2 系数? 我只看到 A 和 B 系数将涉及计算 N-D 系数...

    但是、从屏幕截图中可以看到相同的 B 和 A 系数。

    另一个问题 — 我们为什么要计算这些系数? 您从 PPS 获得的筛选条件是否对您的应用不正确? 此外、您在 PPS 中的所有通滤波器也可能会影响输出、也许您可以将其删除并检查结果是什么?

    此致、
    Mir