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

Eri*_*bes 28 .net c# audio noise

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

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

所以我有两个问题:

  1. 如何生成粉红噪音?
  2. 如何将其流式传输到声卡?

编辑:我真的想制作粉红噪声发生器...我知道还有其他方法可以解决根问题.=)

编辑2:我们的防火墙阻止流式传输音频和视频 - 否则我只是按照评论中的建议去www.simplynoise.com.:(

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

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

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

Pau*_*aul 15

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

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

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


小智 9

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

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

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

  • 请修复你的答案.粉红噪声以每倍频程3 dB的速度下降:http://en.wikipedia.org/wiki/Pink_noise (2认同)

小智 7

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


Dan*_*n W 6

这是一种创建粉红噪声的非常简单的方法,它只是将大量以对数间隔的波加在一起!如果您想要实时创建声音,对于您的目的来说可能太慢,但肯定可以进一步优化(例如:更快的余弦函数)。

该函数输出一个双精度数组,其值介于 -1 到 1 之间。这分别代表波形中的最低点和最高点。

quality参数表示发出声音时产生的波数。我发现 5000 波(每半音大约 40 个间隔)大约是阈值,在该阈值中我无法检测到更高值的任何明显改进,但为了安全起见,您可以(可选)将其增加到大约 10,000 波或更高。此外,根据维基百科,20 赫兹大约是人类听觉感知的下限,但如果您愿意,您也可以更改此设置。

quality请注意,由于技术原因,值越高,声音越安静,因此您可能(可选)希望通过volumeAdjust参数调整音量。

public double[] createPinkNoise(double seconds, int quality=5000, double lowestFrequency=20, double highestFrequency = 20000, 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 (long i = 0; i < samples; i++)
        {
            d[i] += Math.Cos(i * Math.PI * 2 / wavelength + offset) / quality * volumeAdjust;
        }
    }
    return d;
}
Run Code Online (Sandbox Code Playgroud)