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



  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值