android实时声音信号波形_Android输出正弦波音频信号(左右声道对称)-阿里云开发者社区...

转载请说明出处!

作者: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;

}

不足

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib color可选

matplotlib color matplotlib中color可用的颜色&#xff1a; cnames { aliceblue: #F0F8FF, antiquewhite: #FAEBD7, aqua: #00FFFF, aquamarine: #7FFFD4, azure: #F0FFFF, beige: #F5F5…

python之scrapy爬取jd和qq招聘信息

1、settings.py文件 # -*- coding: utf-8 -*-# Scrapy settings for jd project # # For simplicity, this file contains only settings considered important or # commonly used. You can find more settings consulting the documentation: # # https://doc.scrapy.org…

opencl 加速 c语言程序_Win10应用获得面向OpenCL和OpenGL的兼容层

今年早些时候&#xff0c;微软宣布正在努力在Windows 10的Direct3D 12(D3D12)中启用对OpenCL和OpenGL映射层的支持。为了启用映射层&#xff0c;解决设备上没有OpenCL和OpenGL硬件驱动时的兼容性问题&#xff0c;公司目前已经在微软商店中发布了兼容性包。该兼容性包的标题为 &…

matplotlib plt.subplot

matplotlib plt.subplot 用于在一个Figure对象里画多个子图(Axes)。 其调用格式&#xff1a;subplot(numRows, numCols, plotNum)&#xff0c;即&#xff08;行、列、序号&#xff09;。 图表的整个绘图区域被分成numRows行和numCols列&#xff0c;plotNum参数指定创建的Axes…

javaee和javaee_JavaEE概念简介

javaee和javaee这篇文章旨在阐明J2EE范例中使用的首字母缩写词和概念。 J2EE代表Java to Platform&#xff0c;Entreprise Edition。 它使创建模块化Java应用程序得以部署在应用程序服务器上。 它依赖于Java SE&#xff0c;Java SE是一组Java库的核心&#xff0c;所有Java应用程…

卷boot仅剩余XX空间

参见&#xff1a; https://blog.csdn.net/hnzcdy/article/details/52381844 转载于:https://www.cnblogs.com/lxc1910/p/11102528.html

python多分支结构实例_JS优化多分支结构(经典)

多分支结构的优化有很多好处&#xff1a;既方便代码维护&#xff0c;又可以提升代码执行效率。例如&#xff0c;设计有多个条件&#xff0c;只有当多个条件都成立时&#xff0c;才允许执行特定任务。示例1遵循简单的设计思路&#xff0c;使用多重分支逐个检测这些条件。if (a) …

matplotlib plt.plot

实例1 import matplotlib.pyplot as plta [1, 2, 3, 4] # y 是 a的值&#xff0c;x是各个元素的索引 b [5, 6, 7, 8]plt.figure(demon plot) plt.plot(a, b, r--, label aa) plt.xlabel(this is x) plt.ylabel(this is y) plt.title(this is a demo) plt.legend(locupper l…

使用UAA OAuth2授权服务器–客户端和资源

在上一篇文章中&#xff0c;我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器&#xff0c;以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它。 我已经在Digital Ocean网站上找到了这篇文章&#xff0c;在描述OAuth2授权代码流方面做得非常好&#xff0c;…

二分查找思想

二分查找 二分查找思想应用于对有序的数组进行查找操作。 时间复杂度 二分查找也称为折半查找&#xff0c;每次都能将查找区间减半&#xff0c;这种折半特性算法时间复杂度为O(logn)。 mid计算 有两种计算中值mid的方式&#xff1a; m(lh)/2ml(h-l)/2lh可能出现加法溢出&#x…

ad20如何导入库_脱水防锈油如何使用才正确?

导Lead语根据调查了解&#xff0c;很多厂家在使用脱水防锈油的办法不正确而导致防锈效果失效或不明显。那么脱水防锈油应该如何使用才正确呢&#xff1f;中阳润滑油为大家简单讲述如下。脱水防锈油脱水防锈油是由矿物油及脱水、防锈抗氧化等多种添加剂配制而成&#xff0c;既可…

matplotlib  plt.lengend

参考文档 https://www.cnblogs.com/lfri/p/12248629.html 官方文档 https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html matplotlib plt.lengend 作用&#xff1a;用于给图像加图例。 1、语法参数如下: matplotlib.pyplot.legend(*args, **kwargs) 2、…

Python进阶(上下文管理器与with语句)

/*上下文管理器必须有__enter__和__exit__方法*/ class MyResource:def __enter__(self):print(链接资源)return self/*__exit__返回True表示异常只会在__exit__中被捕获&#xff0c;不会继续传递到with语句的之外的except中&#xff0c;如果返回false&#xff0c;则会把异常也…

matplotlib  plt.scatter

https://www.cnblogs.com/lfri/p/12248629.html matplotlib plt.scatter 作用&#xff1a;画散点图 plt.scatter() 参数如下&#xff1a; x,y X和Y是长度相同的数组 s size,点的大小&#xff0c;标量或与数据长度相同的数组 c color,点的颜色&#xff0c;标量或与数据长…

Git 备忘录

整理了一下工作中常用的 Git 操作&#xff0c;持续更新中...merge单个文件例如 B分支想要合并A分支的某个文件首先&#xff0c;我们切换到B分支 git checkout branch B之后&#xff0c;我们checkout A 分支的a文件&#xff0c;git checkout --patch A a路径 最后&#xff0c…

spark任务shell运行_大数据系列:Spark的工作原理及架构

介绍本Apache Spark教程将说明Apache Spark的运行时架构以及主要的Spark术语&#xff0c;例如Apache SparkContext&#xff0c;Spark shell&#xff0c;Apache Spark应用程序&#xff0c;Spark中的任务(Task)&#xff0c;作业(job)和阶段(stage)。此外&#xff0c;我们还将学习…

使用RESTful Client API进行GET / POST

互联网上有很多如何使用RESTful Client API的东西。 这些是基础。 但是&#xff0c;尽管该主题看起来微不足道&#xff0c;但仍然存在一些障碍&#xff0c;尤其是对于初学者而言。 在这篇文章中&#xff0c;我将尝试总结我的专业知识&#xff0c;以及我如何在实际项目中做到这…

matplotlib plt.lengend图例放在图像的外侧

参考&#xff1a;https://www.jb51.net/article/186659.htm matplotlib plt.lengend图例放在图像的外侧 1、图例在图中实例 import numpy as np import matplotlib.pyplot as plt# 定义x,y X np.linspace(0, 2*np.pi, 32, endpointTrue) C np.cos(X)# figure的名称 plt.figur…

和搜狗输入法快捷键冲突_这款输入法被调教多年不输搜狗,爱了奥里给!

自从搜狗输入法被曝“推广门”之后&#xff0c;许多小伙伴开始寻找新的替代品。这期间&#xff0c;我也尝试了很多输入法&#xff0c;比如手心输入法、小狼毫输入法等。我以易用性、候选字质量和辅助输入功能三个方面作为考量标准&#xff0c;最终选定Win10默认的输入法&#x…

预期的异常规则和模拟静态方法– JUnit

今天&#xff0c;我被要求使用RESTful服务&#xff0c;所以我开始遵循Robert Cecil Martin的TDD规则实施该服务&#xff0c;并遇到了一种测试预期异常以及错误消息的新方法&#xff08;对我来说至少是这样&#xff09;&#xff0c;因此考虑共享我的实现方式作为这篇文章的一部分…