我的实验是这样的:首先,我使用matlab创建一个指定的wave文件,速率为44100,这意味着任何持续1s的片段包含44100个元素,这些元素呈现为double。然后,我使用智能手机的麦克风来检索波形。并且采样率为44100,为了还原波形。但是,audioRecord 将数据存储为字节,而我想要的是双倍的。从字节转换为双精度听起来很合理,但我仍然混淆采样率 44100 意味着 audioRecord 应该在 1s 或 44100*4 字节中记录 44100 字节,因为双精度包含 4 个字节?我已经提交的其他实验:使用录音软件检索波形并存储在 .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 的采样率检索多少个元素吗?
问问题
506 次
1 回答
3
AudioRecord 的默认设置是为每个样本返回每个通道 16 位 ( ENCODING_PCM_16BIT
)。
现在有两个读取重载,可让您指定一个 short[](16 位)或一个 byte[](8 位)缓冲区。
int read(short[] audioData, int offsetInShorts, int sizeInShorts)
int read(byte[] audioData, int offsetInBytes, int sizeInBytes)
所以一个 1 秒的单声道缓冲区(1 个通道)应该有一个short[]
长度为 44100 的缓冲区。立体声(2 个通道)应该有 88200,等等......
我会避免使用byte[]
缓冲区,除非您ENCODING_PCM_8BIT
出于某种原因将 AudioRecord 格式设置为(不保证所有设备都支持)。
现在,如果您想将这些短值转换为双精度值,您必须意识到double
您在 matlab 中记录的值double-precision normalized samples
是标准化的,[-1 to 1]
而short
值将来自,[-32768 to 32767]
因此您必须编写一个转换函数,而不是仅仅尝试强制转换从短到双的数字。
于 2012-05-14T09:13:06.007 回答