Python 执行简单低通滤波器时数组异常 - 输出为 0
Python array weirdness when doing simple lowpass filter - output is 0
我希望有人能提供帮助。这很奇怪。完全相同的代码适用于其他输入(例如 Dirac Delta、阶跃函数、[1,-1,1,-1,...])。输出图与其他输入一起按预期工作。我真的很茫然。
下面显示的原始低通计算(例如 a0 * x[n] + a1 * xn1)有效(即结果为 [0, .5, .5, -. 5, -.5, ...]), 但是赋值给y[n]时失败了(每次循环都赋0).
知道我错过了什么吗?
# create simple signal array [0, 1, 0, -1, ...]
x = []
for n in range(0,125):
x.append(0)
x.append(1)
x.append(0)
x.append(-1)
y = np.full_like(x,7)
a0 = 0.5
a1 = 0.5
xn1 = 0.0
# simple lowpass filter
for n in range(np.size(x)):
y[n] = a0 * x[n] + a1 * xn1 # why is this always 0?
xn1 = x[n]
# simple plotting function (output shown in image below)
# should output 0 then [.5, .5, -.5, -.5, ...]
fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle(title)
ax1.stem(x[0:10])
ax1.set_title('halfNyq (x)')
ax1.locator_params(axis="x", nbins=16)
ax1.locator_params(axis="y", nbins=7)
ax2.stem(y[0:10])
ax2.set_title('output (y)')
ax2.locator_params(axis="x", nbins=16)
ax2.locator_params(axis="y", nbins=7)
fig.tight_layout(pad=1.0)
您是否费心跟踪您的计算?这很好地解释了为什么它总是 0。
for n in range(np.size(x)):
y[n] = a0 * x[n] + a1 * xn1 # why is this always 0?
print(y[n], x[n], xn1)
xn1 = x[n]
输出:
0 0 0.0
0 1 0
0 0 1
0 -1 0
0 0 -1
0 1 0
0 0 1
0 -1 0
0 0 -1
...
在每次迭代中,您将 xn1
设置为与 x[n]
的下一个值完美互补的值,从而确保每个 y
值为零。这不是带通滤波器,它是针对循环波形的噪声消除电路。
您在循环中错误地将元素分配给了 numpy 数组。您可以将其更改为列表:
y = np.full_like(x,7).tolist()
如果您在某处添加 print(y.dtype)
以检查 y
的数据类型,您可能会看到它是 int64
。源列表 x
只有 int
个对象,因此 full_like
认为您需要一个整数数组。
For example, you can create an array from a regular Python list or tuple using the array function. The type of the resulting array is deduced from the type of the elements in the sequences.
将 x
中的值更改为例如0.0
等,因此它们是 float
而不是 int
。或者将 dtype
参数传递给 full_like()
以强制类型,例如y = np.full_like(x, 7, dtype=float)
.
我希望有人能提供帮助。这很奇怪。完全相同的代码适用于其他输入(例如 Dirac Delta、阶跃函数、[1,-1,1,-1,...])。输出图与其他输入一起按预期工作。我真的很茫然。
下面显示的原始低通计算(例如 a0 * x[n] + a1 * xn1)有效(即结果为 [0, .5, .5, -. 5, -.5, ...]), 但是赋值给y[n]时失败了(每次循环都赋0).
知道我错过了什么吗?
# create simple signal array [0, 1, 0, -1, ...]
x = []
for n in range(0,125):
x.append(0)
x.append(1)
x.append(0)
x.append(-1)
y = np.full_like(x,7)
a0 = 0.5
a1 = 0.5
xn1 = 0.0
# simple lowpass filter
for n in range(np.size(x)):
y[n] = a0 * x[n] + a1 * xn1 # why is this always 0?
xn1 = x[n]
# simple plotting function (output shown in image below)
# should output 0 then [.5, .5, -.5, -.5, ...]
fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle(title)
ax1.stem(x[0:10])
ax1.set_title('halfNyq (x)')
ax1.locator_params(axis="x", nbins=16)
ax1.locator_params(axis="y", nbins=7)
ax2.stem(y[0:10])
ax2.set_title('output (y)')
ax2.locator_params(axis="x", nbins=16)
ax2.locator_params(axis="y", nbins=7)
fig.tight_layout(pad=1.0)
您是否费心跟踪您的计算?这很好地解释了为什么它总是 0。
for n in range(np.size(x)):
y[n] = a0 * x[n] + a1 * xn1 # why is this always 0?
print(y[n], x[n], xn1)
xn1 = x[n]
输出:
0 0 0.0
0 1 0
0 0 1
0 -1 0
0 0 -1
0 1 0
0 0 1
0 -1 0
0 0 -1
...
在每次迭代中,您将 xn1
设置为与 x[n]
的下一个值完美互补的值,从而确保每个 y
值为零。这不是带通滤波器,它是针对循环波形的噪声消除电路。
您在循环中错误地将元素分配给了 numpy 数组。您可以将其更改为列表:
y = np.full_like(x,7).tolist()
如果您在某处添加 print(y.dtype)
以检查 y
的数据类型,您可能会看到它是 int64
。源列表 x
只有 int
个对象,因此 full_like
认为您需要一个整数数组。
For example, you can create an array from a regular Python list or tuple using the array function. The type of the resulting array is deduced from the type of the elements in the sequences.
将 x
中的值更改为例如0.0
等,因此它们是 float
而不是 int
。或者将 dtype
参数传递给 full_like()
以强制类型,例如y = np.full_like(x, 7, dtype=float)
.