我正在为使用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];
}

我正在设置均衡器(在创建可视化工具之前,在创建可视化工具之后,但在禁用之前,在禁用可视化工具之后,我已经调用了setEnabled,几乎是全部)。
缩放模式被设置为规格化,当我调用getScalingMode()时,我可以确认它确实被设置为SCALING_MODE_NORMALIZED
有人知道这是为什么吗?在这个问题的另一个副本中,没有任何解释,一个答案是使用setVolumeControlStream(AudioManager.STREAM_MUSIC);。我试过了,但没用,我不明白为什么会这样。
OPS已经放弃了他们以前提出过的问题,回答者提出了悬而未决的问题,而且没有提供代码,所以我不得不打开这个。这样,我也可以给这个问题加上一笔赏金。
我在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;
}

最佳答案

一些fft实现(例如fftw)不规范其结果。所以如果你有一个数组x,把它转换成fourier空间x',然后回到原来的结果。在fftw的情况下,必须按数组的长度进行偏差。这是一个漫长的过程,但是你的问题听起来很熟悉。

10-05 19:34