2

我应该在java中实现一个sinus-generator。作为输入,您给出频率、幅度和相位,作为输出,应该生成一个 .wav 文件。

private static byte[] generateSineWavefreq(int frequencyOfSignal, int seconds) {
    // total samples = (duration in second) * (samples per second)
    byte[] sin = new byte[seconds * sampleRate];
    double samplingInterval = (double) (sampleRate / frequencyOfSignal);
    System.out.println("Sampling Frequency  : "+sampleRate);
    System.out.println("Frequency of Signal : "+frequencyOfSignal);
    System.out.println("Sampling Interval   : "+samplingInterval);
    for (int i = 0; i < sin.length; i++) {
        double angle = (2.0 * Math.PI * i) / samplingInterval;
        sin[i] = (byte) (Math.sin(angle) * 127);
        //System.out.println("" + sin[i]);
    }
    return sin;
}

我生成了一个像这样的鼻窦,但是我在创建一个 .wav 时遇到了很大的问题。我尝试了一些库,但尤其是标题让我头疼。

关于如何轻松实现这一点的任何想法?

4

1 回答 1

3

“手动”写入文件很简单。 WAV 标头并不复杂。您知道必要的信息(采样率、持续时间等),然后它只是使用BufferedOutputStream将它们写入文件中,例如。

BufferedOutputStream output = ...
// initialization
...

byte[] toWrite  = new byte[] {'R','I','F','F'};
output.write(toWrite, toWrite.length, 0);
...

但请记住,有些字段是小端和其他大端。制作一些方法,例如:

byte[] getLittleEndian(int number) {

}

byte[] getBigEndian(int number) {

}
于 2013-04-04T16:54:39.103 回答