将采样率/截止频率转换为离散时间IIR滤波器系统中的π弧度/样本
我正在用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 个回答
我们来看一个函数 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]
。
如果你的采样频率是 fs,那么奈奎斯特频率就是 fs/2。这表示你可以表示的最高频率,而不会出现混叠现象。这个奈奎斯特频率也可以理解为文档中提到的归一化值 1。因此,如果你要设计一个低通滤波器,边缘频率是 fc,你需要把它输入为 fc / (fs/2)。
举个例子,假设你的 fs=8000,那么 fs/2=4000。你想要一个边缘频率为 3100 的低通滤波器,停止带频率为 3300。这样计算出来的值就是 wp=fc/(fs/2)=3100/4000。停止带频率则是 3300/4000。
这样说清楚了吗?