我的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(一秒钟),殴打消失了。我正在使用的计时器是否可能在较小的时间间隔内不准确?
答案 0 :(得分:3)
问题似乎是你产生白噪声的方式。我不知道关于android的编程的第一件事,但如果我正确地理解了这个问题,你就会创建一个缓冲区的随机数据,然后一遍又一遍地循环。
问题是(正如您的更新指出的那样)是这个缓冲区每秒重复几次。这意味着它不再是“白色”(即完全随机)的噪音。它变成了周期性的。
你的大脑非常善于选择周期波形,因此你会听到这种殴打的原因。这是你的大脑告诉你除了白噪声之外还有其他事情发生。在这里,您将引入一个5.38Hz左右的强大组件,在调制其他音频时,您将其解释为“跳动”效果。
当您增加缓冲区长度时,跳动消失(或降低到可感知性以下),因为在44100个样本中,您的大脑不再有足够的闩锁,因此无法识别序列是周期性的。低频信息仍然存在。
产生完美的白噪声isn't as straightforward as you might think!。在您的情况下,我认为最好尽可能长时间地制作噪音缓冲区 - 当然取决于您正在构建的应用程序的上下文。