Android 音乐频谱实现

最近由于需要实现音乐频谱,所以今天就为大家普及一下。关于音乐频谱你需要了解数字信号处理的知识,尤其是FFT的知识。简单说就是把时域上连续的信号(波形)强度转换成离散的频域信号(频谱)。我理解波形就是信号的强度,或者说音响设备的输出的功率,功率高,音量就大。但是歌曲的曲调是不会变的,因为频谱是不会变的。

频谱反映的是这个这个音乐在某个连续时间段内,声音的震动频率。不知道理解的对不对。

本文的音乐频谱实现是仿照Android Api Demo 里的一个例子实现的,需要Android 2.3及以上系统,因为要用到Visualizer 类,这个类只在Android 2.3以上的API才支持。

首先实例化Visualizer,参数SessionId可以通过MediaPlayer的对象获得

[java] view plaincopy

  1. visualizer = new Visualizer(mPlayerInstance.getAudioSessionId());

接着设置需要转换的音乐内容长度,专业的说这就是采样,该采样值一般为2的指数倍,如64,128,256,512,1024。这里我设置了128,原因是长度越长,FFT算法运行时间更长。

[java] view plaincopy

  1. visualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[0]);

然后为visualizer设置监听器,这样当Capture一段数据后,就会触发两个函数进行处理。设置监听函数为

[java] view plaincopy

  1. setDataCaptureListener(OnDataCaptureListener listener, rata,iswave,isfft )

参数解释:

rate, 表示采样的周期,即隔多久采样一次,联系前文就是隔多久采样128个数据,本文设置为512mHz更新一次

iswave,是波形信号

isfft,是FFT信号,表示是获取波形信号还是频域信号

OnDataCaptureListener,表监听函数,匿名内部类实现该接口,该接口需要实现两个函数

[java] view plaincopy

  1. onWaveFormDataCapture(Visualizer visualizer,byte[] waveform, int samplingRate)

[java] view plaincopy

  1. public void onFftDataCapture(Visualizer visualizer,byte[] fft, int samplingRate)

samplingRate是采样速率,即上文的rate值,512mHz。

其中两个byte[] waveform和byte[] fft数组,分别是获得波形数据和FFT的数据,该byte数组的大小即为之前设置的采样值大小128,获得数据如下图所示。

其中n为采样值,index 0 表示直流分量,Rf表示FFT计算后的实部,If表示FFT计算后的虚部。

如何计算出该频率,就是将FFT的实部和对应的虚部先各自平方再相加然后开方,简单说就是平方取模。

具体计算请看如下的代码。

[java] view plaincopy

  1. visualizer.setDataCaptureListener(
  2. new Visualizer.OnDataCaptureListener() {
  3. @Override
  4. public void onWaveFormDataCapture(Visualizer visualizer,
  5. byte[] waveform, int samplingRate) {
  6. // 这里添加获得数据的处理 byte[] 数组 更新出去,并画图。这里可以把这个
  7. // 数组传到RunOnMusic里去
  8. // visualView.updateVisualizer(waveform);
  9. }
  10. @Override
  11. public void onFftDataCapture(Visualizer visualizer,
  12. byte[] fft, int samplingRate) {
  13. byte[] model = new byte[fft.length / 2 + 1];
  14. model[0] = (byte) Math.abs(fft[1]);
  15. int j = 1;
  16. for (int i = 2; i < 18;) {
  17. model[j] = (byte) Math.hypot(fft[i], fft[i + 1]);
  18. i += 2;
  19. j++;
  20. }
  21. visualView.updateVisualizer(model);
  22. }
  23. }, Visualizer.getMaxCaptureRate() / 2, false, true);
  24. }

其中visualView是显示程序,updateVisulizer是将model获取的频谱值更新到要显示的view。

[java] view plaincopy

  1. protected void onDraw(Canvas canvas) {
  2. super.onDraw(canvas);
  3. if (mBytes == null) {
  4. return;
  5. }
  6. if (mPoints == null || mPoints.length < mBytes.length * 4) {
  7. mPoints = new float[mBytes.length * 4];
  8. mRect.set(0, 0, getWidth(), getHeight() - 50);
  9. for (int i = 0; i < 9; i++) {
  10. if (mBytes[i] < 0)
  11. mBytes[i] = 127;
  12. mPoints[i * 4] = mRect.width() * i / 9;
  13. mPoints[i * 4 + 1] = mRect.height() / 2;
  14. mPoints[i * 4 + 2] = mRect.width() * i / 9;
  15. mPoints[i * 4 + 3] = 2 + mRect.height() / 2 + mBytes[i];
  16. }
  17. canvas.drawLines(mPoints, mForePaint);
  18. }
  19. }
时间: 2024-12-31 17:58:03

Android 音乐频谱实现的相关文章

android音乐播放器开发教程

android音乐播放器开发教程 android音乐播放器开发教程,布布扣,bubuko.com

LED音乐频谱之输出数据处理

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38023539 一.PWM调节 1.初始化 void DACInit() { CCON=0; //PAC初始化 CL=0; // PAC16位计数器低8位 CH=0; // PAC16位计数器高8位 CMOD=0x00; //选择 系统时钟/12为计数脉冲,则PWM的频率f=sysclk/256/12 CCAP0H=0X80; //占空比控制,0x80为百分之50 100000

LED音乐频谱之概述

点击打开链接       转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37929733 这个LED音乐频谱是我在学51单片机的时候做的一个小项目.今天再看此代码仍有非常多不规范之处,但因为硬件已经送人,没法继续调试,希望小伙伴们引以为戒.写此文主要是想让大家知道当中的原理,知道怎么做固然重要,更重要的是知道为什么要这样做. 一.效果展示 有可能有的人第一次听说过这个东西,但实际上这个东西非常早就有人做出来了. 为了让小伙伴

[Android]音乐播放器总结

1. MediaPlayer要播放的文件主要包括3个来源:a. 用户在应用中事先自带的resource资源例如:mp = MediaPlayer.create(this, R.raw.test);b. 存储在SD卡或其他文件路径下的媒体文件例如:mp.setDataSource("/sdcard/test.mp3");c. 网络上的媒体文件例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3"

android音乐播放器开发 SweetMusicPlayer 智能负载直插式歌词

在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将一下载入在线歌词.好了,还是用那张图. 在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api.尽管还是资源不全.并且还有非常多错误. 特别头疼的是有时候歌词竟然不分行.解析起来简直难受. 歌词迷api歌词查询地址:http://geci.me/api/lyric/

Android 音乐乱码问题修改

对于Android音乐播放器的音乐人 ,专辑,音乐名字显示乱码的修改做了下总结: 方法一:在frameworks\base\media\java\android\media\MediaScanner.java中修改:函数handleStringTag 在这个函数中加上字符编码的转换: <span style="font-family:KaiTi_GB2312;font-size:18px;">/*add by tanfusheng @20150110 start */ pr

自编Win8风格Android音乐播放器应用源码(单机版)

用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能:注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡(部分图标来至qq音乐和百度音乐)界面组成:欢迎界面:淡入,随机图片 由于代码不少,所以在这里贴出来也不太现实,嗯,那就上链结吧,请各位到源码天堂网站上下载吧: http://code.662p.com/view/4733.html 主界面:4个tab标签页,4宫格: --  歌曲列表界面:从sd卡中扫

android音乐播放器源码

最近研究android音乐播放器,弄了一个,还可以,可以实现播放.暂停.拖动进度等功能. 源码地址:http://download.csdn.net/detail/a358763471/8728855

《动感音乐创作间》android音乐创作软件豌豆荚首发时日庆

<动感音乐创作间>是快开客的又一力作,为追求完美,快开客将争取将所有可能的来自世界各地的乐器都集中在这里,当然也会有相关乐曲! 应用中创作者通过开始录音来记录自己创作的声音,当停止创作时点击停止录音就可以播放本次创作作品,喜欢的话介绍给你的小作友吧!另会努力去做有关类似教程的自动弹奏功能!我的博客:http://quickdev.lofter.com,http://blog.csdn.net/qq923780263,欢迎大家订阅关阅! <动感音乐创作间>下载地址:http://pa