簡體   English   中英

使用Python從Raw WAV音頻文件中刪除噪音(嘶嘶聲)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM