我正在尝试实现一个巴特沃斯带通滤波器,以便在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文件写入过滤数据(output_signal)时出现了一个问题。由于某些原因,当我听到输出的wav文件时,它听起来就像是很大的噪音。而且,它的长度(时间方向)是输入文件的四倍。奇怪的是,当我在时域中绘制输入和输出时,我看到输出信号是输入的滤波版本。但是,当在Audacity中分析输出声音片段的时域时,它只是很大的噪声,看起来一点也不像Python中绘制的时域图形。
我猜我在使用filtfilt函数或.tobytes函数时做错了什么,因为使用.tobytes之后的输出数组在被.fromstring转换时要比输入数组大得多,但是我不知道我做错了什么。
谢谢!
发布于 2018-08-08 22:17:49
应该对输入信号进行归一化。图形数据显示了从30000到-30000的y轴。如果你将振幅从1.0归一化到-1.0,那么你将能够在audacity上收听到wave文件。
我使用此代码对1个通道的输入信号进行归一化
amp = 1.0
input_signal = amp * input_signal / max(abs(max(input_signal)),abs(min(input_signal)))在使用您的代码读取输入信号之后,在写入输出文件之前(在滤波之后),我对振幅进行了归一化。
https://stackoverflow.com/questions/41305720
复制相似问题