gpt4 book ai didi

python - SciPy "lfilter"仅返回 NaN

转载 作者:太空狗 更新时间:2023-10-30 00:46:28 26 4
gpt4 key购买 nike

全部-

我正在尝试使用 SciPy 的 signal.lfilter 函数来过滤样本向量 - 不幸的是,返回的所有内容都是 NaN 的向量。

我绘制了滤波器的频率响应,滤波器系数看起来是正确的;我相当确定问题出在对 lfilter 的实际调用上。

这是我创建的高通 Chebychev 滤波器:

b,a = signal.iirdesign(wp = 0.11, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1')

然后我过滤数据:

filtered_data = signal.lfilter(b, a, data)

下面,我打印了从预过滤数据中选择的 20 个样本,然后是过滤后的数据。您可以清楚地看到问题:

### Printing a small selection of the data before it is filtered:

((-0.003070347011089325+0.0073614344000816345j), (-0.003162827342748642+0.007342938333749771j), (-0.003310795873403549+0.0073614344000816345j), (-0.0031813234090805054+0.007342938333749771j), (-0.003255307674407959+0.007398426532745361j), (-0.003162827342748642+0.007287450134754181j), (-0.003125835210084915+0.007509402930736542j), (-0.003162827342748642+0.007342938333749771j), (-0.0031073391437530518+0.007287450134754181j), (-0.0032368116080760956+0.007398426532745361j), (-0.0030888430774211884+0.007342938333749771j))


### Printing a small selection of the filtered data:

[ nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj
nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj
nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj]

正如我之前所说,滤波器的系数看起来不错。它们是:

b = [  4.06886235e-02  -7.73083846e-01   6.95775461e+00  -3.94272761e+01
1.57709105e+02 -4.73127314e+02 1.10396373e+03 -2.05021836e+03
3.07532754e+03 -3.75873366e+03 3.75873366e+03 -3.07532754e+03
2.05021836e+03 -1.10396373e+03 4.73127314e+02 -1.57709105e+02
3.94272761e+01 -6.95775461e+00 7.73083846e-01 -4.06886235e-02]
a = [ 1.00000000e+00 -1.27730099e+01 7.81201390e+01 -3.03738394e+02
8.40827723e+02 -1.75902089e+03 2.88045462e+03 -3.77173152e+03
3.99609428e+03 -3.43732844e+03 2.38415171e+03 -1.30118368e+03
5.21654119e+02 -1.18026566e+02 -1.85597824e+01 3.24205235e+01
-1.65545917e+01 5.02665439e+00 -9.09697811e-01 7.68172820e-02]

那么为什么 lfilter 只返回 NaN?我如何错误地使用此功能?

预先感谢您的帮助!

编辑:

好的,我解决了。

对于以后遇到这种情况的任何人:

无论出于何种原因,即使过滤器返回的系数看起来不错,但当我随后在 SciPy 的 lfilter 函数中使用这些系数时,过滤后的值是无限的。只需将通带边缘更改为0.11 以外的任何 数字即​​可解决问题。即使这样也行得通:

b,a = signal.iirdesign(wp = 0.119, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1')

除了手动搜索滤波器的极点和零点之外,我不确定您将如何检测滤波器的不稳定性。奇怪。

最佳答案

如果离散传递函数 a(z) 的分母根的绝对值都小于 1,则 IIR 滤波器是稳定的。因此,您可以通过以下代码检测不稳定性:

from scipy import signal
import numpy as np
b1, a1 = signal.iirdesign(wp = 0.11, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1')
b2, a2 = signal.iirdesign(wp = 0.119, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1')

print "filter1", np.all(np.abs(np.roots(a1))<1)
print "filter2", np.all(np.abs(np.roots(a2))<1)

关于python - SciPy "lfilter"仅返回 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com