0

我试图在使用 TarsosDSP 库收听声音的同时可视化声音的 FFT。但是,当听它时,正在播放一个响亮的咔哒声,我似乎无法理解这是从哪里来的。这发生在 PC 上。

由于我的代码中的所有内容都保持不变,因此我将其范围缩小到 FFT.forwardTransform() 函数。

这是我的应用程序的基本布线:

应用程序.java:

            InputStream audioStreasm = getClass().getResourceAsStream(selectedSound);
            InputStream bufferedIn = new BufferedInputStream(audioStreasm);
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(bufferedIn);

            JVMAudioInputStream audioStream = new JVMAudioInputStream(audioInputStream);
            // create a new dispatcher
            dispatcher = new AudioDispatcher(audioStream, bufferSize, overlap);
            dispatcher.addAudioProcessor(new FFTProcessor(fftSize, sampleRate));
            dispatcher.addAudioProcessor(new AudioPlayer(audioStream.getFormat()));

            // run the dispatcher (on a new thread).
            new Thread(dispatcher, "Audio dispatching").start();

该文件是一个 1.85Mb 的 wav 文件。bufferSize 是 1536 sampleRate 是 44100

FFTProcessor.java 基本上看起来像这样:

public class FFTProcessor implements AudioProcessor {
    private int sampleRate;
    private FFT fft;
    private float[] amplitudes;

    public FFTProcessor(int fftSize, int sampleRate) {
        this.sampleRate = sampleRate;
        fft = new FFT(fftSize);
        amplitudes = new float[fftSize];
    }

     @Override
     public boolean process(AudioEvent audioEvent) {
        float[] audioBuffer = audioEvent.getFloatBuffer();
        fft.forwardTransform(audioBuffer);
        fft.modulus(audioBuffer, amplitudes);

        return true;
     }
}

我尝试通过引入一种节流形式来限制执行,认为这可能会有所帮助。我也尝试不使用缓冲输入,以防缓冲区不足。

但是问题仍然存在,我开始对下一步尝试什么想法没有想法。

感谢任何指点,谢谢!

4

1 回答 1

0

这似乎是一个已知问题,根据:https ://github.com/JorenSix/TarsosDSP/issues/90

对上述代码的以下修改修复了声音点击的问题。

dispatcher = new AudioDispatcher(audioStream, (int) audioStream.getFrameLength() - 2, overlap);

但是现在,FFT 处理器似乎出现了问题。我将不得不进一步调查。

干杯!

于 2020-02-12T16:15:01.137 回答