我的实验是这样的:
首先,我使用matlab创建指定的wave文件,其速率为44100,这意味着任何持续1s的片段都包含44100个元素,并且这些元素显示为double。
然后,我使用智能手机的麦克风来检索电波。而采样率为44100,以恢复波形。
但是,audioRecord将数据存储为字节,而我想要的是两倍。从字节转换为双声音听起来很合理,但我仍然感到困惑,采样率44100意味着audioRecord应该以1s或44100 * 4字节记录44100字节,因为double包含4个字节?
我所做的其他实验:
使用录音软件检索波形并存储在.wav中
分别通过matlab的wavread和java读取.wav。
到1,我们得到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将以44100的采样率在1秒内检索到多少个元素?
最佳答案
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,依此类推...除非您出于某些原因将AudioRecord格式设置为
byte[]
,否则我将避免使用ENCODING_PCM_8BIT
缓冲区(不保证所有设备都支持该格式)。现在,如果要将这些短值转换为双精度值,则必须意识到在matlab中记录的
double
值是double-precision normalized samples
,这些值是根据[-1 to 1]
进行规范化的,而short
值将是来自[-32768 to 32767]
的值因此您必须编写一个转换函数,而不仅仅是尝试将数字从短转换为双。