我正在为使用Android Visualizer类的Unity应用程序编写插件。我正在使用getFft() function和那里提供的代码来获取FFT幅度。返回的值取决于音量-较高的音量表示较高的值,较小的音量则较小。
这是我的构造函数,用于初始化可视化工具:
private PluginClass() {
errors = new int[2];
int size = Visualizer.getCaptureSizeRange()[1];
// Equalizer
Equalizer mEqualizer = new Equalizer(0, 0);
// Visualizer
this.visualizer = new Visualizer(0);
this.visualizer.setEnabled(false);
mEqualizer.setEnabled(true);
this.visualizer.setCaptureSize(size);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
this.visualizer.setScalingMode(SCALING_MODE_NORMALIZED);
this.visualizer.setMeasurementMode(MEASUREMENT_MODE_PEAK_RMS);
}
this.visualizer.setEnabled(true);
this.waveFormData = new byte[size];
this.fftData = new byte[size];
}
我正在设置均衡器(在创建Visualizer之前,在创建Visualizer之后但在禁用它之前,在禁用它之后,我都叫setEnabled
)。
缩放模式设置为规范化,当我调用getScalingMode()
时,我可以确认它确实设置为SCALING_MODE_NORMALIZED
。
有人对此有任何想法吗?在该问题的另一副本中,没有任何解释,一个答案说使用setVolumeControlStream(AudioManager.STREAM_MUSIC);
。我尝试了一下都无济于事,但我不明白为什么它仍然可以工作。
OP放弃了之前曾问过这个问题的问题,而回答者还悬而未决,没有提供任何代码,因此我不得不打开这个问题。这样,我还可以为问题添加赏金。
我正在VR模式下运行该应用程序,以防VR和Android Java和Unity不能很好地一起玩时出现一些晦涩的错误。
谢谢!
编辑这是我用来实际生成FFT幅度的代码:
public float[] getFftMagnitudes() {
this.errors[0] = this.visualizer.getFft(this.fftData);
int n = this.fftData.length;
float[] magnitudes = new float[n / 2 + 1];
magnitudes[0] = (float)Math.abs(this.fftData[0]); // DC
magnitudes[n / 2] = (float)Math.abs(this.fftData[1]); // Nyquist
for (int k = 1; k < n / 2; k++) {
int i = k * 2;
magnitudes[k] = (float)Math.hypot(this.fftData[i], this.fftData[i + 1]);
}
return magnitudes;
}
答案 0 :(得分:2)
某些FFT实现(例如FFTW)没有规范其结果。因此,如果您有一个数组x,请将其转换为傅立叶空间x',然后返回,则不会得到原始结果。对于FFTW,您必须确定阵列的长度。这是一个很长的路,但是您的问题听起来很熟悉。