将音频样本的字节数组更改为频率

首先,我有一个项目来改变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库可以帮助我获得频域中的字节数组?

Stephan M. Bernsee写了如何在频域中进行操作,你可以在C中找到你的源代码下载,一个人为你的运气做了一个java端口!

http://svn.assembla.com/svn/mm1ws08/Abgabe2/src/Effects/PitchShift.java

是的,如果您通过您的字节数组多个或除以一个值,您只需增加或减少幅度信号,更改时域频率,您是否需要找到声门位置点击,在每个声门位置应用一个居中窗口,以及现在将每个窗口移动到一个新的时间位置,在这个步骤中你可以添加或排除一些窗口,这会改变信号的频率,最后在所有窗口的声门上做一个重叠加法 ,这个方法称为PSOLA