将采样率/截止频率转换为离散时间IIR滤波器系统中的π弧度/样本

4 投票
2 回答
7301 浏览
提问于 2025-04-16 09:59

我正在用Python和Numpy/Scipy做一些数字滤波的工作。

我使用scipy.signal.iirdesign来生成我的滤波器系数,但它需要我不太熟悉的格式来输入滤波器的通带系数。

wp, ws : float

  Passband and stopband edge frequencies, normalized from 0 to 1 (1 corresponds 
      to pi radians / sample). 
  For example:
  Lowpass: wp = 0.2, ws = 0.3
  Highpass: wp = 0.3, ws = 0.2

(可以从这里找到相关信息)

我对数字滤波器不太了解(我之前是做硬件设计的)。在模拟电路中,我会确定所需的斜率和3db下降点,然后根据这些计算元件的值。

在这个情况下,我该如何根据已知的采样率、想要的截止频率和期望的滚降,来计算出wp, ws的值呢?

(这可能更适合在math.stackexchange上讨论。我不太确定)

2 个回答

2

我们来看一个函数 x(t) = cos(2*pi*fa*t)。如果我们以频率 fs 进行采样,那么采样后的函数就是 x(n*ts) = x(n/fs) = cos(2*pi*n*fa/fs)。在采样时,避免混叠(也就是信号重叠)的最高频率叫做奈奎斯特频率,它的计算方式是 fa = fs/2,归一化后变成 (fs/2)/fs = 1/2。归一化的角频率是 2*pi*1/2 rad/sample = pi rad/sample。所以这个信号 x[n] = cos[pi*n] = [1,-1,1,-1,...]

对于某个特定频率,比如一个拐角频率 2*pi*fc rad/s,它的采样版本会是 2*pi*fc/fs rad/sample。相对于奈奎斯特频率 pi 来说,这个频率可以表示为 2*fc/fs = fc/(fs/2)

这里有几个重要的公式:

exp[j*w*n] = cos[w*n] + j*sin[w*n]
x_even[n] = 0.5*x[n] + 0.5*x[-n]
cos[w*n] = 0.5*exp[j*w*n] + 0.5*exp[-j*w*n]    # cos is even
x_odd[n] = 0.5*x[n] - 0.5*x[-n]
j*sin[w*n] = 0.5*exp[j*w*n] - 0.5*exp[-j*w*n]  # sin is odd

一个实值信号的偶数部分(就是一堆余弦的和)的离散傅里叶变换(DFT)会是实数且对称,而奇数部分(就是一堆正弦的和)的 DFT 会是虚数且反对称。因此,对于像典型滤波器的脉冲响应这样的实值信号,幅度谱是对称的,而相位谱是反对称的。所以你只需要指定滤波器在从 0 到 pi 的范围内,这个范围被归一化到 [0,1]

6

如果你的采样频率是 fs,那么奈奎斯特频率就是 fs/2。这表示你可以表示的最高频率,而不会出现混叠现象。这个奈奎斯特频率也可以理解为文档中提到的归一化值 1。因此,如果你要设计一个低通滤波器,边缘频率是 fc,你需要把它输入为 fc / (fs/2)。

举个例子,假设你的 fs=8000,那么 fs/2=4000。你想要一个边缘频率为 3100 的低通滤波器,停止带频率为 3300。这样计算出来的值就是 wp=fc/(fs/2)=3100/4000。停止带频率则是 3300/4000。

这样说清楚了吗?

撰写回答