2011-08-25 29 views
1

我的android應用程序試圖生成白噪聲,以在Android設備上播放。目前,我正在生成一個隨機數字的數組,這個數字是AudioTrack.getMinBufferSize(...),並且在一個計時器中循環。它看起來像這樣:爲什麼我的白色噪音有跳動/爆裂/ ble氣?

INTERVAL_MILLISECONDS = (int)((double)(bufSize)/(double)(nativeSampleRate * 2) * 1000); 

    timer.scheduleAtFixedRate(new TimerTask() { 

     public void run() { 
      synchronized(this){ 
       //System.out.println("playing. Sample rate is + " + nativeSampleRate + ", buffer is " + data.length + " shorts long, interval is " + INTERVAL_MILLISECONDS); 
       track.write(data, 0, bufSize); 
       track.play(); 
      } 
     } 

    }, 0, INTERVAL_MILLISECONDS); 

但是,當我聽它在我的Android模擬器,我得到白噪聲具有非常快速的「跳動」或「咩咩」的節奏是很難形容。我不是音響工程師,有人能指出我爲什麼會發生這種事情嗎?

** * ** * ** * ** * ** UPDATE * ** * ** * ** * ** 我只是做了幾個變化,其中一個我確定我的樣本量是整數毫秒長,另一個是我做了樣本s整整一秒鐘。

樣本量爲8820(五毫秒長,仍然超過8192最小值),拍子沒有變化。

但是,樣本量爲44100(整整一秒),毆打就消失了。我使用的計時器是否可能在小時間間隔內不準確?

+1

每次運行它時,跳動的速率是否相同? – Erik

+1

Hehehe,完全不相關,但也許SlenderMan試圖帶你離開...!被禁止。非常感謝... – AedonEtLIRA

+0

埃裏克,這是一個很好的問題,我想這可能是。我的採樣率是44100,我的緩衝區大小是8192,這意味着該模式每秒重複5.38次(樣本長度大約爲185毫秒長),並且咩咩聲音聽起來像是這樣快。關於如何平滑它的任何想法? –

回答

3

這個問題似乎是你產生白噪聲的方式。我不知道關於android編程的第一件事,但如果我正確地理解了這個問題,您將創建一個緩衝區的隨機數據,然後一遍又一遍地循環。

問題(正如您的更新指出的那樣)是這個緩衝區每秒重複幾次。這意味着它不再是「白色」(即完全隨機)的噪音。它變得週期性。

你的大腦非常擅長挑選週期性波形,因此你爲什麼會聽到這種跳動。這是你的大腦告訴你,除了白噪聲之外還有其他事情發生。在這裏,你將在5.38Hz左右引入一個強大的組件,在調製剩下的音頻時,你會將其解釋爲「跳動」效果。

當您增加緩衝區長度時,跳動消失(或減小到可感知度以下),因爲在44100樣本您的大腦不再有足夠的時間鎖定,因此無法識別該序列是週期性的。儘管如此,低頻信息仍然存在。

生成完美的白噪音isn't as straightforward as you might think!。在你的情況下,我認爲最好儘可能長時間地製作噪聲緩衝區 - 這取決於你正在構建的應用程序的環境。

+1

難道你不能生成多個緩衝區並以隨機順序重複它們以減少大腦對節拍/模式的感知嗎? –

+0

@Jon - 好主意。我想最終這是硬件需求與需要白噪聲的純粹程度之間的妥協。 – Speedy

+0

非常好!那樣做了!謝謝@Speedy! @Jon,您的多重緩衝理念將爲移動設備節省大量CPU週期。知道什麼有趣?當我在隨機生成的15個緩衝區中隨機選擇我的5毫秒樣本時,仍然可以聽到跳動,儘管它很安靜。但是當我去20個緩衝區時,神器消失了。 –

相關問題