android 播放固定频率的声音,Android 播放指定频率正弦波声音
用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 播放指定频率正弦波声音相关推荐
- android按钮固定尺寸,如何在android中保持按钮的固定宽高比
我正在改进你的XML.我没有测试它,但它应该工作.建议的更改是,而不是将图像设置为背景,将其设置为ImageButtons的src.此外,如果您坚持使用Button,则可以使用其他布局包装每个按钮,并 ...
- android 手机固定mac地址吗,Android手机获取Mac地址的几种方法
最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static Stri ...
- Android开发固定app图标大小,Android和IOS开发图标、启动页尺寸
最近项目在做android和ios的项目,设计师让我给出图标的尺寸,于是查了一下尺寸. 一.开发中的实际情况: 第一步:产品经理和UI设计师制定好UI规范,然后开始做图标做颜色做尺寸等一系列和APP界 ...
- android获取固定uuid,稳定获取Android设备唯一代码(UUID)的解决方案
对于App云平台系统,如何唯一标识移动设备非常重要. 否则,每次用户在设备上卸载并重新安装应用程序时,后端系统只能将用户视为全新用户. 在Android上识别设备的唯一性. 因为这个圆圈太乱了,所以设 ...
- java 生成正弦波声音_如何生成一个正弦波声音曲线?
Why would you want to create a sine wave? Creating a sine wave is useful for a number of things. How ...
- android 播放固定频率的声音,Android 播放指定频率的纯音
用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了.其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波.那么要实现Andoird播放纯音,那么首 ...
- android 播放固定频率的声音,Android使用SoundPool播放音效
本文实例为大家分享了Android使用SoundPool播放音效的具体代码,供大家参考,具体内容如下 SoundPool(int maxStreams, int streamType, int src ...
- Android 播放指定频率正弦波声音
用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了.其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波.那么要实现Andoird播放纯音,那么首 ...
- android声音播放函数双声道合并,Android音频编辑之音频合成功能
前言 音频编辑系列: 本篇主要讲解音频PCM数据的合成,这里合成包括音频之间的拼接,混合. - 音频拼接:一段音频连接着另一段音频,两段音频不会同时播放,有先后顺序. - 音频混合:一段音频和另一段音 ...
最新文章
- getcwd()和dirname(__FILE__)的区别
- pl/postgresql_将PostgreSQL PL / Java安装为PostgreSQL扩展
- MONyog-数据库性能监控工具
- java jaxb 集合_java-使用JAXB解组/编组List String
- Android BLE(1)---蓝牙通讯学习
- oracle恢复drop建的表首次,Oracle中Drop,Delete,Truancate表恢复
- 流行的 NPM 包依赖关系中存在远程代码执行缺陷
- 【原】NIO通信模型和BIO通信模型
- python爬虫定时爬取_如何用框架给python爬虫定时?
- 电容器选型指南-电子元器件选型指导系列
- 记录每天背的单词,准备考研。(2月21日)
- 电池SOC仿真系列-基于卡尔曼滤波算法的电池参数辨识
- 在VMware Workstation中创建一个虚拟软盘,并在Windows XP上使用
- 你的健身方法真的正确吗
- python中shelf_在python 3中使用python 2 shelf
- 智公网:公务员行测基础考点
- iOS小技能:app侧登录流程【上篇】 (前置知识)
- 努比亚android11,努比亚Play开测Android11 填写基本信息即可
- 写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
- CMA认证与CNAS认可的八大区别,你知道几个?
热门文章
- Win7睡眠快捷键设置
- 【建站】分分钟带你建立自己的专属网站
- unity学习:寻路算法(AStar算法)与简单AI(势能场估价算法)
- UE4实现一个简单的炸弹爆炸与镜头振动效果
- 每日一享(工作心态对自己成长的影响?)
- 数字化转型的主要工作
- c语言定义一个结构体描述学生信息,1)定义一个结构体描述学生信息(学号,姓名,性别,年龄,住址); 2)设计一个函数,用于显示单个学生信息,函...
- zzuli OJ 2350: 漫漫参赛路
- Just Shuffle
- 后端IDEA中报错“Liquibase.exception.LockException:Could not acquire change log lock.”