Не может слышать сгенерированные синусоидальные волны длительностью менее 100 мс в Android - PullRequest
0 голосов
/ 15 апреля 2020

Я собрал код ниже для генерации и воспроизведения синусоидальных звуков на устройствах Android.

numSamples определяет длину звука на основе частоты дискретизации (44,1 кГц). Так, если я, например, установлю numSamples = 22500, звук будет воспроизводиться в течение 500 мс.

Хотя код работает нормально при длительной продолжительности звука (т. Е. Более 150 мс), я не могу слышать звук, если я установил numSamples для достижения более короткой продолжительности воспроизведения. Например, если я установил для numSamples значение 3000, я ничего не услышу.

Как мне настроить свой код, чтобы я мог воспроизводить синусоидальные звуки на моем устройстве Android с очень короткой продолжительностью, например, 1 мс, 10 мс, 50 ​​мс, 100 мс?

Пожалуйста, сообщите.

void playSound(double freqOfTone, int numSamples) {
    final int sampleRate = 44100;

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

    for (int i = 0; i < numSamples; ++i) {
        sample[i] = Math.sin(2 * Math.PI * i / (sampleRate / freqOfTone));
    }

    // 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,
            sampleRate,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            numSamples,
            AudioTrack.MODE_STREAM);

    audioTrack.write(generatedSnd, 0, numSamples);
    audioTrack.play();
}

1 Ответ

0 голосов
/ 16 апреля 2020

Вы тестировали с наушниками? Динамики для ноутбуков и тем более планшеты, телефоны, портативные устройства часто имеют динамики, которые действительно плохо воспроизводят низкие тона. С хорошими наушниками вы должны слышать низкие частоты. Я бы проверил это, прежде чем попадать в сорняки с помощью алгоритма (который на поверхности выглядит нормально).

PS может захотеть отредактировать "sinus" в "sine".

...