![](/img/trans.png)
[英]How to find time of high frequency noise in an audio wav / raw file using Python?
[英]Remove Noise(hiss) from Raw WAV audio file using 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)仍然存在。.所以請建議我如何去除那些不必要的部分!
最好的祝福,
您的第一個問題是,您將值解碼為big-endian,而實際上卻是little-endian 。 您可以使用struct
模塊輕松修復該問題。 我還添加了abs
函數,因為振幅通常是從零開始的距離,該距離始終為正。
amplitude = abs(struct.unpack('<h', iframe))
這將使您的代碼達到您的期望。 不幸的是,它不能解決更大的問題,那就是這完全是錯誤的方法。 它不查看波形本身,而是一次僅查看一個樣本。 運行滿量程的簡單正弦波將有許多采樣值低於閾值,並且將其設置為零會引入明顯的失真。
您的數據是真的簽名還是未簽名? 如果已簽名,那么您要做的是幅度的絕對值 <3000鉗位為0:
if abs(amplitude) < 3000:
final_frame = '\x00\x00'
如果是這樣,則根本不需要修改振幅。
如果它是無符號數據,那么您的0實際上是32768。您可以通過簡單地減去數字0來將無符號轉換為有符號:
amp = int(iframe.encode('hex'),16)
amp -= amp - 32768
請注意,這為您提供了-32768..32767之間的范圍。
如果您喜歡以無符號方式工作,那么也可以輕松地做到這一點。 但是,當您寫入0幀時,將其寫入32768,而不是0,因為無符號,0是負的最大值-一個非常大的信號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.