用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了。其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波。那么要实现Andoird播放纯音,那么首先就应该绘制出正弦波来。 那么看下面这段代码:

public class SinWave {

/** 正弦波的高度 **/

public static final int HEIGHT = 127;

/** 2PI **/

public static final double TWOPI = 2 * 3.1415;

/**

* 生成正弦波

* @param wave

* @param waveLen 每段正弦波的长度

* @param length 总长度

* @return

*/

public static byte[] sin(byte[] wave, int waveLen, int length) {

for (int i = 0; i < length; i++) {

wave[i] = (byte) (HEIGHT * (1 - Math.sin(TWOPI

* ((i % waveLen) * 1.00 / waveLen))));

}

return wave;

}

}

首先正弦波的高度设置为127,因为这里只打算使用8位的采样率,2的8次方就应该是256,所以正弦波的波峰就应该是127了。sin(byte[] wave, int waveLen, int length)方法就是根据波的长度还有整个声波的总长度来生成正弦波的值。最后可以根据数组下标将值打印出来,就是正弦波的形状了(只是不是很规则啦。。。)

生成正弦波的方法有了,那么接下来就该实现播放正弦波的方法了。Android给我们实现了这个接口,那么就是AudioTrack这个类了。将正弦波数据传入这个类的write方法中,就可以播放正弦波了。。。很简单吧 ,那就直接看代码吧。

初始化AudioTrack首先传入一个指定频率,这里先将声音总频率设置为44100,然后计算出单个正弦波(也就是2PI)的长度,最后将单个正弦波的长度乘以频率取得声波的实际频率,这样的是为了避免声波最后出现一段空的声波。 然后将参数传入刚才SinWave类的sin方法中取得正弦波。AudioFormat.ENCODING_PCM_8BIT就是指定AudioTrack使用8位采样率。

/**

* 设置频率

* @param rate

*/

public void start(int rate){

if(rate>0){

Hz=rate;

waveLen = 44100/ Hz;

length = waveLen * Hz;

audioTrack=new AudioTrack(AudioManager.STREAM_MUSIC, 44100,

AudioFormat.CHANNEL_CONFIGURATION_STEREO, // CHANNEL_CONFIGURATION_MONO,

AudioFormat.ENCODING_PCM_8BIT,length,AudioTrack.MODE_STREAM);

//生成正弦波

wave=SinWave.sin(wave, waveLen, length);

if(audioTrack!=null){

audioTrack.play();

}

}else{

return;

}

}

这里注意,AudioTrack.play()是还不能播放声音的,因为这个时候AudioTrack里面还没有声波数据。下面这段代码才是真的播放声音:

audioTrack.write(wave, 0, length);

将刚才生成的正弦波数据写入AutioTrack中,那么声音也就播放出来了。。。。

下面是我写的一个例子。只需要修改指定频率,那么就可以播放你想要播放的声音了。(注:手机声音关小点哦!!特别是3000Hz以上的声音特别刺耳。。。切记切记)

源码地址:

http://download.csdn.net/detail/caoshichao520326/6214977

android 播放固定频率的声音,Android 播放指定频率正弦波声音相关推荐

  1. android按钮固定尺寸,如何在android中保持按钮的固定宽高比

    我正在改进你的XML.我没有测试它,但它应该工作.建议的更改是,而不是将图像设置为背景,将其设置为ImageButtons的src.此外,如果您坚持使用Button,则可以使用其他布局包装每个按钮,并 ...

  2. android 手机固定mac地址吗,Android手机获取Mac地址的几种方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static Stri ...

  3. Android开发固定app图标大小,Android和IOS开发图标、启动页尺寸

    最近项目在做android和ios的项目,设计师让我给出图标的尺寸,于是查了一下尺寸. 一.开发中的实际情况: 第一步:产品经理和UI设计师制定好UI规范,然后开始做图标做颜色做尺寸等一系列和APP界 ...

  4. android获取固定uuid,稳定获取Android设备唯一代码(UUID)的解决方案

    对于App云平台系统,如何唯一标识移动设备非常重要. 否则,每次用户在设备上卸载并重新安装应用程序时,后端系统只能将用户视为全新用户. 在Android上识别设备的唯一性. 因为这个圆圈太乱了,所以设 ...

  5. java 生成正弦波声音_如何生成一个正弦波声音曲线?

    Why would you want to create a sine wave? Creating a sine wave is useful for a number of things. How ...

  6. android 播放固定频率的声音,Android 播放指定频率的纯音

    用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了.其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波.那么要实现Andoird播放纯音,那么首 ...

  7. android 播放固定频率的声音,Android使用SoundPool播放音效

    本文实例为大家分享了Android使用SoundPool播放音效的具体代码,供大家参考,具体内容如下 SoundPool(int maxStreams, int streamType, int src ...

  8. Android 播放指定频率正弦波声音

    用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了.其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波.那么要实现Andoird播放纯音,那么首 ...

  9. android声音播放函数双声道合并,Android音频编辑之音频合成功能

    前言 音频编辑系列: 本篇主要讲解音频PCM数据的合成,这里合成包括音频之间的拼接,混合. - 音频拼接:一段音频连接着另一段音频,两段音频不会同时播放,有先后顺序. - 音频混合:一段音频和另一段音 ...

最新文章

  1. getcwd()和dirname(__FILE__)的区别
  2. pl/postgresql_将PostgreSQL PL / Java安装为PostgreSQL扩展
  3. MONyog-数据库性能监控工具
  4. java jaxb 集合_java-使用JAXB解组/编组List String
  5. Android BLE(1)---蓝牙通讯学习
  6. oracle恢复drop建的表首次,Oracle中Drop,Delete,Truancate表恢复
  7. 流行的 NPM 包依赖关系中存在远程代码执行缺陷
  8. 【原】NIO通信模型和BIO通信模型
  9. python爬虫定时爬取_如何用框架给python爬虫定时?
  10. 电容器选型指南-电子元器件选型指导系列
  11. 记录每天背的单词,准备考研。(2月21日)
  12. 电池SOC仿真系列-基于卡尔曼滤波算法的电池参数辨识
  13. 在VMware Workstation中创建一个虚拟软盘,并在Windows XP上使用
  14. 你的健身方法真的正确吗
  15. python中shelf_在python 3中使用python 2 shelf
  16. 智公网:公务员行测基础考点
  17. iOS小技能:app侧登录流程【上篇】 (前置知识)
  18. 努比亚android11,努比亚Play开测Android11 填写基本信息即可
  19. 写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
  20. CMA认证与CNAS认可的八大区别,你知道几个?

热门文章

  1. Win7睡眠快捷键设置
  2. 【建站】分分钟带你建立自己的专属网站
  3. unity学习:寻路算法(AStar算法)与简单AI(势能场估价算法)
  4. UE4实现一个简单的炸弹爆炸与镜头振动效果
  5. 每日一享(工作心态对自己成长的影响?)
  6. 数字化转型的主要工作
  7. c语言定义一个结构体描述学生信息,1)定义一个结构体描述学生信息(学号,姓名,性别,年龄,住址); 2)设计一个函数,用于显示单个学生信息,函...
  8. zzuli OJ 2350: 漫漫参赛路
  9. Just Shuffle
  10. 后端IDEA中报错“Liquibase.exception.LockException:Could not acquire change log lock.”