我想从波形音频文件中去除噪音(嘶嘶声)。全波音频图如下:
我正在使用下面的代码。这可能是一个愚蠢的尝试,但在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)仍然存在。因此请建议我如何移除这些不必要的部分!在
谨致问候
您的第一个问题是将值解码为big-endian,而它们是actually little-endian。使用^{} module 可以很容易地解决这个问题。我还添加了
abs
函数,因为振幅通常是离零的距离,它总是正的。在这将使您的代码执行您期望的操作。不幸的是,这并不能解决更大的问题,这是完全错误的方法。它不看波形本身,一次只看一个样本。一个运行满刻度的简单正弦波将有许多低于阈值的采样,并且您将通过将它们设置为零来引入显著的失真。在
你的数据是真的有符号还是无符号?如果它是有符号的,你要做的是如果振幅的绝对值是<;3000钳制到0:
如果这是真的,你根本不需要修改振幅。在
如果是无符号数据,那么0实际上是32768。只需减去数字0即可将无符号转换为有符号:
^{pr2}$注意,这给出了-32768到32767之间的范围。在
如果你喜欢在unsigned中工作,你也可以很容易地做到。但是当你写0帧时,把它写到32768,而不是0,对于无符号,0是负的最大值-一个非常大的信号。在
相关问题 更多 >
编程相关推荐