我目前正在编写一种演奏和弦的方法,但遇到了一些麻烦。我能够发出声音,但是我得到的只是白噪声的片段。我在下面列出了我的方法。

    public static void playChord(double duration, double... frequencies) {
            final int sliceCount = (int) (StdAudio.SAMPLE_RATE * duration);
            final double[] slices = new double[sliceCount + 1];
            double freqTotal=0;
            for (int i = 0; i <= sliceCount; i++) {
                for (int j=0; j<frequencies.length;j++) {
                    frequencies[j] +=frequencies[j];
                    freqTotal=frequencies[j];
                }
                slices[i] = Math.sin(2 * Math.PI * i * freqTotal/StdAudio.SAMPLE_RATE);
            }
            StdAudio.play(slices);
        }

最佳答案

这里有两个问题:

首先是您在每个样本上都使用frequencies[j] += frequencies[j]行踩踏频率数组。假设frequencies[0] == 100。在生成第一个样本之前,它将更改为200。即使频率数组的长度仅为1,也不会产生正弦波。

第二个问题是您组合多个频率的概念是错误的。假设频率数组有两个元素100和200。如果解决了第一个问题,您实际上将计算出一个300 Hz的正弦。那是因为您以错误的级别将它们加在一起,所以您正在计算的是sin(2*pi*i*300/2)的'sin(2 * pii(100 + 200)/ 2)。

相反,您需要执行以下操作:

 for (int i = 0; i < sliceCount; i++)
 {
     for (int j = 0 ; j < frequencies.length; j++)
     {
         slices[i] += Math.sin(2*Math.PI*i*frequencies[i]/StdAudio.SAMPLE_RATE);
     }
     slices[i] /= frequencies.length; // renormalize to between -1 and 1
 }

10-07 13:15