失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > android 播放固定频率的声音 Android 播放指定频率正弦波声音

android 播放固定频率的声音 Android 播放指定频率正弦波声音

时间:2020-06-27 03:24:47

相关推荐

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,intwaveLen,intlength)方法就是根据波的长度还有整个声波的总长度来生成正弦波的值。最后可以根据数组下标将值打印出来,就是正弦波的形状了(只是不是很规则啦。。。)

生成正弦波的方法有了,那么接下来就该实现播放正弦波的方法了。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以上的声音特别刺耳。。。切记切记)

源码地址:

/detail/caoshichao520326/6214977

如果觉得《android 播放固定频率的声音 Android 播放指定频率正弦波声音》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。