gpt4 book ai didi

Android Visualizer FFT 数据取决于音量

转载 作者:太空狗 更新时间:2023-10-29 13:01:28 26 4
gpt4 key购买 nike

我正在为使用 Android Visualizer 的 Unity 应用程序编写插件类(class)。我正在使用 getFft() function以及那里提供的用于获取 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];
}

我正在设置均衡器(我在创建可视化工具之前调用了 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;
}

最佳答案

一些 FFT 实现(例如 FFTW)不会对其结果进行规范化。因此,如果您有一个数组 x,将其转换为傅立叶空间 x',然后返回,您不会得到原始结果。在 FFTW 的情况下,您必须除以数组的长度。这是一个远景,但你的问题听起来非常熟悉。

关于Android Visualizer FFT 数据取决于音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55660990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com