audioRecord如何以指定的采样率检索数据

时间:2012-05-14 08:37:11

标签: java android fft android-audiorecord

我的实验是这样的: 首先,我使用matlab创建一个速率为44100的指定波形文件,这意味着任何持续1s的片段都包含44100个元素,这些元素显示为double。 然后,我使用智能手机的麦克风来检索波形。并且采样率为44100,以便恢复波。 但是,audioRecord将数据存储为字节,而我想要的是双倍。从字节转换为双音听起来合理,我仍然感到困惑的是,采样率44100意味着audioRecord应该以1s或44100 * 4字节记录44100字节,因为double包含4个字节? 我承诺的其他实验: 使用录制软件检索wave并存储在.wav中 分别通过matlab的wavread和java读取.wav。 到1s,我们得到44100个元素,并列出如下: -0.00164794921875
1.52587890625E-4
2.74658203125E-4
-0.003326416015625
0.001373291015625
-4.2724609375E-4
0.00445556640625
9.1552734375E-5
-9.1552734375E-4
7.62939453125E-4
-0.003997802734375
9.46044921875E-4
-0.00103759765625
0.002471923828125
0.001922607421875
-0.00250244140625
8.85009765625E-4
-0.0032958984375
8.23974609375E-4
8.23974609375E-4
有人知道audioRecord将在1s内检索多少元素,采样率为44100?

1 个答案:

答案 0 :(得分:3)

AudioRecord的默认设置是为每个样本(ENCODING_PCM_16BIT)返回每通道16位。

现在有两个读取重载可以指定short [](16位)或byte [](8位)缓冲区。

int read(short[] audioData, int offsetInShorts, int sizeInShorts)
int read(byte[] audioData, int offsetInBytes, int sizeInBytes)

所以1秒单声道缓冲区(1个通道)应该有一个长度为44100的short[]缓冲区。立体声(2个通道)将有88200等...

我会避免使用byte[]缓冲区,除非您出于某种原因将AudioRecord格式设置为ENCODING_PCM_8BIT(并不保证所有设备都支持它)。

现在,如果您想将这些短值转换为双倍值,您必须意识到您在matlab中记录的double值是double-precision normalized samples,这些值是从[-1 to 1]归一化而short值将来自[-32768 to 32767],因此您必须编写转换函数,而不是仅仅尝试将数字从short转换为double。