当我在 .wav 音频文件上使用 scipy 的黄油函数作为 4 阶带通滤波器时,它可以工作,但是当我直接在同一音频上使用相同的滤波器系数时,它不起作用。
我正在尝试使用 Python 在 .wav 音频文件上实现带通滤波器。最初,我使用 scipy 中的 butter 函数来生成滤波器系数,并使用 filtfilt 应用滤波器,效果很好。然而,当我尝试直接使用与lfilter相同的滤波器系数时,我没有得到预期的结果。这是我尝试过的:
首先,这是使用 filtfilt 工作的代码:
from scipy.signal import butter, filtfilt
from scipy.io import wavfile
def butter_bandpass(lowcut, highcut, fs, order=4):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs, order=4):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = filtfilt(b, a, data)
return y
filename = "Heart Data 1 (1).wav"
fs, data = wavfile.read(filename)
lowcut = 30
highcut = 450
order = 4
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
print("Filter Coefficients (b):", b)
print("Filter Coefficients (a):", a)
filtered_data = butter_bandpass_filter(data, lowcut, highcut, fs, order=order)
此代码产生了所需的带有系数的滤波音频
b = [3.76138361e-05, 0.00000000e+00, -1.50455344e-04, 0.00000000e+00,
2.25683017e-04, 0.00000000e+00, -1.50455344e-04, 0.00000000e+00,
3.76138361e-05]
a = [1.0, -7.56134654, 25.03021633, -47.37940103, 56.09188775,
-42.53071304, 20.16985559, -5.46999014, 0.64949108]
但是,当我尝试直接使用相同的滤波器系数与
lfilter
时,我没有得到预期的结果:
from scipy.signal import lfilter
from scipy.io import wavfile
filename = "Heart Data 1 (1).wav"
fs, data = wavfile.read(filename)
b = [3.76138361e-05, 0.00000000e+00, -1.50455344e-04, 0.00000000e+00,
2.25683017e-04, 0.00000000e+00, -1.50455344e-04, 0.00000000e+00,
3.76138361e-05]
a = [1.0, -7.56134654, 25.03021633, -47.37940103, 56.09188775,
-42.53071304, 20.16985559, -5.46999014, 0.64949108]
filtered_data = lfilter(b, a, data)
此代码没有产生所需的过滤音频。
我希望这两种方法都能产生相同的滤波音频,因为我使用了相同的滤波器系数。有人可以帮助我理解使用
lfilter
的第二种方法可能会出现什么问题吗?谢谢!