在NumPy中使用枚举索引实现FIR滤波器时触发IndexError
问题分析与修复
错误根源
你代码里的enumerate用法错了——enumerate(x)返回的是**(索引, 对应元素)**的元组,比如遍历到第一个元素时,n是(0, x[0]),不是单纯的整数索引。你直接把n和k(同样是元组)当成数组索引用,自然会触发IndexError,因为numpy数组只接受整数、切片这类合法索引。
修复步骤
- 修正循环变量:只提取
enumerate返回的索引值,或者直接用range生成索引,不用管元素值; - 处理边界条件:当
n_idx < k_idx时,n_idx - k_idx是负数,这时候应该用0来填充(FIR滤波器的初始零状态假设),否则会取到数组末尾的元素,完全不符合滤波逻辑。
修复后的代码
import numpy as np def filter(x): h = np.array([-0.0147, 0.173, 0.342, 0.342, 0.173, -0.0147]) y = np.zeros_like(x) # 遍历每个输出点的索引 for n_idx in range(len(x)): total = 0.0 # 遍历每个滤波器系数 for k_idx in range(len(h)): # 计算输入信号的索引,小于0时取0 x_idx = n_idx - k_idx x_val = x[x_idx] if x_idx >= 0 else 0.0 total += h[k_idx] * x_val y[n_idx] = total return y
额外优化(可选)
如果想提高效率,完全可以用numpy的卷积函数直接实现,代码更简洁:
import numpy as np def filter(x): h = np.array([-0.0147, 0.173, 0.342, 0.342, 0.173, -0.0147]) # 使用full卷积,然后截取和输入长度一致的部分(对应零状态滤波) y = np.convolve(x, h, mode='same') return y
mode='same'会让输出长度和输入x一致,和你手动实现的逻辑匹配。
内容的提问来源于stack exchange,提问作者gann
相关产品推荐
相关产品推荐

