Android: Génération d'onde sinusoïdale

Je suis en train d'utiliser AudioTrack pour générer des signaux sinusoïdaux, carrés, et les vagues en dents de scie. Cependant, l'audio c'est la création ne ressemble pas à une onde sinusoïdale pure, mais comme il a une sorte de d'autres vagues superposées. Comment puis-je obtenir le pure d'onde sinusoïdale comme dans le deuxième exemple de code, en utilisant la méthode dans mon premier exemple? Depuis le haut exemple ne se déplace autour de l'arithmétique utilisée dans la deuxième, ne devraient-ils pas produire à l'identique de l'onde?

@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!

            }           
        }

Remarque: Cela ne donne-moi une onde sinusoïdale pure:

@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!

            }           
        }

Grâce à Martijn: Le problème est que l'onde est se couper entre les longueurs d'onde dans la mémoire tampon. L'augmentation de la taille de la mémoire tampon permet de résoudre le problème dans le deuxième exemple. Il semble que les Mathématiques.PI * 2 arithmétique a été la plus intense de la boucle, donc le déplacement d'une valeur à une variable externe qui est calculé uniquement une fois résout tout.

source d'informationauteur K. Barresi