gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:13:09 25 4
gpt4 key购买 nike

因此,我正在尝试对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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com