为什么我的白噪音有跳动/爆裂/咩咩声?



我的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(整秒)时,这种情况就消失了。有没有可能我使用的计时器在小间隔时不准确?

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

问题,(正如你的更新指出的)是这个单一的缓冲区每秒重复几次。这意味着它不再是"白"(即完全随机的)噪声。它变成了周期性的。

你的大脑非常擅长挑选周期性波形,这就是为什么你会听到这种跳动。这是你的大脑告诉你除了白噪音之外还有别的东西在发生。在这里,你引入了一个5.38Hz左右的强分量,当调制其余音频时,你会将其解释为"跳动"效果。

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

产生完美的白噪声并不像你想象的那么简单!在您的情况下,我认为最好是使噪声缓冲尽可能长-当然这取决于您正在构建的应用程序的上下文。

最新更新