【发布时间】:2017-05-09 09:53:00
【问题描述】:
我正在尝试实现一个 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_signal)写入 output.wav 文件时出现问题。出于某种原因,当我收听输出 wav 文件时,它听起来像是很大的噪音。此外,它的长度(时间)是输入文件的四倍。 奇怪的是,当我在时域中绘制输入和输出时,我看到输出信号是输入的滤波版本。然而,在 Audacity 中分析输出声音片段的时域时,它只是很大的噪音,看起来根本不像 Python 中绘制的时域图。
我想我在使用 filtfilt 函数或 .tobytes 函数时做错了,因为使用 .tobytes 后的输出数组在由 .fromstring 转换时比输入数组大得多,但我可以'不知道我做错了什么。
谢谢!
【问题讨论】:
-
更改为
rb和wb遗憾地没有解决问题。在tobytes()期间一定发生了错误,因为output_signal和input_signal数组的大小是一样的,但是当对它们都执行tobytes()时,只有input_array被正确转换回来,而output_array会产生一些没有意义的东西。 -
帮自己一个忙,使用soundfile 模块。这适用于 NumPy 数组。
标签: python audio wav bandpass-filter