使用Python从原始WAV音频文件中移除噪音(嘶嘶声)

2024-05-15 12:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从波形音频文件中去除噪音(嘶嘶声)。全波音频图如下:

我正在使用下面的代码。这可能是一个愚蠢的尝试,但在matlab中我注意到噪声部分的振幅在0-3000之间变化。所以我试着把它们都归零,然后把新的帧保存到一个新的wav文件中。不知怎的,它没有起作用!在

import wave
import sys
ip = wave.open(sys.argv[1], 'r')

op = wave.open(sys.argv[2], 'w')
op.setparams(ip.getparams())

for i in range(ip.getnframes()):
    iframes = ip.readframes(1)
    amp = int(iframes.encode('hex'),16)
    if amp > 32767:
        amp = 65535 - int(iframes.encode('hex'),16)#-ve
        print amp
    else:
        amp = int(iframes.encode('hex'),16)#+ve
        print amp
    if amp < 2000:
        #make it zero
        final_frame = '\x00\x00'
    else:
        #Keep the frame 
        final_frame = iframe
    op.writeframes(final_frame)
op.close()
ip.close()

运行上述脚本后,它变成了:

噪音部分(<;=2500)仍然存在。因此请建议我如何移除这些不必要的部分!在

谨致问候


Tags: importipsysopenwaveframeencodefinal
2条回答

您的第一个问题是将值解码为big-endian,而它们是actually little-endian。使用^{} module可以很容易地解决这个问题。我还添加了abs函数,因为振幅通常是离零的距离,它总是正的。在

amplitude = abs(struct.unpack('<h', iframe))

这将使您的代码执行您期望的操作。不幸的是,这并不能解决更大的问题,这是完全错误的方法。它不看波形本身,一次只看一个样本。一个运行满刻度的简单正弦波将有许多低于阈值的采样,并且您将通过将它们设置为零来引入显著的失真。在

你的数据是真的有符号还是无符号?如果它是有符号的,你要做的是如果振幅的绝对值是<;3000钳制到0:

if abs(amplitude) < 3000:
    final_frame = '\x00\x00'

如果这是真的,你根本不需要修改振幅。在

如果是无符号数据,那么0实际上是32768。只需减去数字0即可将无符号转换为有符号:

^{pr2}$

注意,这给出了-32768到32767之间的范围。在

如果你喜欢在unsigned中工作,你也可以很容易地做到。但是当你写0帧时,把它写到32768,而不是0,对于无符号,0是负的最大值-一个非常大的信号。在

相关问题 更多 >