Я создал класс 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()