我正在为使用Android可视化器类的统一应用程序编写一个插件。我使用getFft()函数和那里提供的代码来得到FFT的震级。返回的值取决于卷-高得多的值高卷,低得多的值低卷。
下面是我初始化Visualizer的构造函数:
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创建之前,在创建它之后,在它被禁用之前,在它被禁用之后,几乎在所有的地方),我已经调用了setEnabled
。
缩放模式被设置为规范化,当我调用getScalingMode()
时,我可以确认它确实被设置为SCALING_MODE_NORMALIZED
。
有没有人知道这是为什么?在这个问题的另一个重复,没有解释,一个答案是使用setVolumeControlStream(AudioManager.STREAM_MUSIC);
。我尝试过,但我不明白它为什么会起作用。
行动组已经放弃了他们以前问过这个问题的问题,回答者提出了悬而未决的问题,而且没有提供代码,所以我不得不打开这个问题。这样的话,我也可以在这个问题上加一个赏金。
我是在VR模式下运行这个应用程序,以防这是一个模糊的bug,与VR,Android,Java和团结,没有很好地一起玩。
谢谢!
这里的编辑是我用来实际生成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;
}
发布于 2019-04-24 12:28:49
一些FFT实现(例如FFTW)不规范其结果。所以,如果你有一个数组x,把它转换成fourier空间x‘,然后返回,你就不会得到原来的结果。在FFTW的情况下,您必须按照数组的长度进行划分。这是一个长远的机会,但你的问题听起来非常熟悉。
https://stackoverflow.com/questions/55660990
复制相似问题