scipy - 我应该使用 scipy.signal.firwin 进行放大吗?
问题描述
Scipy 的 firwin2 函数接受大于 1.0 的增益值,这会导致相应频率的放大。我已经对此进行了测试,它似乎按预期工作。但是,我在网上找到的所有示例都只使用了 0.0 到 1.0 之间的增益值。这让我想知道:用 firwin2 函数制作和放大滤波器是不是一个坏主意?
解决方案
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))
推荐阅读
- r - 如何在 visNetwork 中显示非彩色图形且易于阅读的文本?
- python - Pyspark + Anaconda 上的 IllegalArgumentException
- c# - Azure webjob convert time to Universal time
- html - 如何控制在社交媒体或移动设备上分享网页时显示的图像?
- maven - 使用 Kafka 运行 Apache Beam 时出现依赖性错误
- c# - Xamarin Forms Bind 命令在 ItemSource 之外
- javascript - 有没有办法对使用 jest 从子 React 组件调用的不可访问的回调函数进行单元测试
- python - Python按面积获取MAX值在cordenates中的列表
- karate - Ui 自动化 - java.net.SocketTimeoutException:读取“驱动程序 url”超时
- python - 如何添加 auxil.py 模块?