首页 > 解决方案 > 我应该使用 scipy.signal.firwin 进行放大吗?

问题描述

Scipy 的 firwin2 函数接受大于 1.0 的增益值,这会导致相应频率的放大。我已经对此进行了测试,它似乎按预期工作。但是,我在网上找到的所有示例都只使用了 0.0 到 1.0 之间的增益值。这让我想知道:用 firwin2 函数制作和放大滤波器是不是一个坏主意?

标签: scipysignal-processing

解决方案


firwin不接受增益因子,只接受 numtaps

firwin(numtaps, cutoff, width=None, window='hamming', pass_zero=True,
           scale=True, nyq=None, fs=None)

要么我错误地理解了你的问题,要么你cutoff对增益感到困惑。cutoff 表示截止频率

如果要应用增益,则将返回的滤波器乘以增益。

from scipy import signal
numtaps = 3
f = 0.1
gain = 5;
h = gain * signal.firwin(numtaps, f)

您可以绘制过滤器的响应如下

import numpy as np;
import matplotlib.pyplot as plt;

h1 = signal.firwin(256, 0.1)
h2 = signal.firwin(256, 0.3)

plt.plot(np.fft.rfftfreq(len(h1)), abs(np.fft.rfft(h1)))
plt.plot(np.fft.rfftfreq(len(h2)), abs(np.fft.rfft(h2)))
plt.xlabel('F / Fs')
plt.ylabel('Filter gain')

过滤器响应

编辑:关于 firwin2 的问题

函数firwin2 (freq, gain) 返回一个滤波器,该滤波器由频域中的插值构成,后跟一个窗口(标量乘法)。该操作在增益阵列上是线性的。即firwin2(freq, A*gain) = A*firwin2(freq, gain)。所以有类似的限制gain < 1

您可以确认这一点

from scipy import signal
import numpy as np
taps1 = signal.firwin2(150, [0.0, 0.5, 1.0], [1.0, 1.0, 0.0]) * 2
taps2 = signal.firwin2(150, [0.0, 0.5, 1.0], [2.0, 2.0, 0.0])
assert(np.allclose(taps1, taps2))

推荐阅读