【发布时间】:2013-11-26 13:39:17
【问题描述】:
首先,我有一个项目来更改 WAVE 文件的频率,我需要在 Java 中这样做。
我在 java 中使用 AudioSystem 来获取音频数据的字节(不包括文件头)。现在我得到一个数据字节数组,我想将它从时域更改为频域,并且在操纵频率之后,我想将其更改回时域。代码如下:
public byte[] getWAVByte(){
ByteArrayOutputStream out = new ByteArrayOutputStream();
try{
File f = new File("audio.wav");
AudioInputStream in = AudioSystem.getAudioInputStream(f);
int read;
byte[] buff = new byte[(int)f.length()];
while ((read = in.read(buff)) > 0)
{
out.write(buff, 0, read);
}
out.flush();
byte[] audioBytes = out.toByteArray();
return audioBytes;
}catch(Exception e){
e.printStackTrace();
}
}
现在我在 audioBytes 中有一个字节数组,我想将其更改为频域中的另一个字节数组。我读过你可以用傅立叶变换来做到这一点,但我的老师说它真的很复杂,而且不在我的项目范围内。那么还有其他方法可以做到这一点吗?或者有没有什么java库可以帮我获取频域的字节数组?
【问题讨论】:
-
你说“我有一个项目来改变WAVE文件的频率”正确的做法并不简单,你似乎想要一个Pitch Shift,简单而不正确的方法是播放您的音频采用不同的采样率,但这会改变音频的速度,您可以在频域中执行此操作,并且您需要计算 FFT ...
-
是的,我已经尝试更改采样率,但它变得更快并且对我来说变得相当嘈杂。我还尝试通过将每两个字节更改为短类型并对其进行操作然后将其转换回字节来操作数据字节,但它似乎改变了幅度(如果我将它乘以 2 声音会变大,如果我把它分成了两份)