AudioTrack: Google Pixel 3XL воспроизводит звуки, отличные от Nokia 6.1 - PullRequest
0 голосов
/ 20 апреля 2020

Я использую приведенную ниже функцию для генерации звука с частотой 18 кГц и длительностью около 1 секунды на двух разных телефонах: 1. Nokia 6.1 2. Pixel 3 XL

Я измеряю БПФ Спектр результатов с использованием iPad mini.

Nokia приводит к пику на 18 кГц, как и ожидалось. Однако Pixel 3XL показывает не только пик на 18 кГц (-40 дБ), но и второй пик на 6 кГц (-65 дБ).

Почему результат звучания между двумя телефонами такой разный, хотя я использую точно такой же Java код и та же версия операционной системы (Android 10)?

Как получается, что Pixel 3XL генерирует дополнительный звук примерно на одну треть частоты по сравнению с фактически запрограммированным звуком ?

В чем причина такого поведения и как я могу устранить дополнительный звук на частоте 6 кГц, так как этот дополнительный звук будет очень мешающим?


    void playSoundManual(double freqOfTone, int numSamples){

        double sampleRate = 44100.;

        double sample[] = new double[numSamples];
        byte generatedSnd[] = new byte[2 * numSamples];

        double freq1 = freqOfTone;
        double freq2 = freq1 * 1.3;

        // fill out the array
        boolean isSinus = true;

        if (isSinus) {
            for (int i = 0; i < numSamples; ++i) {
                double indexAsFloat = 1. * i;
                sample[i] = Math.sin(2. * Math.PI * indexAsFloat / (sampleRate/freqOfTone));
            }
        } else {
            double instfreq=0, numerator;
            for (int i=0;i<numSamples; i++ )
            {
                numerator=(double)(i)/(double)numSamples;
                instfreq    =freq1+(numerator*(freq2-freq1));
                if ((i % 1000) == 0) {
                    Log.e("Current Freq:", String.format("Freq is:  %f at loop %d of %d", instfreq, i, numSamples));
                }
                sample[i]=Math.sin(2*Math.PI*i/(sampleRate/instfreq));

            }
        }

        // convert to 16 bit pcm sound array
        // assumes the sample buffer is normalised.
        int idx = 0;
        for (double dVal : sample) {
            short val = (short) (dVal * 32767);
            generatedSnd[idx++] = (byte) (val & 0x00ff);
            generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
        }

        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                44100, AudioFormat.CHANNEL_OUT_DEFAULT,
                AudioFormat.ENCODING_PCM_16BIT, numSamples,
                AudioTrack.MODE_STREAM);
        audioTrack.write(generatedSnd, 0, numSamples);
        audioTrack.play();
    }
´´´
...