【多媒体之音频】音频频谱设计 Visualizer
来源:互联网 发布:中国食品安全问题数据 编辑:程序博客网 时间:2024/05/01 22:49
最近由于需要实现音乐频谱,所以今天就为大家普及一下。关于音乐频谱你需要了解数字信号处理的知识,尤其是FFT的知识。简单说就是把时域上连续的信号(波形)强度转换成离散的频域信号(频谱)。我理解波形就是信号的强度,或者说音响设备的输出的功率,功率高,音量就大。但是歌曲的曲调是不会变的,因为频谱是不会变的。
频谱反映的是这个这个音乐在某个连续时间段内,声音的震动频率。不知道理解的对不对。
本文的音乐频谱实现是仿照Android Api Demo 里的一个例子实现的,需要Android 2.3及以上系统,因为要用到Visualizer 类,这个类只在Android 2.3以上的API才支持。
首先实例化Visualizer,参数SessionId可以通过MediaPlayer的对象获得
<span style="font-size:18px;">visualizer = new Visualizer(mPlayerInstance.getAudioSessionId()); </span>
接着设置需要转换的音乐内容长度,专业的说这就是采样,该采样值一般为2的指数倍,如64,128,256,512,1024。这里我设置了128,原因是长度越长,FFT算法运行时间更长。
<span style="font-size:18px;">visualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[0]); </span>
然后为visualizer设置监听器,这样当Capture一段数据后,就会触发两个函数进行处理。设置监听函数为
<span style="font-size:18px;">setDataCaptureListener(OnDataCaptureListener listener, rata,iswave,isfft ) </span>
参数解释:
rate, 表示采样的周期,即隔多久采样一次,联系前文就是隔多久采样128个数据,本文设置为512mHz更新一次
iswave,是波形信号
isfft,是FFT信号,表示是获取波形信号还是频域信号
OnDataCaptureListener,表监听函数,匿名内部类实现该接口,该接口需要实现两个函数
<span style="font-size:18px;">onWaveFormDataCapture(Visualizer visualizer,byte[] waveform, int samplingRate) </span>
和
<span style="font-size:18px;">public void onFftDataCapture(Visualizer visualizer,byte[] fft, int samplingRate) </span>
samplingRate是采样速率,即上文的rate值,512mHz。
其中两个byte[] waveform和byte[] fft数组,分别是获得波形数据和FFT的数据,该byte数组的大小即为之前设置的采样值大小128,获得数据如下图所示。
其中n为采样值,index 0 表示直流分量,Rf表示FFT计算后的实部,If表示FFT计算后的虚部。
如何计算出该频率,就是将FFT的实部和对应的虚部先各自平方再相加然后开方,简单说就是平方取模。
具体计算请看如下的代码。
<span style="font-size:18px;">visualizer.setDataCaptureListener( new Visualizer.OnDataCaptureListener() { @Override public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) { // 这里添加获得数据的处理 byte[] 数组 更新出去,并画图。这里可以把这个 // 数组传到RunOnMusic里去 // visualView.updateVisualizer(waveform); } @Override public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) { byte[] model = new byte[fft.length / 2 + 1]; model[0] = (byte) Math.abs(fft[1]); int j = 1; for (int i = 2; i < 18;) { model[j] = (byte) Math.hypot(fft[i], fft[i + 1]); i += 2; j++; } visualView.updateVisualizer(model); } }, Visualizer.getMaxCaptureRate() / 2, false, true); } 其中visualView是显示程序,updateVisulizer是将model获取的频谱值更新到要显示的view。 protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mBytes == null) { return; } if (mPoints == null || mPoints.length < mBytes.length * 4) { mPoints = new float[mBytes.length * 4]; mRect.set(0, 0, getWidth(), getHeight() - 50); for (int i = 0; i < 9; i++) { if (mBytes[i] < 0) mBytes[i] = 127; mPoints[i * 4] = mRect.width() * i / 9; mPoints[i * 4 + 1] = mRect.height() / 2; mPoints[i * 4 + 2] = mRect.width() * i / 9; mPoints[i * 4 + 3] = 2 + mRect.height() / 2 + mBytes[i]; } canvas.drawLines(mPoints, mForePaint); } } </span>
部分频谱计算结果
[0, 95, 101, 34, 25, 13, 5, 5, 4, 11, 4, 3, 3, 3, 3, 2, 2, 3, 2, 2, 4, 3, 1, 3, 2, 3, 3, 1, 4, 2, 4, 1, 1, 2, 0, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 125, 40, 2, 14, 19, 8, 10, 4, 2, 1, 3, 6, 3, 5, 4, 4, 6, 8, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[2, 42, 47, 2, 11, 15, 20, 11, 19, 10, 12, 4, 11, 7, 5, 7, 5, 3, 3, 3, 4, 3, 4, 4, 2, 4, 4, 3, 2, 3, 2, 3, 4, 2, 3, 2, 2, 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, 2, 2, 2, 0]
[2, 42, 47, 2, 11, 15, 20, 11, 19, 10, 12, 4, 11, 7, 5, 7, 5, 3, 3, 3, 4, 3, 4, 4, 2, 4, 4, 3, 2, 3, 2, 3, 4, 2, 3, 2, 2, 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, 2, 2, 2, 0]
[3, 117, 124, 48, 45, 33, 24, 21, 17, 19, 18, 21, 14, 11, 13, 11, 10, 9, 13, 7, 19, 8, 2, 21, 3, 9, 7, 5, 5, 5, 6, 5, 7, 3, 4, 3, 5, 5, 6, 7, 1, 4, 5, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 0]
[0, 80, 25, 37, 13, 5, 4, 5, 2, 3, 5, 4, 6, 3, 2, 3, 2, 2, 1, 5, 3, 2, 2, 2, 1, 5, 1, 1, 2, 3, 4, 3, 4, 4, 7, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0]
[1, 40, 31, 53, 19, 32, 22, 2, 8, 2, 2, 2, 5, 1, 3, 3, 3, 2, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0]
[3, 80, 46, 32, 26, 21, 15, 12, 15, 13, 9, 14, 5, 12, 4, 7, 7, 7, 8, 11, 7, 3, 3, 5, 11, 3, 7, 5, 9, 0, 5, 9, 3, 6, 5, 7, 2, 0, 3, 2, 4, 3, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 0]
[2, 85, 20, 18, 21, 10, 8, 8, 5, 6, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0]
[2, 43, 62, 25, 6, 7, 2, 6, 13, 9, 5, 3, 3, 2, 3, 3, 3, 6, 20, 5, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0]
[3, 104, 52, 28, 20, 18, 14, 13, 11, 9, 8, 8, 6, 6, 5, 5, 5, 4, 5, 5, 4, 4, 4, 4, 4, 4, 3, 2, 2, 3, 3, 2, 3, 1, 4, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0]
[2, 118, 97, 41, 14, 23, 23, 33, 10, 18, 12, 10, 8, 8, 10, 5, 7, 7, 4, 5, 5, 8, 2, 4, 7, 12, 6, 15, 7, 7, 4, 5, 12, 10, 2, 5, 10, 3, 4, 3, 1, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 0]
[1, 85, 17, 29, 12, 12, 1, 2, 3, 3, 2, 2, 3, 3, 5, 2, 1, 2, 3, 2, 4, 1, 4, 2, 6, 2, 1, 6, 4, 5, 6, 2, 1, 3, 1, 1, 1, 1, 1, 3, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0]
[0, -117, 42, 23, 20, 7, 9, 16, 5, 6, 1, 1, 2, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0]
[1, 85, 15, 12, 8, 6, 5, 4, 3, 3, 3, 2, 2, 3, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0]
[0, 44, 93, 59, -127, 11, 1, 3, 2, 7, 4, 4, 7, 1, 1, 1, 3, 3, 5, 2, 6, 3, 5, 4, 3, 3, 5, 8, 6, 3, 2, 5, 5, 3, 4, 7, 3, 3, 3, 4, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0]
[0, 89, 40, 17, 13, 11, 15, 10, 3, 6, 3, 3, 4, 3, 4, 3, 3, 3, 6, 4, 3, 5, 5, 3, 3, 6, 6, 2, 3, 2, 1, 1, 1, 1, 3, 3, 3, 1, 4, 2, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0]
[1, 67, 26, 26, 14, 5, 6, 4, 7, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
扩展性
可基于贝叶斯算法或者其他音频特征采集算法渲染各种好看的动态效果
0 0
- 【多媒体之音频】音频频谱设计 Visualizer
- 音频频谱 绘制能量柱 Visualizer - MediaPlayer 控制(详细注释)
- 音频频谱分析柱状图
- 创建多媒体APP 之 音频播放:管理音频焦点
- 创建多媒体APP 之 音频播放:处理音频输出硬件
- 《开源合辑-(多媒体->声音/音频)之(C#)》
- 多媒体测试库建设之音频部分
- 多媒体测试库建设之音频部分
- 多媒体之音频audio帖子汇总
- 多媒体测试库建设之音频部分
- 多媒体之音频audio帖子汇总
- Android多媒体之音频、视频录制MediaRecorder
- 多媒体之使用PlaySound播放音频
- android,音频频谱的绘制
- android示波器,音频频谱绘制
- 寻求多媒体(音频)管理工具
- Android 多媒体开发-音频
- linux多媒体音频架构
- 键盘钩子 实例!!!!
- Uva1151——Buy or Build && POJ2784——Buy or Build
- 行人检测资源综述文献
- react.js-09-输入刷新界面
- CodeIgniter 判断用户超时登录清除session
- 【多媒体之音频】音频频谱设计 Visualizer
- 内存字节对齐
- Qt之QLabel
- hdoj-1251-tire树模板
- JavaScript对表单验证的例子
- thinkphp笔记
- 13.leetcode题目1: Two Sum
- OpenCV的轮廓查找和填充
- 不同apk之间数据共享