在 Android 之外使用 AudioRecord 的数据
Using AudioRecord's data outside Android
我正在尝试将 android 上录制的音频数据流式传输到微控制器进行播放。音频使用 AudioRecord class 录制,然后通过 UDP 发送。在接收端,微控制器接收数据并使用 PWM 播放。但是有几个问题:
- 我不太清楚 AudioRecord class 使用的是什么格式。我正在使用 ENCODING_PCM_16BIT,但我什至不知道它是否是双极性的,如果是,如何将其转换为单极性。
- 由于带宽有限,我不能发送超过 8 位的每个样本。由于我的 phone 不支持 8 位 PCM,我使用了 16 位版本,但为了转换,我只使用了高 8 位。我不确定这是否正确。
- 因为我在我的电路中使用了一个奇怪的 Crystal 振荡器,音频必须以 7.2kHz 采样。我的 phone 支持 8kHz 采样,所以我只使用它并发送 %90 的记录数据(使用带有浮点数的 for 循环作为变量)。
- 我使用一个 220 欧姆电阻和一个 100nF 电容器将一个 2W 扬声器连接到我的 ATmega32 上的 OC2 引脚,用作滤波器。 (Schematic) 但我还是不确定这样做是否正确。
所以所有这些放在一起只会产生噪音作为输出。当 i "make some noise" 靠近 MIC 时,唯一发生变化的是输出噪声的音量和模式。尽管该模式没有任何意义,但对于人声或音乐来说是相同的。
这是我编写的一段代码,用于在通过 UDP 发送数据之前转换数据:
float divider = 8/7.2f;
int index=0;
recorder.read(record_buffer,0,buffer_size);
for(float i=0;i<buffer_size;i+=divider)
{
send_buffer[index++]= (byte) (record_buffer[(int)i] >> 8);
}
我不知道从这里到哪里去。任何建议表示赞赏。
更新:
我采纳了 RussSchultz 的建议,通过 UDP 发送了一个正弦波,并将输出连接到我便宜的 O-Scope。这是我得到的:
No Data : http://i.stack.imgur.com/1XYE6.png
No Data Close-up: http://i.stack.imgur.com/ip0ip.png
Sine : http://i.stack.imgur.com/rhtn0.png
Sine Close-up: http://i.stack.imgur.com/12JxZ.png
当我开始发送正弦波时出现间隙,这可能是硬件缓冲区溢出的结果。由于间隙遵循某种模式,因此不可能是 UDP 数据丢失。
所以在为此工作了一个月之后,我开始工作了。
我不太清楚 AudioRecord class 使用的是什么格式。我正在使用 ENCODING_PCM_16BIT,但甚至不知道它是否是双极性的,如果是,如何将其转换为单极性。
由于带宽有限,每个样本我不能发送超过 8 位。由于我的 phone 不支持 8 位 PCM,我使用了 16 位版本,但为了转换,我只使用了高 8 位。我不确定这是否正确。
它是两极的。我必须通过将动态范围的一半添加到每个样本并取高 8 位来将其转换为 8 位。
- 因为我在我的电路中使用了一个奇怪的 Crystal 振荡器,音频必须以 7.2kHz 采样。我的 phone 支持 8kHz 采样,所以我只使用它并发送 %90 的记录数据(使用带有浮点数的 for 循环作为变量)。
虽然我有轻微的频移,但还是可以接受的。
- 我使用 220 欧姆电阻器和 100nF 电容器将一个 2W 扬声器连接到我的 ATmega32 上的 OC2 引脚,用作滤波器。 (示意图)但我再次不确定它是否是正确的方法。
我将滤波器更改为精确的 3.6KHz 低通 RC 滤波器(使用许多在线计算器之一)。扬声器不应直接连接,因为它需要电流 uC 无法提供。你仍然会得到一个输出,但质量一点也不好。你应该做的是使用达林顿对驱动扬声器或(就像我一样)使用简单的运算放大器电路。
我正在尝试将 android 上录制的音频数据流式传输到微控制器进行播放。音频使用 AudioRecord class 录制,然后通过 UDP 发送。在接收端,微控制器接收数据并使用 PWM 播放。但是有几个问题:
- 我不太清楚 AudioRecord class 使用的是什么格式。我正在使用 ENCODING_PCM_16BIT,但我什至不知道它是否是双极性的,如果是,如何将其转换为单极性。
- 由于带宽有限,我不能发送超过 8 位的每个样本。由于我的 phone 不支持 8 位 PCM,我使用了 16 位版本,但为了转换,我只使用了高 8 位。我不确定这是否正确。
- 因为我在我的电路中使用了一个奇怪的 Crystal 振荡器,音频必须以 7.2kHz 采样。我的 phone 支持 8kHz 采样,所以我只使用它并发送 %90 的记录数据(使用带有浮点数的 for 循环作为变量)。
- 我使用一个 220 欧姆电阻和一个 100nF 电容器将一个 2W 扬声器连接到我的 ATmega32 上的 OC2 引脚,用作滤波器。 (Schematic) 但我还是不确定这样做是否正确。
所以所有这些放在一起只会产生噪音作为输出。当 i "make some noise" 靠近 MIC 时,唯一发生变化的是输出噪声的音量和模式。尽管该模式没有任何意义,但对于人声或音乐来说是相同的。
这是我编写的一段代码,用于在通过 UDP 发送数据之前转换数据:
float divider = 8/7.2f;
int index=0;
recorder.read(record_buffer,0,buffer_size);
for(float i=0;i<buffer_size;i+=divider)
{
send_buffer[index++]= (byte) (record_buffer[(int)i] >> 8);
}
我不知道从这里到哪里去。任何建议表示赞赏。
更新: 我采纳了 RussSchultz 的建议,通过 UDP 发送了一个正弦波,并将输出连接到我便宜的 O-Scope。这是我得到的:
No Data : http://i.stack.imgur.com/1XYE6.png
No Data Close-up: http://i.stack.imgur.com/ip0ip.png
Sine : http://i.stack.imgur.com/rhtn0.png
Sine Close-up: http://i.stack.imgur.com/12JxZ.png
当我开始发送正弦波时出现间隙,这可能是硬件缓冲区溢出的结果。由于间隙遵循某种模式,因此不可能是 UDP 数据丢失。
所以在为此工作了一个月之后,我开始工作了。
我不太清楚 AudioRecord class 使用的是什么格式。我正在使用 ENCODING_PCM_16BIT,但甚至不知道它是否是双极性的,如果是,如何将其转换为单极性。
由于带宽有限,每个样本我不能发送超过 8 位。由于我的 phone 不支持 8 位 PCM,我使用了 16 位版本,但为了转换,我只使用了高 8 位。我不确定这是否正确。
它是两极的。我必须通过将动态范围的一半添加到每个样本并取高 8 位来将其转换为 8 位。
- 因为我在我的电路中使用了一个奇怪的 Crystal 振荡器,音频必须以 7.2kHz 采样。我的 phone 支持 8kHz 采样,所以我只使用它并发送 %90 的记录数据(使用带有浮点数的 for 循环作为变量)。
虽然我有轻微的频移,但还是可以接受的。
- 我使用 220 欧姆电阻器和 100nF 电容器将一个 2W 扬声器连接到我的 ATmega32 上的 OC2 引脚,用作滤波器。 (示意图)但我再次不确定它是否是正确的方法。
我将滤波器更改为精确的 3.6KHz 低通 RC 滤波器(使用许多在线计算器之一)。扬声器不应直接连接,因为它需要电流 uC 无法提供。你仍然会得到一个输出,但质量一点也不好。你应该做的是使用达林顿对驱动扬声器或(就像我一样)使用简单的运算放大器电路。