使用OpenSL ES在Android上生成声音

时间:2016-02-24 15:16:02

标签: android audio opensl sound-synthesis

我在Android上制作音频应用程序,我只有三种类型的声波--Sine,Sawtooth和Square。

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

对于锯齿和方形都是一样的,但是当我用锯齿玩任何A时,声音是正常的。

有人知道出了什么问题吗?如果我增加缓冲区的大小,则句点更长,但仍然是同样的问题

生成正弦波的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textViewPhoneNo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter Phone Number : "
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editTextPhoneNo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:phoneNumber="true" >
    </EditText>

    <TextView
        android:id="@+id/textViewSMS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter SMS Message : "
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editTextSMS"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:lines="5"
        android:gravity="top" />

    <Button
        android:id="@+id/buttonSend"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Send" />

</LinearLayout>

2 个答案:

答案 0 :(得分:0)

您在制作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;
    }
}

答案 1 :(得分:0)

尝试使用短数据类型而不是核心中的double。 OpenSLEL无论如何都将它转换为短路,因此可能会增加数据丢失或噪声。另外,为了获得高质量,请使用更高的采样率。