Android: генерация синусоидальной волны

Я пытаюсь использовать AudioTrack для генерации синусоидальных, прямоугольных и пилообразных волн. Однако звук, который он создает, не похож на чистую синусоидальную волну, а на него накладывается какая-то другая волна. Как мне получить чистую синусоидальную волну, как во втором примере кода, при использовании метода в моем первом примере? Поскольку верхний пример движется только вокруг некоторой арифметики, использованной во втором, разве они не производят одинаковую волну?

@Override
        protected Void doInBackground(Void... foo) {
            short[] buffer = new short[1024];
            this.track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
            float samples[] = new float[1024];

            this.track.play();

            while (true) {
                for (int i = 0; i < samples.length; i++) {
                    samples[i] = (float) Math.sin( (float)i * ((float)(2*Math.PI) * frequency / 44100));    //the part that makes this a sine wave....
                    buffer[i] = (short) (samples[i] * Short.MAX_VALUE);
                }
                this.track.write( buffer, 0, samples.length );  //write to the audio buffer.... and start all over again!

            }           
        }

Примечание: это дает мне чистую синусоидальную волну:

@Override
        protected Void doInBackground(Void... foo) {
            short[] buffer = new short[1024];
            this.track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
            float increment = (float)(2*Math.PI) * frequency / 44100; // angular increment for each sample
            float angle = 0;
            float samples[] = new float[1024];

            this.track.play();

            while (true) {
                for (int i = 0; i < samples.length; i++) {
                    samples[i] = (float) Math.sin(angle);   //the part that makes this a sine wave....
                    buffer[i] = (short) (samples[i] * Short.MAX_VALUE);
                    angle += increment;
                }
                this.track.write( buffer, 0, samples.length );  //write to the audio buffer.... and start all over again!

            }           
        }

Спасибо Martijn: Проблема в том, что волна обрезается между длинами волн в буфере. Увеличение размера буфера решает проблему во втором примере. Похоже, что арифметика Math.PI * 2 была самой интенсивной в цикле, поэтому перемещение этого значения во внешнюю переменную, которая вычисляется только один раз, решает все.

Ответы на вопрос(3)

Ваш ответ на вопрос