2009-03-05 31 views
25

((Answer selected - see Edit 5 below。))如何製作粉紅噪聲發生器?

我需要在C#中編寫一個簡單的粉紅噪聲生成器。問題是,我從來沒有做過任何音頻工作,所以我不知道如何與聲卡互動等。我知道我想遠離使用DirectX,主要是因爲我不想使用DirectX爲這個小小的項目下載一個大規模的SDK。

所以,我有兩個問題:

  1. 如何產生粉紅噪聲?
  2. 如何將它流式傳輸到聲卡?

編輯:我真的做一個粉紅噪聲發生器......我知道還有其他方法來解決問題的根源。 =)

編輯2:我們的防火牆阻止流式音頻和視頻 - 否則我只是去www.simplynoise.com如評論中所建議的。 :(

編輯3:我有一代白噪聲下降,以及發送輸出到聲卡 - 現在我需要知道的是如何將白噪聲變成粉紅噪聲。哦 - 我不想循環一個wav文件,因爲我試過用於循環的每個應用程序都會在循環之間留下一個小小的斷點,這足以讓我在第一個方向地方...

編輯4:......我很驚訝有這麼多人跳下去很明確回答的問題,我可能會得到更好的反應,如果我騙我爲什麼。東東d粉紅噪聲......這個問題更多的是關於如何生成和流式傳輸數據到聲卡,而不是關於我應該使用哪種耳機。爲此,我編輯了背景細節 - 你可以在編輯中閱讀...

編輯5:我選擇了Paul的答案,因爲他提供的鏈接給了我轉換的公式白噪聲(通過隨機數發生器很容易產生)變成粉紅噪聲。除此之外,我使用Ianier Munoz's CodeProject entry "Programming Audio Effects in C#"來學習如何生成,修改聲音數據並將其輸出到聲卡。謝謝你們的幫助。 =)

+0

否則,你可以去SimplyNoise.com並專注於你的工作,而不是:) – 2009-03-05 22:20:47

+0

我想,除了我們的防火牆阻止流音頻和視頻。 – 2009-03-05 22:21:57

+0

聽說降噪耳機? – 2009-03-05 23:05:45

回答

15

也許你可以在這裏轉換爲C/C++代碼轉換爲C#:

http://www.firstpr.com.au/dsp/pink-noise/

讓聲音聲卡最簡單的方法是產生一個WAV(吐出一些硬編碼的頭,然後樣品數據)。然後你可以播放.wav文件。

4

不是真的回答你的問題,但你不能只聽一些音樂,理想情況下用一些降噪耳機?

1

我不能說C#,但你可能會用一些好的降噪耳機和你最喜歡的mp3來更好。

2

作爲一種快速和骯髒的方式來做到這一點,如何在音頻播放器中循環播放粉紅噪聲wav? (是的,我知道部分樂趣就是自己動手......)

2

那麼重複使用粉紅噪音的.mp3樣品呢?

8

粉紅噪聲只是通過-3dB /倍頻程LPF產生的白噪聲。您可以使用rand()(或任何生成均勻隨機數的函數)生成白噪聲。

只要你有Google方便的東西,聲卡的流媒體是相當平凡的。如果您選擇避免使用DirectX,請考慮使用PortAudio或ASIO與聲卡進行連接...儘管我認爲您必須使用C++或C.

除此之外,爲什麼會浪費CPU時間來生成它?循環一個該死的WAV文件!

2

您可以使用Audacity來生成儘可能多的粉紅噪聲,然後重複它。

或者你可以挖掘源代碼,看看Audacity是如何產生粉紅噪聲的。

2

下面是回放線程看起來像的一個例子。我使用DirectSound創建了一個寫入示例的SecondaryBuffer。正如你可以看到它是非常簡單的:

/// <summary> 
    /// Thread in charge of feeding the playback buffer. 
    /// </summary> 
    private void playbackThreadFn() 
    { 
     // Begin playing the sound buffer. 
     m_playbackBuffer.Play(0, BufferPlayFlags.Looping); 

     // Change playing state. 
     IsPlaying = true; 

     // Playback loop. 
     while(IsPlaying) 
     { 
      // Suspend thread until the playback cursor steps into a trap... 
      m_trapEvent.WaitOne(); 

      // ...read audio from the input stream... (In this case from your pink noise buffer) 
      Input.Collect(m_target, m_target.Length); 

      // ...calculate the next writing position... 
      var writePosition = m_traps[ ((1 & m_pullCounter++) != 0) ? 0 : 1 ].Offset; 

      // ...and copy audio to the device buffer. 
      m_playbackBuffer.Write(writePosition, m_deviceBuffer, LockFlag.None); 
     } 

     // Stop playback. 
     m_playbackBuffer.Stop(); 
    } 

如果你需要它如何工作的,我會很樂意幫助更多的細節。

6

有點遲到這個我意識到,但任何人遇到它的答案應該知道粉紅噪聲是-3dB /八度的白噪聲,而不是-6如上所述,這實際上是棕色的噪音。

0

如果你在Linux上,你可以使用SOX(你可能已經有了,試試play命令)。

play -t sl - synth 3 pinknoise band -n 1200 200 tremolo .1 40 < /dev/zero