在Android中听不到持续时间短于100ms的正弦波

问题描述 投票:0回答:1

我将以下代码组合在一起,以在Android设备上生成和播放正弦波声音。

numSamples根据采样频率(44.1KHz)确定声音的长度。因此,例如,如果我设置numSamples = 22500,则声音将播放500ms。

虽然代码可以在较长的声音持续时间内(即长于150毫秒)正常运行,但是如果我设置numSamples来缩短播放时间,则我听不到任何声音。例如,如果我将numSamples设置为3000,则听不到任何声音。

[我该如何调整代码,以便可以在很短的持续时间内在Android设备上播放正弦波声音,例如1ms,10ms,50ms,100ms?

请提供意见。

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();
}
android audio sample audiotrack
1个回答
0
投票

您是否已使用耳机进行测试?笔记本电脑扬声器,甚至平板电脑,电话和手持设备中的扬声器,其扬声器在播放低音时确实非常糟糕。使用一副好的耳机,您应该可以听到较低的音调。在使用算法进入杂草之前,我会进行测试(表面上看起来还不错)。

PS可能希望将“窦”编辑为“正弦”。

© www.soinside.com 2019 - 2024. All rights reserved.