当我使用Java在Android上进行正弦波生成时会产生很大的噪音

时间:2016-04-14 13:43:36

标签: java android audio pcm audiotrack

我在Android上研究了正弦波生成很长一段时间,我在网上得到了一些示例代码。但是,当我自己编码时,我仍然感到困惑。 我使用如下代码

double[] buf = new double[(int) sampleRate];
byte[] buffer = new byte[(int) sampleRate];
double sampleInterval = sampleRate/frequency;
for(int i=0; i<sampleRate;i++){
    buf[i] = (Math.sin((2.0*Math.PI*i)/sampleInterval));
    buffer[i] = (byte)(buf[i]*Byte.MAX_VALUE);
}
while(flag) {
    audioTrack.write(buffer, 0, buffer.length);
}
  1. 当我播放由公式&#34; Math.sin((2.0 * Math.PI * i)/ sampleInterval)&#34;生成的正弦波缓冲区时,噪音太大。我不知道这是Java和Java的问题。 Android或我的编码。在模拟器和我真正的索尼手机上都显示出噪音。但是在我同学的笔记本电脑上使用Matlab的相同公式可以很好地工作。 我也尝试在桌面java代码中使用DataSourceLine。噪音也存在。
  2. 2.产生的声音往往不稳定,有时是连续的,但有时它可能是断断续续的,声音会有明显的规律性起伏。

    如何改进我的代码以使其稳定和准确?

1 个答案:

答案 0 :(得分:0)

为什么要两个缓冲区?

你可以用一个

来做
double phase = 0.0;
amp = 10000;
short[] buffer = new short[BUFSIZE]; // BUFSIZE should be result from audiotrack.getMinBufferSize
double phaseIncrement = (2 * Math.PI * frequency) / sampleRate;
for (int i = 0; i < BUFSIZE; i++) {
    buffer[i] = (short) (amp * Math.sin(phase));
    phase += phaseIncrement;
}

audioTrack.write(buffer, 0, buffer.length);