我建立了一个python类,该类具有使用PyAudio和Matplotlib读取,记录,保存,重放和显示音频文件的方法。我现在想实现一个简单的低通滤波器。我设法组合了一种方法,该方法使用开窗的均值生成低通滤波器,但是所产生的信号略小于原始信号。
我的下一次尝试涉及将scipy.signal与Butterworth滤波器一起使用。我搜寻了stackoverflow以确保我正确地实现了它,而且我想是的。但是,当我应用低通滤波器时,我的信号变成白噪声。这里有我想念的东西吗?
我已附上以下相关代码;请记住,这些功能是较大类的一部分。 audio
是原始音频信号,self.RATE
是记录音频的采样率,self.filename
是存储原始音频记录的文件的名称。< / p>
def butter_lowpass(self,cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
def butter_lowpass_filter(self,data, cutoff, fs, order=5):
b, a = self.butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
def lowpass(self):
# Filter requirements.
order = 6
fs = self.RATE # sample rate, Hz
cutoff = 1000 # desired cutoff frequency of the filter, Hz
# Get the filter coefficients.
b, a = self.butter_lowpass(cutoff, fs, order)
audio,duration,frames,bps,dt = self.read_audio(self.filename)
filtered = self.butter_lowpass_filter(audio, cutoff, fs, order)
# Rewrite to file.
wav_file = wave.open(self.filename, "w")
wav_file.setparams((1, bps, self.RATE, frames, 'NONE', 'not compressed'))
wav_file.writeframes(filtered.tobytes('C'))
wav_file.close()