Android Visualizer FFT数据取决于体积
我正在为使用该类的Unity应用程序编写插件。我正在使用和这里提供的代码来获得FFT量级。返回的值取决于体积-体积越大,返回的值越高;体积越小,返回的值越低 这是我初始化可视化工具的构造函数:Android Visualizer FFT数据取决于体积,android,unity3d,visualizer,Android,Unity3d,Visualizer,我正在为使用该类的Unity应用程序编写插件。我正在使用和这里提供的代码来获得FFT量级。返回的值取决于体积-体积越大,返回的值越高;体积越小,返回的值越低 这是我初始化可视化工具的构造函数: private PluginClass() { errors = new int[2]; int size = Visualizer.getCaptureSizeRange()[1]; // Equalizer Equalizer mEqualizer = new Equ
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\u mode\u normalized
有人知道为什么会这样吗?在这个问题的另一个副本中,没有解释,一个答案说使用setVolumeControlStream(AudioManager.STREAM\u MUSIC)代码>。我试过了,但没有用,但我不明白为什么它会起作用
老年退休金计划已经放弃了以前提出的问题,回答者提出了悬而未决的问题,并且没有提供代码,所以我不得不打开这个。这样,我也可以为这个问题增加一个悬赏
我正在虚拟现实模式下运行应用程序,以防虚拟现实和安卓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;
}
public float[]getfftmagnitions(){
this.errors[0]=this.visualizer.getFft(this.fftData);
int n=this.fftData.length;
浮动[]量级=新浮动[n/2+1];
数量[0]=(float)Math.abs(this.fftData[0]);//DC
震级[n/2]=(float)Math.abs(this.fftData[1]);//Nyquist
对于(int k=1;k
一些FFT实现(例如FFTW)不规范其结果。所以,如果你有一个数组x,把它转换成傅里叶空间x’,然后返回,你就不会得到原始结果。在FFTW的情况下,必须根据数组的长度进行偏差。这是一个很长的过程,但是你的问题听起来很熟悉。只是检查一下:你所有的代码运行的大小都是一样的吗?@Ichneumwn是的,尽管我尝试了不同的二次幂或二次幂,但再次尝试这个问题,真正的问题可能是getFft()
如何将其结果拟合为8位整数。它必须进行一些与数据相关的缩放(不同于之前讨论的1/N,也不同于音频音量归一化)。。。我可以想象它做了类似于按127/max(浮点FFT的幅度)缩放的事情。但是猜测工作对你没有帮助:(这就是为什么我问了大小的原因-如果大小相同,那么就正常化(或者没有)通过FFT不重要同样,你是否检查过缩放模式规范化是否也适用于FFT函数。这可能是因为规范化意味着其他一些量。根据文档,它使音频音量正常化。这就是OP似乎要问的:尽管音频音量正常化,但他正在变得不同ent结果。FFT的归一化不能成为问题,除非大小(长度)音频序列的大小会随音频音量的变化而变化。傅里叶变换的输入是否可能未规范化,但如果您请求该类的音频输入,它将提供规范化的音频信号?@MPIchael您是说将FFT幅值数组中的每个值除以数组的长度?编辑:刚刚尝试过t他的建议似乎不起作用:(