ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android Visualizer FFT数据取决于音量

2019-12-11 00:25:51  阅读:430  来源: 互联网

标签:visualizer unity3d android


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

我正在设置均衡器(在创建Visualizer之前,在创建Visualizer之后,但在禁用它之前,在禁用它之后,我几乎都称呼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,您必须确定阵列的长度.这是一个长期的尝试,但是您的问题听起来很熟悉.

标签:visualizer,unity3d,android
来源: https://codeday.me/bug/20191210/2105142.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有