直接应用于音频文件时滤波器系数不起作用?

问题描述 投票:0回答:1

当我在 .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
的第二种方法可能会出现什么问题吗?谢谢!

python filter scipy signal-processing bandpass-filter
1个回答
0
投票

Lfilterfiltfilt 不同。

lfilter
方法应用过滤一次,使用标准方法

a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[nb]*x[n-nb]
                        - a[1]*y[n-1] - ... - a[na]*y[n-na]

filtfilt
方法应用过滤两次,每次都使用上述标准方法,但第二次使用反向信号。所以:

  • 消除了延迟(价格会增加两次延迟,但第二次会取消第一次延迟)
  • 由于信号被过滤两次,因此可以解释为 加倍滤波器阶数
© www.soinside.com 2019 - 2024. All rights reserved.