android - 使用OpenSL ES在Android上生成声音

标签 android audio opensl sound-synthesis

我正在Android上制作音频应用程序,并且可以轻松生成三种类型的声波-正弦波,锯齿波和方波。

生成波很好。我打印了结果,看起来不错。但是声音很奇怪。
这是我记录的。
https://soundcloud.com/syntey/synth-sine-wave-test-nothing-to-do-here

锯齿形和正方形相同,但是当我用锯齿形演奏任何A时,声音都是正常的。

有人知道哪里出问题了吗?如果我增加缓冲区的大小,则周期更长,但仍然是相同的问题

生成正弦波的代码:

play(JNIEnv* env, jclass clazz, jint which, jint count, jdouble freqOfTone)
{
    unsigned i;
    int j = 0;
    double sampleRate = SAMPLERATE/freqOfTone;
    switch (which) {
case SINE:
        for (i = 0; i < TONE_FRAMES; ++i) {
            toneBuffer[i] = sin(2.0*M_PI * i/sampleRate) * 32768;                
        }
        nextBuffer = createResampledBuf(SINE, SL_SAMPLINGRATE_8, &nextSize);
        if(!nextBuffer) {
            nextBuffer = (short*) toneBuffer;
            nextSize  = sizeof(toneBuffer);
        }
        break;
    }
    nextCount = count;
    if (nextSize > 0) {
        SLresult result;
        result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);
        if (SL_RESULT_SUCCESS != result) {
            bqPlayerRecorderBusy = 1;
            return JNI_FALSE;
        }
    }

    return JNI_TRUE;
}

最佳答案

您在生成wave时不打印任何内容吗?

但是,主要的问题还是您的综合循环。我会猜测您听到的点击是因为您跳过了示例(在for循环和综合块中,将i递增两次。应该避免这种情况:

for (i = 0; i < SIZE_OF_BUFFER; i++) {
        toneBuffer[i] = sin(2.0*M_PI * i/(44100/freqOfTone)) * 32768;
}

但我建议您使用阶段,对我来说,在信号处理过程中更有意义
float generateSineWave(float freq) {
    // Get phase, then get sample
    phase = 2 * M_PI * freq / 44100 + prev_phase;
    sample = sin(phase);

    // wrap phase
    if (phase > (2 * M_PI)) phase -= (2 * M_PI);

    prev_phase = phase

    return sample;
}

void yourSynthesisLoop() {
    for (int i = 0; i < SIZE_OF_BUFFER; i++) {
        toneBuffer[i] = generateSineWave(freqOfTone) * 32768;
    }
}

关于android - 使用OpenSL ES在Android上生成声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35605893/

相关文章:

java - jni native 函数重载签名

Android 事件计时(Toasts 和 Intents)

python - 如何应用二进制掩码和 STFT 来生成音频文件?

android - 使用 OpenSL ES 时为 "No more track names available"

android - 适用于 Android 的 OpenSL ES 教程

Android Kotlin 对回收站 View 中点击事件的新 Intent

java - 继续获取文件不存在错误(即使目录存在)

winforms - 创建适用于 Windows 的音频图形均衡器

android - 如何将2个文件的音频波形从原始波形合并到一个新波形?

Android - OpenSL ES 高麦克风增益