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

时间:2013-11-26 13:39:17

标签: java audio fft

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

感谢ederwander进行音调转换的指针。

TarsosDSP将代码从Stephan M. Bernsee移植到Java here,它们还提供了使用另一种方法here的示例。

我最终使用Superpowered AdvancedAudioPlayer类,因为已经将其用于其他目的。您基本上可以使用PlayerExample项目,并在audioProcessing回调的开头添加两行:

var users = await _context.Users.Select(u => new
{
    Email = u.Email,
    Roles = u.UserRoles.Select(r => r.Role)
}).ToListAsync();