我的android应用正在尝试产生白噪声以在android设备上播放。当前,我正在生成一个随机数数组,该数组为AudioTrack.getMinBufferSize(...)短时长,并在计时器中循环通过。看起来像这样:

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

但是,当我在android模拟器上聆听它时,我会听到白噪声,并具有难以描述的非常快的“拍打”或“跳动”节奏。我不是音响工程师,有人可以为我指出正确的方向吗?

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

样本大小为8820(五毫秒长,仍然超过最小8192),其跳动没有改变。

但是,样本大小为44100(一整秒)时,跳动消失了。我使用的计时器是否有可能在小间隔内不准确?

最佳答案

问题似乎出在您产生白噪声的方式上。我不了解有关在Android上进行编程的第一件事,但是如果我正确理解了这个问题,则说明您正在创建一个包含单个缓冲区的随机数据,然后反复遍历该缓冲区。

问题(正如您的更新所指出的)是,该单个缓冲区每秒重复几次。这意味着它不再是“白”(即完全随机的)噪声。它已成为周期性的。

您的大脑非常擅长拾取周期性波形,因此您为什么会听到这种跳动。这是您的大脑告诉您,除了白噪声之外,还有其他事情正在发生。在这里,您将引入一个约5.38Hz的强分量,当调制其余音频时,您会将其解释为“跳动”效果。

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

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

关于android - 为什么我的白噪声会跳动/弹出/跳动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7194189/

10-09 13:18