在 Android 之外使用 AudioRecord 的数据

Using AudioRecord's data outside Android

我正在尝试将 android 上录制的音频数据流式传输到微控制器进行播放。音频使用 AudioRecord class 录制,然后通过 UDP 发送。在接收端,微控制器接收数据并使用 PWM 播放。但是有几个问题:

所以所有这些放在一起只会产生噪音作为输出。当 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 无法提供。你仍然会得到一个输出,但质量一点也不好。你应该做的是使用达林顿对驱动扬声器或(就像我一样)使用简单的运算放大器电路。