Audiorecord.read() 中值的含义

Posted

技术标签:

【中文标题】Audiorecord.read() 中值的含义【英文标题】:Meaning of values from Audiorecord.read() 【发布时间】:2014-06-17 17:56:32 【问题描述】:

我试图了解使用 Audiorecord.read() 获得的值的实际含义。

我正在尝试创建一个应用程序,该应用程序将在检测到脉冲响应时开始录制声音(因此我必须设置一个阈值,在该阈值中任何高于它的声音都将被视为脉冲)。

问题是当我调用此方法时,我真的不知道“数据”中存储的值代表什么:

read = recorder.read(data, 0, bufferSize);

这些是我获得的一些值:

[96, 2, 101, 3, 101, 2, 110, 1, -41, 2, -80, 2, -117, 2, 119, 2, -94, 0 .... ..]

这个想法是根据这些值设置阈值,但首先我需要知道它们代表什么。

你们能帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

数据取决于您发送给构造函数的参数。 AudioRecord (int audiosource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

sampleRateInHz 是每秒的样本数。通道配置是 MONO 或 STEREO,表示 1 或 2 个通道。格式为 PCM8 或 PCM16,表示每个样本 8 位或 16 位。

所以数据是一个样本数组。每个样本都是一个通道数组。每个通道都有一个 8 位或 16 位的值,具体取决于您的要求。不会跳过任何数据,它始终是固定大小的格式。

因此,如果您选择 1 个通道和 8 位,则每个字节都是听到的单个声音,您应该看到每秒有 sampleRateInHz 声音。如果选择 16 位,则每个声音的长度为 2 个字节。如果您使用 2 个通道,则每个样本应按通道 1 和通道 2 的顺序排列。

各个值是在请求频率下采样时声音数据的幅度。有关其工作原理的更多信息,请参阅http://en.wikipedia.org/wiki/Pulse-code_modulation。

【讨论】:

所以,如果到目前为止我的理解是正确的,那么上面数组中表示的每个值都是 8 位有符号数字(1 个字节),因此它们的范围从 -128 到127. 但是由于我使用的是 16 位 PCM,所以我必须同时使用 2 个样本,所以这将产生一个 16 位样本,这将给我从 -32768 到 32767 的值。 正确答案,错误逻辑。由于您使用的是 16 位 pcm,因此每个值都是 2 个字节,从 -32768 到 32767。如果您使用的是单声道,则可以将数组视为 16 位样本的数组。如果您使用的是立体声,则可以将每对值视为一个样本,第一个值在左侧,第二个在右侧。 你知道如何设置一个预定义的字节数组,其大小精确,以存储来自 MIC 的“x”秒声音吗?我知道 AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AU‌​DIO_ENCODING);但我真的不知道该 bufferSize 对应的时间量。我需要一个音频应用程序,我正在使用环形缓冲区来存储 MIC 检测到脉冲响应之前的 0.5 秒样本和检测到脉冲后的 1.5 秒样本。有什么想法吗? x 秒的最小值是 xsamplerate8 位通道和 16 位通道的两倍。

以上是关于Audiorecord.read() 中值的含义的主要内容,如果未能解决你的问题,请参考以下文章

互相关:Android AudioRecord 为 TDoA 创建示例数据

Audio子系统之AudioRecord.stop

Jmeter相关字段含义

拉格朗日中值定理的条件

matlab 实现中值滤波

中值滤波器(平滑空间滤波器)基本原理及Python实现