Создание фильтра нижних частот с помощью PyAudio и scipy.signal - PullRequest
0 голосов
/ 23 января 2019

Я создал класс Python, который имеет методы для чтения, записи, сохранения, воспроизведения и отображения аудиофайлов с помощью PyAudio и Matplotlib.Теперь я хочу реализовать простой фильтр нижних частот.Мне удалось собрать метод, который производит фильтр нижних частот с использованием скользящего среднего окна, но в результате получается сигнал, который немного меньше исходного сигнала.

Моя следующая попытка включала использование Баттервортафильтр с scipy.signal.Я просмотрел stackoverflow, чтобы убедиться, что я правильно его реализую, и я так думаю.Однако, когда я применяю свой фильтр нижних частот, мой сигнал становится белым шумом.Я что-то здесь упускаю?

Я приложил соответствующий код ниже;Имейте в виду, что эти функции являются частью более широкого класса.audio - это необработанный аудиосигнал, self.RATE - частота дискретизации, с которой была сделана аудиозапись, а self.filename - это имя файла, в котором сохраняется исходная аудиозапись.

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()
...