音乐频谱数据可视化



  • 大家好,今天小白给大家简单介绍下,在unity中实现音乐频谱数据可视化方法,欢迎一起学习交流。

    一、什么是音乐频谱数据?

    频谱是频率谱密度的简称,是频率的分布曲线,音乐频谱就是声音的频率数据。声音频率就是声音每秒种震动的次数,以赫兹Hz 表示,频率越高,音高越高。 人耳可听到的声音频率在每秒振动20次到20000次的范围内,既20赫兹至20000赫兹之间。

    二、unity中如何获取音乐频谱数据?

    1、API原型:

    Unity中有一个API:GetSpectrumData,可以用于获取音乐的频谱数据。

    函数原型如下:

    public void GetSpectrumData(float[] _samples, int channel, FFTWindow window);

    参数含义:
    _samples:用于填充音频样本的数组。 它的长度必须是2的幂。(需要提前声明一个浮点数组。)
    channel:要从中进行采样的通道。(一般默认为零即可。)
    window:采样时使用的FFTWindow类型。(频谱分析窗口类型。使用它可以减少频段内的信号泄漏,选择一种窗口类型即可。)

    2、用法

    a: 声明一个浮点数组:

    float[] _samples = new float[256];

    b:调用GetSpectrumData获取频谱数据:

    AudioSource.GetSpectrumData(_samples, 0, FFTWindow.BlackmanHarris);        //第三个参数可选,转换信号所用的窗函数,算法越复杂,声音越柔和,但速度更慢。

    经过以上两步以后频谱数据就被采集到spectrum数组中了,接下来的任务就是将频谱数据做一个简单的可视化。

    三、获取到的音乐频谱数据后如何实现可视化?

    1、准备工作

    制作cube预制体,将预制体拖到scene界面:

                                     

    2、制作音乐频段

       void MakeFrequencyBands()        //制作8个频段
        {
            /* 假设采样率22050,已获取512个样本
             * 22050 / 512 = 43赫兹每样本
             * 20 - 60 赫兹
             * 60 - 250 赫兹
             * 500 - 2000 赫兹
             * 2000 - 4000 赫兹
             * 4000 - 6000 赫兹
             * 6000 - 20000 赫兹
             
             * 0~2  =  86
             * 1~4  =  172        ===>87 ~258
             * 3~16 = 344        ===>259~602
             * 4~32 = 688        ===>603~1290
             * 5~64 = 2752      ===>2667~5418
             * 6~128 = 5504    ===>5419~10922
             * 7~256 = 11008   ===>10923~21930
             */
            int count = 0;
            for (int i = 0; i < 8; i++)        
            {
                float average = 0;
                int sampleCount = (int)Mathf.Pow(2, i) * 2;
                if (i == 7)
                {
                    sampleCount += 2;
                }
                for (int j = 0; j < sampleCount; j++)   //下标值
                {
                    average += _samples[count] * (count + 1);   //累加0~2^n的值
                    count++;
                }
                average /= count;
                freqBand[i] = average * 10;
            }
        }

    经过以上处理之后,就会将一定范围内的频谱数据平均成一个固定值,用于填充不同频段。

    3、动态填充

    给每一个cube对象添加一个脚本,用于改变cube的localScale.

    关键代码:(根据freqBand数组中的频谱数据改变cube对象的y坐标值,从而达到将频谱数据的变化通过cube形状变化所展现出来,达到可视化的目的。)

    transform.localScale = new Vector3 (transform.localScale.x, (MusicTest.freqBand[bandNum] * multiplier + startScale), transform.localScale.z);

    4、效果展示

    可以看到cube体积会随着音乐频率运动起来,从而达到音乐频谱数据可视化的目的。

    四、总结

    本篇主要简单记录了unity中实现音频数据可视化的一个简单方法,欢迎一起交流学习。

    原文:https://blog.csdn.net/weixin_3... 


Log in to reply