使用PyAudio和scipy.signal创建低通滤波器

时间:2019-01-23 13:45:26

标签: python scipy signal-processing pyaudio lowpass-filter

我建立了一个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()

0 个答案:

没有答案