U3d中的音频研究

本文转自:http://blog.youkuaiyun.com/moonagent/article/details/9984777

        今天要讲的是捕捉音谱。就是把某段音乐转换成可测量的数字,这种技术多见于音乐类游戏的背景当中,随着音乐背景中的物体或变大缩小,或改变颜色。或者更直观点说,就是你用的某播放器中随音乐上下颤动的那种方式。

好吧,废话有点多,直接写代码。我们使用到的核心就是AudioSource.GetSpectrumData(int,int,FFTWindow)

        其中的三个参数分别表示(a,b,c):

         a:采样率,就是说采集多长一段的频谱,必须为2^n,但是最小64,最大8192。

         b:采集时间,0为左端,1为右端。(这个需要声音物理方面的知识,如果没有特殊需求的话,请默认为0)。

         c:采样方式。

        其中采样方式的具体参数有:

Variables

Rectangular

W[n] = 1.0.

Triangle

W[n] = TRI(2n/N).

Hamming

W[n] = 0.54 - (0.46 * COS(n/N) ).

Hanning

W[n] = 0.5 * (1.0 - COS(n/N) ).

Blackman

W[n] = 0.42 - (0.5 * COS(n/N) ) + (0.08 * COS(2.0 * n/N) ).

BlackmanHarris

W[n] = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N)).

       根据不同的采样方式会有不同的采样精度。

       那么下面进入实例,让我们通过例子来了解这个函数。

       首先新建Unity项目,之后再main camera中加入audio sourse组件,并给组件赋予一段音乐。运行一下,你应该可以听到这段音乐。

       由于这些都属于基础,不是我主讲的内容,所有有什么不会的请自行查找相关基础教程或给我留言。

       之后编写脚本,脚本内容如下,详细请看注释。

注释:

[csharp]  view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class audioTest : MonoBehaviour {  
  5.   
  6.     public GameObject obj;//我们需要动态控制的物体,需要在u3d中把你需要控制的物体赋予该物体  
  7.     // Use this for initialization  
  8.     void Start () {  
  9.     }  
  10.     // Update is called once per frame  
  11.     void Update () {  
  12.         //建立音谱数组,后面的三个参数我前面已经介绍过,这里是具体用法  
  13.         float[] spectrum = audio.GetSpectrumData(128, 0, FFTWindow.BlackmanHarris);  
  14.         int i = 1;  
  15.         //我们控制物体所用到的数值  
  16.         float all = 0;  
  17.         //以下内容是在scence中现实音谱内容  
  18.         while (i < 127)  
  19.         {  
  20.             Debug.DrawLine(new Vector3(i - 1, spectrum[i] + 10, 0), new Vector3(i, spectrum[i + 1] + 10, 0), Color.red);  
  21.             Debug.DrawLine(new Vector3(i - 1, Mathf.Log(spectrum[i - 1]) + 10, 2), new Vector3(i, Mathf.Log(spectrum[i]) + 10, 2), Color.cyan);  
  22.             Debug.DrawLine(new Vector3(Mathf.Log(i - 1), spectrum[i - 1] - 10, 1), new Vector3(Mathf.Log(i), spectrum[i] - 10, 1), Color.green);  
  23.             Debug.DrawLine(new Vector3(Mathf.Log(i - 1), Mathf.Log(spectrum[i - 1]), 3), new Vector3(Mathf.Log(i), Mathf.Log(spectrum[i]), 3), Color.yellow);  
  24.             all = all + spectrum[i];  
  25.             i++;  
  26.         }  
  27.         //经过本人测试all值最多为1点几,所以为了表示明显,我*10,但由于会有0影响效果,所以+1  
  28.         print(all*10);  
  29.         all = all * 10 + 1;  
  30.         //利用iTween插件变换图形,关于iTween我稍后做讲述  
  31.         iTween.ScaleTo(obj, new Vector3(all,all,all), 0f);  
  32.         iTween.ColorTo(obj, new Color(all, -all, 256 - all), 0f);  
  33.     }  
  34. }  


        之后我们新建一个球,使摄像机可以看到小球,我们把脚本拖到摄像机上,并在脚本中的obj与小球进行关联。

        运行文件,我们就会看到小球会随着音乐变大变小以及改变颜色。


        在这段代码中我们用到了iTween插件,iTween是一款相当好用的补间动画插件,这个是网址

http://itween.pixelplacement.com/index.php

        该插件免费使用,以后我会写相关的iTween教程,敬请期待。


本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值