大家好,今天小白给大家简单介绍下,在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中实现音频数据可视化的一个简单方法,欢迎一起交流学习。