python - SciPy "lfilter"仅返回 NaN

标签 python numpy signal-processing scipy

全部-

我正在尝试使用 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/

相关文章:

Python pandas read_table 将零转换为 NaN

python - 尝试从 python 字典创建一个二维数组

python - Python : How does the scipy. signal.find_peaks_cwt 函数中的峰值检测有效吗?

algorithm - 自相关算法在高频下失败

iphone - iOS 带通滤波器

python - 减少文本文件大小的编程技术

python - 消息中的不和谐 channel 链接

python - 循环 numpy 数组索引

python - 在 Python 中读取具有特定序列的二进制文件

python - Numpy:多维数组值内的比较