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

标签 java android fft android-audiorecord

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

最佳答案

AudioRecord 的默认设置是为每个样本返回每个 channel 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 个 channel )应该有一个长度为 44100 的 short[] 缓冲区。立体声(2 个 channel )将有 88200,等等......

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

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

关于java - audioRecord 如何以指定的采样率检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10579928/

相关文章:

android - 在android中定义常量的最佳方法是静态类、接口(interface)还是xml资源?

android - Android FaceDetector 的底层技术

android - 如何检测屏幕旋转

python - python 中的 FFT 无法绘制正确的频率

c++ - 逆快速傅立叶变换 : different phases

java - 如何在同一台Mac上处理多个版本的JDK

java - 在 Android 中使用 EditText 格式化货币字符串

java - 为什么java每次生成的hash id集合几乎一样,调用System.gc()后却变多了?

java - 如何在 Maven 构建中查找峰值内存使用情况

Android ListView onTouchEvent 并不总是给出 ACTION_DOWN