2017-09-24 178 views
3
  • 我有一些音頻數據(浮點數組),我用它來繪製一個簡單的 波形。
  • 繪製時,波形不會在邊緣出現最大值。
  • 沒問題 - 數據只需要標準化。我迭代一次找到最大值,然後再次迭代,再除以最大值。再畫一次,一切都很棒!
  • 但是等待有一個大聲的介紹或大爆炸的視頻導致其餘的波形仍然很小。
  • 經過一番研究,我遇到了應該解決這個問題的RMS。我遍歷樣本並計算RMS,並再次將每個樣本除以RMS值。這導致相當大的 「裁剪」:

enter image description here正常化音頻波形代碼實現(峯值,有效值)

  • 什麼是解決這個的最好方法是什麼?
  • 直觀地看,我可能需要基於移動窗口(而不是整個集合)來計算局部最大值或平均值,但我並不完全確定。幫幫我?
  • 注意:波形純粹用於視覺目的(音頻不會播放給用戶)。

回答

2

你可以轉置它(有效地使y軸非線性,或者你可以認爲它是一種形式companding)。

假設信號在[-1,1]的範圍內。

一個流行的快速簡單的解決方案是簡單地應用hyperbolic tangens function(tanh)。這會通過懲罰更高的值來將值限制爲[-1,1]。如果在應用tanh之前放大信號,效果會更加明顯。

另一種選擇是對數變換。隨着信號改變符號,一些預處理必須執行。

如果r是一個系列的樣本值一種方法可能是這樣的:

r.log1p <- log2(1.1 * (abs(r) + 1)) * sign(r) 

也就是說,每個值取其絕對值,增加一個,有一些小的常數相乘,取對數和然後最後乘以其相應的舊值的符號。

的影響可以是這樣的: enter image description here

+0

這是輝煌和完美。關於如何確定給定數據集合適的放大「常數」的任何想法? –

+1

我不太確定我會做什麼來確定。一種方法可能是使用已有的RMS值或滾動RMS的最小值。假設信號已經歸一化,如果RMS值很高,則應該要求較低的預增益常數。準確地說,這種功能關係看起來如何,我不知道,最好的可能是嘗試一些事情。 – AkselA