如何制作粉红噪声发生器?

时间:2009-03-05 22:15:40

标签: c# .net audio noise

((选择答案 - 见下面的编辑5)。)

我需要在C#中编写一个简单的粉红噪声发生器。问题是,我以前从未做过任何音频工作,所以我不知道如何与声卡等进行交互。我知道我想远离使用DirectX,主要是因为我不想要为这个小项目下载一个大规模的SDK。

所以我有两个问题:

  1. 如何生成粉红噪音?
  2. 如何将其流式传输到声卡?
  3. 编辑:我真的想制作一个粉红色的噪音生成器...我知道还有其他方法可以解决根问题。 =)

    编辑2 :我们的防火墙会阻止流媒体音频和视频 - 否则我只会按照评论中的建议转到www.simplynoise.com。 :(

    编辑3 :我已经产生了白噪声,并将输出发送到声卡 - 现在我需要知道的是如何将白噪声转化为粉红噪音。哦 - 而且我不想循环一个wav文件,因为我尝试用于循环的每个应用程序最终都会在循环之间产生一点点中断,这足以让我在这个方向上提示我...

    编辑4 :...我很惊讶很多人都非常明确地而不是回答了一个问题。如果我说谎为什么我需要粉红噪声,我可能会得到更好的响应......这个问题更多的是关于如何生成和流式传输数据到声卡而不是我应该使用什么类型的耳机。为此,我已经删除了背景细节 - 您可以在编辑中阅读它...

    编辑5 :我在下面选择了Paul的答案,因为他提供的链接给了我一个公式,可以将白噪声(很容易通过随机数生成器生成)转换为粉红噪声。除此之外,我使用Ianier Munoz's CodeProject entry "Programming Audio Effects in C#"来学习如何生成,修改和输出声卡的声音数据。谢谢你们的帮助。 =)

11 个答案:

答案 0 :(得分:15)

也许您可以将C / C ++代码转换为C#:

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

获取声卡的最简单方法是生成一个wav(吐出一些硬编码头然后采样数据)。然后你可以播放.wav文件。

答案 1 :(得分:8)

粉红噪声只是白噪声通过-3dB /倍频程LPF。您可以使用rand()(或生成均匀随机数的任何函数)生成白噪声。

只要你有谷歌方便,流媒体到声卡的东西是相当微不足道的。如果您选择避免使用DirectX,请考虑使用PortAudio或ASIO与声卡接口......虽然我认为您将不得不使用C ++或C.

除此之外,为什么浪费CPU时间产生呢?循环一个该死的WAV文件!

答案 2 :(得分:6)

有点迟到这个我意识到,但任何遇到答案的人都应该知道粉红噪声是-3dB /倍频程的白噪声,而不是如上所述的-6,这实际上是棕色噪声。

答案 3 :(得分:3)

对你的问题不是一个真正的答案,但是你不能只听一些音乐,理想的是用一些降噪耳机吗?

答案 4 :(得分: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();
    }

如果您需要更多有关其工作原理的详细信息,我将很乐意为您提供帮助。

答案 5 :(得分:1)

作为一种快速而肮脏的方法,如何在音频播放器中循环粉红色的噪音? (是的,我知道有趣的一部分就是亲自制作....)

答案 6 :(得分:1)

重复粉红噪音的.mp3样本怎么样?

答案 7 :(得分:1)

您可以使用Audacity生成尽可能多的粉红噪音,然后重复播放。

或者你可以深入研究源代码,看看Audacity如何产生粉红噪声。

答案 8 :(得分:1)

这是一种产生粉红色噪声的非常简单的方法,该噪声只是将许多对数相隔一定距离的波加在一起!如果您想实时创建声音,这可能太慢了,但确实可以进一步优化(例如,更快的余弦函数)。

函数输出一个双精度数组,其值从-1到1。分别表示波形的最低和最高点。

quality参数代表产生声音的波数。我发现5000个波(每个半音大约40个间隔)正好接近阈值,在此阈值下我无法检测到任何较大的改善,但为了安全起见,您可以(可选)将其增加到大约10,000个波或更高。另外,根据Wikipedia的说法,就我们能听到的声音而言,20赫兹处于人类感知的下限附近,但是您也可以根据需要对此进行更改。

请注意,由于技术原因,声音会以更高的quality值变得更安静,因此您(可选)可能希望通过volumeAdjust参数来调节音量。

public double[] createPinkNoise(double seconds, int quality=5000, double lowestFrequency=20, double highestFrequency = 44100, double volumeAdjust=1.0)
{
    long samples = (long)(44100 * seconds);
    double[] d = new double[samples];
    double[] offsets = new double[samples];
    double lowestWavelength = highestFrequency / lowestFrequency;
    Random r = new Random();
    for (int j = 0; j < quality; j++)
    {
        double wavelength = Math.Pow(lowestWavelength, (j * 1.0) / quality)  * 44100 / highestFrequency;
        double offset = r.NextDouble() * Math.PI*2;     // Important offset is needed, as otherwise all the waves will be almost in phase, and this will ruin the effect!
        for (int i = 0; i < samples; i++)
        {
            d[i] += Math.Cos(i * Math.PI * 2 / wavelength + offset) / quality * volumeAdjust;
        }
    }
    return d;
}

答案 9 :(得分:0)

我不能谈论C#,但你可能会用一些好的降噪耳机和你最喜欢的mp3来改善。

答案 10 :(得分:0)

如果您使用的是Linux,则可以使用SOX(您可能已经拥有它,请尝试使用play命令。)

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