为什么我的白噪声有跳动/砰砰声/咩咩声?

时间:2011-08-25 16:48:18

标签: android audio

我的Android应用程序试图在Android设备上生成白噪声。目前,我正在生成一个随机数组,即AudioTrack.getMinBufferSize(...)short long,并在计时器中循环。它看起来像这样:

    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);

但是当我在我的机器人模拟器上听它时,我会发出一种非常快速的“殴打”或“咩咩”节奏的白噪声,很难描述。我不是一个音响工程师,有人能指出我为什么会发生这种情况的正确方向吗?

** * ** * ** * 的** * ** 更新 * ** * ** * ** * ** 我只做了几个变化,其中一个是我确保我的样本大小是整数毫秒长,另一个是我的样本大小整整一秒。

样本量为8820(5毫秒长,仍然超过8192),殴打不变。

然而,样本量为44100(一秒钟),殴打消失了。我正在使用的计时器是否可能在较小的时间间隔内不准确?

1 个答案:

答案 0 :(得分:3)

问题似乎是你产生白噪声的方式。我不知道关于android的编程的第一件事,但如果我正确地理解了这个问题,你就会创建一个缓冲区的随机数据,然后一遍又一遍地循环。

问题是(正如您的更新指出的那样)是这个缓冲区每秒重复几次。这意味着它不再是“白色”(即完全随机)的噪音。它变成了周期性的。

你的大脑非常善于选择周期波形,因此你会听到这种殴打的原因。这是你的大脑告诉你除了白噪声之外还有其他事情发生。在这里,您将引入一个5.38Hz左右的强大组件,在调制其他音频时,您将其解释为“跳动”效果。

当您增加缓冲区长度时,跳动消失(或降低到可感知性以下),因为在44100个样本中,您的大脑不再有足够的闩锁,因此无法识别序列是周期性的。低频信息仍然存在。

产生完美的白噪声isn't as straightforward as you might think!。在您的情况下,我认为最好尽可能长时间地制作噪音缓冲区 - 当然取决于您正在构建的应用程序的上下文。