Tib*_*ibo 6 python audio wav bandpass-filter
我\xe2\x80\x99m 尝试实现巴特沃斯带通滤波器以在Python 中的wav 文件上实现(我对此非常陌生)。我目前得到的代码如下
\n\nimport wave\nimport numpy\nimport matplotlib.pyplot as plt\nfrom scipy import signal\nfrom scipy.signal import filtfilt\n\n# open the audio file and extract some information\nspf = wave.open(\'clip.wav\',\'r\')\n(nChannels, sampWidth, sampleRate, nFrames, compType, compName) = spf.getparams()\n\n# extract audio from wav file\ninput_signal = spf.readframes(-1)\ninput_signal = numpy.fromstring(input_signal, \'Int16\')\nspf.close()\n\n# create the filter\nN = 4\nnyq = 0.5 * sampleRate\nlow = 100 / nyq\nhigh = 500 / nyq\nb, a = signal.butter(N, [low, high], btype=\'band\')\n\n# apply filter\noutput_signal = signal.filtfilt(b, a, input_signal)\n\n# ceate output file\nwav_out = wave.open("output.wav", "w")\nwav_out.setparams((nChannels, sampWidth, sampleRate, nFrames, compType, compName))\n\n# write to output file\nwav_out.writeframes(output_signal.tobytes())\nwav_out.close()\n\n# plot the signals\nt = numpy.linspace(0, nFrames/sampWidth, nFrames, endpoint = False)\nplt.plot(t, input_signal, label=\'Input\')\nplt.plot(t, output_signal, label=\'Output\')\nplt.show()\nRun Code Online (Sandbox Code Playgroud)\n\n一切工作正常(我认为),但是当我将过滤后的数据(output_signal)写入output.wav 文件时出现问题。出于某种原因,当我听输出的 wav 文件时,听起来就像是很大的噪音。另外,它\xe2\x80\x99s 长度(时间方向)是输入文件的四倍。\n奇怪的是,当我在时域中绘制输入和输出时,我看到输出信号是输入的过滤版本。然而,当在 Audacity 中分析输出声音片段的时域时,它只是很大的噪音,并且 \xe2\x80\x99 根本不像 Python 绘制的时域图。
\n\n我想我在使用 filtfilt 函数或 .tobytes 函数时做错了什么,因为使用 .tobytes 后的输出数组比由 .fromstring 转换时的输入数组大得多,但我可以\xe2\x80\x99t 弄清楚我做错了什么。
\n\n谢谢!
\n小智 2
输入信号应标准化。图表数据显示 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)))
Run Code Online (Sandbox Code Playgroud)
在使用您的代码读取输入信号后和写入输出文件之前(滤波后),我对幅度进行了归一化。