android - 如何在固定的时间内产生特定频率的音调

标签 android audio frequency

我是android新手。

有人可以帮我使用(不建议使用的代码)来产生F频率和S秒持续时间的音调

我找到了this,但是它使用了不赞成使用的方法。

最佳答案

这是链接的代码的再现,适用于API级别23+,并添加了音频持续时间参数:

short generatedSnd[];
int sampleRate = 44100;
float freqOfTone = 1000;    //Hz
float amplitude = 10000;    //0..32767 (0x7FFF)
float lengthSeconds = 1.0f;

private void genTone(){

    int numSamples = (int) (sampleRate * lengthSeconds);
    generatedSnd = new short[numSamples];

    // fill out the array
    for (int i = 0; i < numSamples; ++i) {
        generatedSnd[i] = (short) (Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone)) * amplitude);
    }
}

private void playSound(){
    AudioTrack audioTrack = new AudioTrack.Builder()
        .setAudioFormat(
            new AudioFormat.Builder()
            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
            .setSampleRate(sampleRate)
            .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
            .build()
        )
        .setTransferMode(AudioTrack.MODE_STATIC)
        .setBufferSizeInBytes(generatedSnd.length * 2)   //2 bytes-per-sample
        .build();

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

该代码已经在仿真器中经过了长达50s的测试,但是由于传递给setBufferSize()的大小,它可能会在更高的播放时间崩溃。请注意,它不包含其他高级功能来帮助您处理任意长的播放时间,例如1.)流式播放或2.)由于float量化错误而导致的相位校正,该错误的值远非0。

但是,它应该可以在少于约10秒的时间内正常工作。

还省略了AudioTrack清理代码(stop() / release())。

关于android - 如何在固定的时间内产生特定频率的音调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137625/

相关文章:

c# - Naudio - 将 32 位 wav 转换为 16 位 wav

objective-c - iOS无法播放我的声音?

matlab - 如何做一个频段?

java - 词频计数器,列表无法正常工作

mysql - 如何使用单个查询获取 mySQL 中的相对计数/频率

Android Bootstrap 和 Android studio 无法添加库

google-chrome - Chrome中的Twilio音频问题(macOS Sierra)

java - 当数据库更改时在 Android 和桌面 Java 上触发事件

android - getWindowManager().getDefaultDisplay() 返回的屏幕区域是多少?

android - 如何在android中的drawable上添加阴影效果