numpy - Scipy Butter带通未获得预期的结果

标签 numpy audio scipy signal-processing butterworth

因此,我正在尝试对wav PCM 24位44.1khz文件进行带通滤波。我想做的是从0Hz-22Khz的每个频率带通。

到目前为止,我已经加载了数据并可以在Matplot上显示它,如下所示。

enter image description here

但是当我应用从这里得到的带通滤波器时

http://scipy-cookbook.readthedocs.io/items/ButterworthBandpass.html

我得到以下结果:
enter image description here

因此,我正在尝试以100-101Hz的频率通过测试,这是我的代码:

from WaveData import WaveData
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter, freqz
from scipy.io.wavfile import read
import numpy as np
from WaveData import WaveData

class Filter:
        def __init__(self, wav):
                self.waveData = WaveData(wav)

        def butter_bandpass(self, lowcut, highcut, fs, order=5):
                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(self, data, lowcut, highcut, fs, order):
                b, a = self.butter_bandpass(lowcut, highcut, fs, order=order)
                y = lfilter(b, a, data)
                return y

        def getFilteredSignal(self, freq):
                return self.butter_bandpass_filter(data=self.waveData.file['Data'], lowcut=100, highcut=101, fs=44100, order=3)

        def getUnprocessedData(self):
            return self.waveData.file['Data']

        def plot(self, signalA, signalB=None):
                plt.plot(signalA)
                if signalB != None:
                        plt.plot(signalB)
                plt.show()

if __name__ == "__main__":
        # file = WaveData("kick.wav")
        # fileA = read("kick0.wav")
        f = Filter("kick.wav")
        a, b = f. butter_bandpass(lowcut=100, highcut=101, fs=44100)
        w, h = freqz(b, a, worN=22000) ##Filted signal is not working?
        f.plot(h, w)
        print("break")

我不明白我哪里出了问题。

谢谢

最佳答案

因此,您的代码存在一些问题,这意味着您无法正确绘制结果,尽管我认为这不是您的主要问题。

检查你的代码

在您链接的示例中,它们精确显示了计算和以不同顺序绘制过滤器的过程:

for order in [3, 6, 9]:
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    w, h = freqz(b, a, worN=2000)
    plt.plot((fs * 0.5 / np.pi) * w, abs(h), label="order = %d" % order)

您目前无法正确缩放频率轴,或者无法调用绝对值来从h获得真实的信息,例如上面的正确代码。

检查你的理论

但是,您的主要问题是您的陡峭带通(即仅100Hz-101Hz)。我很少见到如此锐利的滤波器,因为它非常耗费处理能力(将需要很多滤波器系数),并且因为您只注视1Hz的范围,所以它将完全摆脱所有其他频率。

因此,您所显示的增益为0的图形可能非常正确。如果您使用their example并将带通截止频率更改为100Hz-> 101Hz,则输出结果是零(几乎,如果不是完全的话)的数组。这是因为它只会查看1Hz范围内的信号能量,如果考虑的话,它的非常小。

如果您这样做是为了进行分析,则频率间隔往往会更大,即Octave Bands(或更小的 Octave 频段划分)。

频谱图

由于我不确定您的最终目的,因此无法确切说明您应该采取哪种路线。但是,在当今这个时代,在高达20kHz的每个单个频率上使用带通滤波器似乎是很愚蠢的。

如果我没有记错的话,在纸上用针头进行的首次spectrogram尝试中的某些尝试将此技术与模拟带通滤波器组一起使用来分析频率含量。因此,这使我认为您可能正在寻找与频谱图有关的东西?它使您可以分析整个信号的频率信息与时间的关系,并且仍然具有所有信号的幅度信息。 Python已经具有作为scipyMatplotlib一部分的频谱图功能。

关于numpy - Scipy Butter带通未获得预期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481861/

相关文章:

python - 生成包含另一个 NumPy 数组索引的 NumPy 数组

c# - 在.NET(C#或VB.NET)中生成摩尔斯电码(或任何音频),而无需第三方依赖,也无需使用音频文件

Python scipy.optimize : Using fsolve with multiple first guesses

python - 使用加权多点定位寻找未知点

python - 查找两个列表的索引

python - 如何使用 numpy.void 类型

python - 在numpy中对数组的不均匀段求和

iphone - 一个应用程序中可以有AVFramework和AudioToolbox框架吗?

javascript - 使用 FileOpenPicker 链接到本地​​计算机上的文件时,音频显示 'Invalid source'

python - python中有matlab中digits()和vpa()函数的对应函数吗?