我正在尝试在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()

最佳答案

将相同的值写入两个连续的位置会导致波形出现步进。与平滑正弦曲线的任何偏差都会增加谐波。如果您想要纯正的音调,请不要那样做。如果您想这样做,别指望纯净的音调。

07-26 03:58