Android输出正弦波音频信号(左右声道对称)

原创 2016年08月29日 15:54:01

转载请说明出处!
作者:kqw攻城狮
出处:个人站 | CSDN


需求:左右声道分别输出不同的音频数据,波形要是一个正弦波,左右声道还要对称!
对硬件不是很了解,说是要通过音波避障。

效果图

效果图

之前已经介绍了如何在左右声道输出不同的音频数据。
那么这里主要介绍如何模拟出波形是正弦波的音频数据。

模拟正弦波

/**
 * 模拟正弦波音频数据
 * @param isLeft 左右声道
 * @return 音频数据
 */
private short[] initData(boolean isLeft) {
    double phase = 0.0;
    int amp = 10000;
    short[] data = new short[bufferSize];

    double phaseIncrement = (2 * Math.PI * mFrequency) / mSampleRateInHz;

    for (int i = 0; i < bufferSize; i++) {
        if (isLeft) {
            data[i] = (short) (amp * Math.sin(phase));
        } else {
            data[i] = (short) (-amp * Math.sin(phase));
        }
        phase += phaseIncrement;
        Log.i(TAG, "initData: isLeft = " + isLeft + "  buffer[" + i + "] = " + data[i]);
    }
    return data;
}

主要参数

  • mFrequency:频率
  • mSampleRateInHz:采样率
// 单声道
private int mChannelConfig = AudioFormat.CHANNEL_OUT_MONO;
// 频率
private int mFrequency = 19000;
// 采样率
private int mSampleRateInHz = 44100;

播放音频的线程封装

package kong.qingwei.myapplication;

import android.annotation.TargetApi;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Build;
import android.util.Log;

/**
 * Created by kqw on 2016/8/29.
 * 播放音乐的线程
 */
public class ChannelThread extends Thread {

    private static final String TAG = "ChannelThread";
    private AudioTrack mAudioTrack;

    private short[] mData;

    /**
     * 构造方法
     *
     * @param channelConfig  声道
     * @param sampleRateInHz 采样率
     * @param data           音频数据
     * @param bufferSize     缓存大小
     * @param isLeft         左右声道
     */
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public ChannelThread(int channelConfig, int sampleRateInHz, short[] data, int bufferSize, boolean isLeft) {
        mData = data;

        mAudioTrack = new AudioTrack(
                AudioManager.STREAM_MUSIC,
                sampleRateInHz,
                channelConfig,
                AudioFormat.ENCODING_PCM_16BIT,
                bufferSize,
                AudioTrack.MODE_STREAM);

        if (isLeft) {
            mAudioTrack.setStereoVolume(AudioTrack.getMaxVolume(), 0);
        } else {
            mAudioTrack.setStereoVolume(0, AudioTrack.getMaxVolume());
        }
    }

    @Override
    public void run() {
        super.run();
        try {
            if (null != mAudioTrack) {
                mAudioTrack.play();
                while (AudioTrack.PLAYSTATE_STOPPED != mAudioTrack.getPlayState()) {
                    mAudioTrack.write(mData, 0, mData.length);
                }
            }
            Log.i(TAG, "run: End");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 释放AudioTrack
     */
    public void releaseAudioTrack() {
        if (null != mAudioTrack) {
            mAudioTrack.stop();
            mAudioTrack.release();
            mAudioTrack = null;
        }
    }
}

播放

mLeftChannelThread = new ChannelThread(mChannelConfig, mSampleRateInHz, mDataLeft, bufferSize, true);
mRightChannelThread = new ChannelThread(mChannelConfig, mSampleRateInHz, mDataRight, bufferSize, false);

mLeftChannelThread.start();
mRightChannelThread.start();

停止

if (null != mLeftChannelThread) {
    mLeftChannelThread.releaseAudioTrack();
    mLeftChannelThread = null;
}
if (null != mRightChannelThread) {
    mRightChannelThread.releaseAudioTrack();
    mRightChannelThread = null;
}

不足

这里介绍的是在程序中模拟出一个波形满足正弦波的音频数据,还有一种方式,可以事先准备好一个这样的音频文件,直接播放就可以了。

在程序中模拟音频数据有一个缺点,就是不能保证两个线程完完全全的同步,即便是同时开启两个线程也有一先一后,在频率很高的时候,难免会有一点误差!像下面这样:

误差图

另外,这个波形和硬件有很大关系,越是低配设备,误差可能会越大,相同的趋势,但是波动的幅度会比较大(线很粗),可能和设备本身的噪音有关系。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Audio Codec介绍-4(利用Adobe Audition工具来产生正弦波)

利用Adobe Audition工具来产生正弦波
  • daydayupfromnowon
  • daydayupfromnowon
  • 2010年11月09日 20:42
  • 6228

声卡测试音频-正弦波-各种频率

  • 2017年06月01日 14:15
  • 321KB
  • 下载

Android左右声道的控制

效果图源码源码下载,请先移步Android左右声道的控制我这里主要是用到了AudioTrack实现的左右声道的控制,手机一般都只有两个声道,即左声道和右声道,我们在输出的时候可以选择单声道,也可以选择...
  • q4878802
  • q4878802
  • 2016年08月26日 16:52
  • 10723

Android输出正弦波音频信号(左右声道对称)

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN需求:左右声道分别输出不同的音频数据,波形要是一个正弦波,左右声道还要对称! 对硬件不是很了解,说是要通过音波避障。效果图之前已经...
  • q4878802
  • q4878802
  • 2016年08月29日 15:54
  • 8961

android AudioTrack 播放 正弦波 方波

MainActivity.java :   1. 主类,播放方波(提供byteDate)和正弦波。   2. 提供三个按钮分别为 短方波(btnPlayFS)、长方波(btnPlayFL)、正弦波...
  • songconglai
  • songconglai
  • 2012年11月08日 13:39
  • 6657

控制左右声道

Code By 魑魅魍魉mailto:DemonStudio@hotmail.comPrivate Declare Function waveOutGetVolume Lib "winmm.dll" ...
  • DemonLoveLizzy
  • DemonLoveLizzy
  • 2004年09月19日 18:26
  • 1489

MFCC研究(一)之语音信号的同态解卷积【已补全,20130602】

为了深入理解MFCC,也就是梅尔倒谱系数,这个博文想要做的就是理解什么是倒谱,为什么要进行倒谱。至于如何具体的求解倒谱在这里并没有真正提到,只是大概提了一点思路。下一步会着手从人耳的的生理构造开始,理...
  • hns20070
  • hns20070
  • 2013年05月31日 19:07
  • 1929

利用正弦波生成音频wave文件 C程序

  • 2010年09月28日 15:21
  • 7KB
  • 下载

声卡正弦波音频信号发生器

  • 2008年09月29日 12:45
  • 234KB
  • 下载

使用AudioTrack播放MP3 左右声道控制 之移植Libmad到android平台

前一段时间公司有需求要控制左右喇叭播放音乐测试,所有自己就做了demo 顺便和大家分享一下。 众所周知,Android的audiotrack只能播放原始的音频,也就是PCM数据,若是播放mp3...
  • FeiPeng_
  • FeiPeng_
  • 2016年12月29日 16:00
  • 820
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android输出正弦波音频信号(左右声道对称)
举报原因:
原因补充:

(最多只允许输入30个字)