【问题标题】:how audioRecord retrieve data with a specified sampling rateaudioRecord 如何以指定的采样率检索数据
【发布时间】:2012-05-21 17:40:41
【问题描述】:

我的实验是这样的: 首先,我使用matlab创建一个指定的wave文件,速率为44100,这意味着任何持续1s的片段包含44100个元素,这些元素呈现为double。 然后,我使用智能手机的麦克风来检索波形。并且采样率为44100,以还原波形。 但是,audioRecord 将数据存储为字节,而我想要的是双倍的。从字节转换为双精度听起来很合理,但我仍然混淆采样率 44100 意味着音频记录应该在 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在44100的采样率下1秒内会检索到多少个元素?

【问题讨论】:

    标签: java android fft android-audiorecord


    【解决方案1】:

    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 个通道)应该有一个长度为 44100 的short[] 缓冲区。立体声(2 个通道)应该有 88200,等等...

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

    现在,如果您想将这些短值转换为双精度值,您必须意识到您在 matlab 中记录的 double 值是 double-precision normalized samples,它们是从 [-1 to 1] 标准化的,而 short 值将来自[-32768 to 32767] 所以您必须编写一个转换函数,而不是仅仅尝试将数字从短整数转换为双精度数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2017-12-31
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多