在Python中实现(Butterworth)过滤器并创建wav文件

在Python中实现(Butterworth)过滤器并创建wav文件,python,audio,wav,bandpass-filter,Python,Audio,Wav,Bandpass Filter,我正在尝试实现一个Butterworth带通滤波器,以便在Python中的wav文件上实现(我是非常新的)。我现在得到的代码如下 import wave import numpy import matplotlib.pyplot as plt from scipy import signal from scipy.signal import filtfilt # open the audio file and extract some information spf = wave.open('

我正在尝试实现一个Butterworth带通滤波器,以便在Python中的wav文件上实现(我是非常新的)。我现在得到的代码如下

import wave
import numpy
import matplotlib.pyplot as plt
from scipy import signal
from scipy.signal import filtfilt

# open the audio file and extract some information
spf = wave.open('clip.wav','r')
(nChannels, sampWidth, sampleRate, nFrames, compType, compName) = spf.getparams()

# extract audio from wav file
input_signal = spf.readframes(-1)
input_signal = numpy.fromstring(input_signal, 'Int16')
spf.close()

# create the filter
N = 4
nyq = 0.5 * sampleRate
low = 100 / nyq
high = 500 / nyq
b, a = signal.butter(N, [low, high], btype='band')

# apply filter
output_signal = signal.filtfilt(b, a, input_signal)

# ceate output file
wav_out = wave.open("output.wav", "w")
wav_out.setparams((nChannels, sampWidth, sampleRate, nFrames, compType, compName))

# write to output file
wav_out.writeframes(output_signal.tobytes())
wav_out.close()

# plot the signals
t = numpy.linspace(0, nFrames/sampWidth, nFrames, endpoint = False)
plt.plot(t, input_signal, label='Input')
plt.plot(t, output_signal, label='Output')
plt.show()
一切正常(我想),但当我将过滤后的数据(输出信号)写入output.wav文件时会出现问题。由于某种原因,当我听输出wav文件时,它听起来像是很大的噪音。此外,它的长度(时间)是输入文件的四倍。 奇怪的是,当我在时域中绘制输入和输出时,我看到输出信号是输入的滤波版本。然而,在Audacity中分析输出声音片段的时域时,它只是一个巨大的噪声,与Python中绘制的时域图完全不同

我猜我在使用filtfilt函数或.tobytes函数时做错了什么,因为使用.tobytes后的输出数组比用.fromstring转换的输入数组大得多,但我不知道我做错了什么


谢谢

输入信号应标准化。图表数据显示y轴从30000到-30000。如果将振幅从1.0标准化为-1.0,则可以在audacity上收听波形文件

我使用此代码规范化了1个通道的输入信号

amp = 1.0
input_signal = amp * input_signal / max(abs(max(input_signal)),abs(min(input_signal)))

在使用您的代码读取输入信号后,在写入输出文件(过滤后)之前,我对振幅进行了标准化。

由于
output\u信号
是一个,并且您正在调用它,您确定它是以每采样16位的形式输出的,与您的输入相同吗?我还注意到您正在使用
r
w
进行读写,而不是使用
rb
wb
。这可能也会导致问题吗?更改为
rb
wb
并没有很好地解决问题。在执行
tobytes()时,肯定发生了错误,因为
输出信号
输入信号
数组的大小是相同的,但是在执行
tobytes()时
在这两种情况下,只有
输入数组
被正确地转换回来,而
输出数组
产生了一些没有意义的东西。请帮自己一个忙,使用该模块。这在NumPy阵列中运行良好。