修改代码后错误如下Traceback (most recent call last): File "D:\Program Files\JetBrains\PyCharm 2023.1\PycharmProject\test\test3.py", line 28, in <module> b, a = scipy_signal.butter(3, bp_stop_Hz / (fs / 2.0), 'bandstop') # 使用重命名后的库名称 File "D:\ProgramData\anaconda3\lib\site-packages\scipy\signal\_filter_design.py", line 3094, in butter return iirfilter(N, Wn, btype=btype, analog=analog, File "D:\ProgramData\anaconda3\lib\site-packages\scipy\signal\_filter_design.py", line 2556, in iirfilter raise ValueError("Digital filter critical frequencies " ValueError: Digital filter critical frequencies must be 0 < Wn < 1
时间: 2023-07-21 09:36:19 浏览: 265
浅谈Python traceback的优雅处理
这个错误提示是说数字滤波器的关键频率必须在 0 和 1 之间,而你传递给 `scipy_signal.butter` 的 `bp_stop_Hz / (fs / 2.0)` 的值显然不在这个范围内。这是因为你没有正确指定 `bp_stop_Hz` 的值。
你在代码中定义了 `notch_freq_Hz`,它是一个包含单个元素的 NumPy 数组,其中包含了要去除的工频干扰频率。但是,在使用 `np.nditer` 迭代这个数组时,你没有正确获取数组中的元素,而是直接将整个数组传递给了 `bp_stop_Hz`。这就是导致错误的原因。
要解决这个问题,你可以使用 `np.nditer` 迭代数组元素的正确方式,即使用 `for freq_Hz in np.nditer(notch_freq_Hz):`。然后,你需要将 `freq_Hz` 的值转换为小数形式,并计算出正确的 `bp_stop_Hz` 的值,例如:
```
for freq_Hz in np.nditer(notch_freq_Hz):
freq_Hz = float(freq_Hz) # 转换为小数形式
bp_stop_Hz = freq_Hz + 3.0 * np.array([-1, 1]) * (freq_Hz / fs) # 计算正确的 bp_stop_Hz 值
b, a = scipy_signal.butter(3, bp_stop_Hz, 'bandstop') # 使用计算出的 bp_stop_Hz 值
filtered_signal = scipy_signal.lfilter(b, a, filtered_signal)
```
这样,你就可以避免错误了,并且可以正确地去除工频干扰。
阅读全文