【发布时间】:2020-01-29 12:11:50
【问题描述】:
我正在尝试将一个简单的差分方程应用于 numpy 数组作为过滤算法的一部分。问题是python在for循环中重新分配了numpy变量,因此返回了一个零列表。如何重构此代码以通过引用 for 循环来传递 numpy 数组?
def resonant_ladder_filter(vector_in, fc, res):
fs = 44100
fs2 = 2*fs
in2 = signal.decimate(vector_in, 2)
h = signal.firwin(10, 0.5)
in2 = signal.lfilter(h,1,in2)
g = 2*np.pi*fc/fs2
Gres = res;
h0 = g/1.3; h1 = g*0.3/1.3;
w = np.array([0, 0, 0, 0, 0])
wold = np.array([0, 0, 0, 0, 0])
Gcomp = 0.5;
out = np.zeros(len(vector_in))
out2 = np.zeros(len(in2))
for n in range(0,len(in2)):
u = in2[n] - 4*Gres*(wold[4] - Gcomp*in2[n])
w[0] = np.tanh(u)
w[1] = h0*w[0] + h1*wold[0] + (1-g)*wold[1]
w[2] = h0*w[1] + h1*wold[1] + (1-g)*wold[2]
w[3] = h0*w[2] + h1*wold[2] + (1-g)*wold[3]
w[4] = h0*w[3] + h1*wold[3] + (1-g)*wold[4]
out2[n] = w[4]
wold = w
out2 = signal.lfilter(h,1,out2)
out = signal.decimate(out2, 2)
return out
这段代码本质上是用matlab 风格编写的,不能像python 那样即插即用。必须有一个更好的、pythonic 的方式来写这个,我只是无法解决这个问题。
【问题讨论】:
-
嗨 K.Numm,我认为可能有一个非常简单的答案可以跳过整个 for 循环,使用 numpy 矢量化差异运算符。如果您提供带有“掩码”矩阵或过滤器的“之前”矩阵和“之后”矩阵,我可以向您展示如何在没有 for 循环的情况下使用 numpy 执行此操作。我现在很难找出你的样本。 :-)
-
in2 = np.zeros(2*len(vector_in))看起来没有必要,因为您立即拥有in2 = signal.decimate(vector_in, 2) -
@gboffi 这是正确的,谢谢,但不影响手头的问题。
-
@JenniferE.Yoon 我认为你是对的,我在发布之前查看了 numpy vectorize 但无法弄清楚如何在这种情况下应用它
标签: python numpy filter scipy signal-processing