我应该在java中实现一个sin-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方面存在很大的问题。我尝试了一些库,但特别是标题让我很头疼。
关于如何轻松实现这一点的任何想法?
答案 0 :(得分:3)
“手动”编写文件很简单。 WAV header 并不复杂。您知道必要的信息(采样率,持续时间等),然后只是使用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) {
}