FIR 设计:在另一个采样频率下计算相同频率响应的系数

信息处理 过滤器 有限脉冲响应
2021-12-31 03:00:33

我想知道是否有标准方法来获取采样频率的 FIR 系数F当系数用于采样频率时F.

我想实现ITU R BS.1770-3中描述的滤波器 (过采样 FIR 滤波器,第 18 页)。滤波器系数是针对 48 kHz 的采样频率给出的。

导出另一个采样频率的系数的方法是什么?

编辑 2012 年 12 月 28 日

我想知道我的请求是否有意义。所描述的滤波器用于 48 kHz 采样频率的音频信号,该音频信号已通过在每个原始样本之间填充 3 个零转换为 192 kHz 采样频率的信号。这是过采样方法的第二步。信号[x0,x1,...,xn]首先转化为[x0,0,0,0,x1,0,0,0,...,xn,0,0,0]. 我提到的滤波器应用于这个零填充信号。

如果我理解正确(可能不是这样),这个低通滤波器的截止频率可以相对于采样频率来表示。鉴于这种情况,以及将音频信号重建为模拟域的一种评估的期望结果,相对于采样频率的截止频率是否适用于任何采样频率?

假设滤波器的截止频率是α×Fs(α对于 22 kHz 模拟上带宽,应该在 0.125 左右?),不是吗?α值是否适合其他采样频率?如果我有一个 8 kHz 采样频率的原始信号,四次过采样将导致 32 kHz 采样频率,我可以假设重建的模拟信号在大约 4 kHz 处具有带宽上限?

编辑结束 2012 年 12 月 28 日

2个回答

没有直接的方法可以在两个采样率之间转换滤波器系数,同时保持精确的传递函数(至少在正确定义的地方)。可以对脉冲响应进行重新采样,但通常会导致额外的延迟、更长的滤波器以及频率响应的一些变化。

但是,在这种情况下,您可以从滤波器系数导出原始滤波器规范,然后使用相同规范以不同的采样率重新设计滤波器。通过目测我们可以发现ITU滤波器是一个等波纹滤波器

  • 通带边缘:20 kHz
  • 阻带边缘:28 kHz
  • 通带纹波:0.1dB
  • 阻带衰减:40 dB

假设您想要 4*44.1kHz 而不是 4*48kHz 的滤波器。在 Matlab 中,您将执行以下操作:

%% match the filter at 44.1 kHz
fs = 4*44100;
d = fdesign.lowpass('Fp,Fst,Ap,Ast',20000,28000,0.1,40,fs);
hd = design(d,'equiripple');
% convert to polyphase
h4 = 4*reshape(hd.Numerator',4,12)';

并且系数将是

    0.0057292     0.001552   -0.0015723   -0.0049864
   -0.0056096   -0.0017098    0.0050592    0.0099256
    0.0080942   -0.0011323    -0.012505    -0.017267
   -0.0093558    0.0088501     0.025828     0.027239
    0.0063161    -0.028386    -0.054115    -0.045155
     0.011432      0.10497      0.20287      0.26531
      0.26531      0.20287      0.10497     0.011432
    -0.045155    -0.054115    -0.028386    0.0063161
     0.027239     0.025828    0.0088501   -0.0093558
    -0.017267    -0.012505   -0.0011323    0.0080942
    0.0099256    0.0050592   -0.0017098   -0.0056096
   -0.0049864   -0.0015723     0.001552    0.0057292

但是,有很多潜在的问题:

  1. 在这种情况下,我们只是幸运地发现新采样率的系数数量也是 48。在其他情况下,您可能必须调整阻带频率以拨入所需数量的系数。
  2. 这个特定的滤波器规范源自原始采样率,即通带和阻带在 24 kHz 的奈奎斯特频率周围对称分布。那是故意的。如果您的采样率不同,您需要了解它为什么不同以及原始规范是否仍然合适。在 44.1 kHz 的情况下,您可以考虑将通带和阻带对称放置在 22.050 kHz 左右,也可以考虑降低通带和/或增加系数的数量。

作为@hilmar 答案的补充,您可以查看libebur128的源代码,其中有一个 C 语言中提到的 BS.1770 过采样过程(参见interp_create函数)的实现,其中包括使滤波器适应各种采样频率。