减少谐波,在Java中产生纯音

Gab*_*eno 7 java waveform sound-synthesis

我正在尝试用Java开发一个静态方法来生成纯音.

在开始时它似乎很容易,但是当我尝试将双阵列写入扬声器时,我欣赏太多的谐波.

我用频谱分析仪(声压计)测试它,然后我也在图形中绘制了数组结果.当我完成它时,我已经看到了问题:

这是波形,它已经中断了.我想平滑这个数组,但我不知道该怎么做.

这是代码:

/**
 * Genera un tono puro.
 * @param bufferSize Tamaño del buffer.
 * @param fs Frecuencia de muestreo.
 * @param f0 Frecuencia central. 
 * @return El tono puro.
 */
public static double[] generateTone(int bufferSize, int fs, int f0) {
    double[] tone = new double[bufferSize]; // Tono
    double angle; // Ángulo del tono

    // Sólo hace falta recorrer la mitad del array, ya que hay simetría:
    for (int i = 0; i < tone.length / 2; i++) {
        angle = 2 * Math.PI * f0 * i / fs; // Calculamos la variación del ángulo

        // Tenemos que conseguir que la señal sea menos abrupta para reducir al máximo los armónicos):
        tone[2 * i + 1] = tone[2 * i] = Math.sin(angle); // Aprovechamos la simetría
    }

    return tone;
} // getSinus()
Run Code Online (Sandbox Code Playgroud)

Gab*_*eno 0

这是最终的代码:

\n\n
/**\n * Genera un tono puro.\n * @param bufferSize Tama\xc3\xb1o del buffer.\n * @param fs Frecuencia de muestreo.\n * @param f0 Frecuencia central. \n * @return El tono puro.\n */\npublic static double[] generateTone(int bufferSize, int fs, double f0) {\n    double[] tone = new double[bufferSize]; // Tono\n    double angle; // \xc3\x81ngulo del tono\n\n    for (int i = 0; i < tone.length; i++) {\n        angle = 2 * Math.PI * f0 * i / fs; // Calculamos la variaci\xc3\xb3n del \xc3\xa1ngulo\n        tone[i] = Math.sin(angle); // Cada muestra se obtiene a partir del seno del \xc3\xa1ngulo\n    }\n\n    return tone;\n} // generateTone()\n
Run Code Online (Sandbox Code Playgroud)\n\n

一个 main() 来测试它:

\n\n
public static void main(String[] args) {\n    double[] x; // Se\xc3\xb1al de entrada (en nuestro caso es un tono puro a 250 Hz)\n    int bufferSize = 1024;\n    int fs = 44100;\n    double f0 = ((float) fs / (float) bufferSize);\n    System.out.println("f0 =  " + f0);\n\n    x = GSignals.generateTone(bufferSize, fs, f0); // Generamos la se\xc3\xb1al de entrada\n} // main()\n
Run Code Online (Sandbox Code Playgroud)\n