600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 音乐频谱数据可视化

音乐频谱数据可视化

时间:2018-12-25 03:20:11

相关推荐

音乐频谱数据可视化

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。