当前位置:   article > 正文

关于Unity实时解析音频频谱数据的调研_unity audioclip.getdata 后转换为分贝数据

unity audioclip.getdata 后转换为分贝数据

一、开发环境

(一)音频格式:WAV,MP3,PCM;
(二)开发平台:Unity,C#;

二、相关概念:

(一)声音频率Hz:声音每秒种震动的次数,以赫兹Hz 表示。频率越高,音高越高;
(二)分贝dB:量度两个相同单位之数量比例的单位,可表示声音的强度单位;
(三)人耳可听到的声波频率:每秒振动20次到20000次的范围内,既20赫兹至20000赫兹之间;
(四)采样Sampling:在信号处理程序中,将连续信号(例如声波)降低成离散信号(一系列样本数据);
(五)采样率Sampling Rate:每秒从连续信号中提取并组成离散信号的采样个数,单位也是赫兹;
(六)快速傅里叶变换FFT:一种算法,可用来转换信号;
(七)窗函数Window Function:在信号处理之中,用来降低信噪比的一种算法。

三、主要API解析

(一)AudioSource.GetSpectrumData ,该方法返回一个包含音频频谱信息的数组,实时获取频谱数据。
—public void GetSpectrumData(float[] samples, int channel, FFTWindow window);
samples:
1.取值要求:将音频样本数据传送至samples数组,数组大小必须为2的n次方,最小64,最大8192。 获取的频谱数据是通过将音频信号分解成多个频段并测量每个频段的振幅来生成的。这些频段的数量由您在调用GetSpectrumData()方法时指定的样本数来决定。每个频段的索引对应于其在频谱中的位置,从低频到高频。
2.每个索引代表的频率计算:通过频率分析,Unity可以通过静态成员AudioSettings.outputSampleRate告诉我们混音器的赫兹(Hz)音频采样率。这将为我们提供Unity播放音频的采样率,通常为48000或44100.我们还可以使用AudioClip.frequency获取单个AudioClip的采样率。知道我们的采样率后,我们就可以知道FFT的最大支持频率,这将是采样率的一半。此时,我们可以除以我们的频谱长度,以了解每个bin(索引)代表的频率。48000/2 = 24000Hz,位于我们支持的范围的顶部。我们通常只关心20Hz-20000Hz的音频,但额外的几赫兹不会弄乱任何东西。“24000Hz/采集数量” 即表示为每个索引表示的频率间隔。
3.样本数据的含义:通常,索引 0 表示低频段,而最后一个索引表示高频段。返回的频谱数据数组中的每个元素表示对应频段的振幅值。振幅值通常在范围[0, 1]之间,表示该频段在音频信号中的相对强度。
channel:一般设置为0。
window:转换信号所用的窗函数,算法越复杂,声音越柔和,但速度更慢。
(二)AudioSource.GetData,该方法返回整个音频所有通道的频谱数据。
—public void GetData(float[] samples, int sampleOffset);
samples:频谱数据,长度为采样数量乘以通道数量;
sampleOffset:从第几个数据开始,一般为0;

四、测试方法:

上述(一)每一帧获取一次音频样本数据,通过不同的采集数量将获取到的音频不同频段相对强度值用UI的形式显示在屏幕上;
上述(二)获取获取一次带通道的频谱数据以绿黑相见的线条形式显示在屏幕右上方。

五、结果:

(一)采集数量为64,可以发现改音频在低频段强度较高,说明改音频以低音为主;
在这里插入图片描述

(二)采集数量为1024,一般情况下,采集数量为1024时变现最为丝滑,可以看出同一首音频高频区和低频区的相对强度与采集数量无关,只是会增加采集结果的平滑度。
在这里插入图片描述

六、使用Unity播放PCM格式音乐

因为Unity引擎无法识别PCM这种脉冲编码调制的音频格式,只支持常规的MP3,WAV音频格式,常规音频格式导入Unity后会自动转换为Unity自己的音频文件AudioClip,然后通过AudioSource组件播放,所以如果要播放PCM音频格式文件就必须先把PCM文件转换为无损wav或者mp3文件才可以被Unity识别。

(一)PCM文件转换

 private void LoadPCM(string filePath)
    {
        // 读取PCM音频数据
        byte[] pcmData = System.IO.File.ReadAllBytes(filePath);

        // 转换PCM音频数据为浮点数数组
        float[] floatData = new float[pcmData.Length / 2];
        for (int i = 0; i < floatData.Length; i++)
        {
            floatData[i] = (float)System.BitConverter.ToInt16(pcmData, i * 2) / 32768f;
        }
        // 创建AudioClip,参数说明:
        // pcmData:PCM音频数据
        // false:是否为压缩格式,默认为false
        // false:是否为3D音频,默认为false
        // AudioType.UNKNOWN:音频类型,根据实际情况选择合适的类型
        // 44100:采集最佳频率
        audioClip = AudioClip.Create("PCM", pcmData.Length / 2, 1, 44100, false);
        audioClip.SetData(floatData, 0);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

(二)频谱信息解析,结果显示PCM文件在Unity中频谱数据解析成功

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/127062
推荐阅读
相关标签
  

闽ICP备14008679号