我试图在使用 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;
}
}
我尝试通过引入一种节流形式来限制执行,认为这可能会有所帮助。我也尝试不使用缓冲输入,以防缓冲区不足。
但是问题仍然存在,我开始对下一步尝试什么想法没有想法。
感谢任何指点,谢谢!