Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Visualizer FFT数据取决于体积_Android_Unity3d_Visualizer - Fatal编程技术网

Android Visualizer 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

我正在为使用该类的Unity应用程序编写插件。我正在使用和这里提供的代码来获得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\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他的建议似乎不起作用:(