linux - Linux 上 Matlab 中的 24 位声音捕获

标签 linux matlab alsa 24-bit

我有一个完全不同的问题。所以我在 Linux Gentoo 机器上使用 Matlab。我有几张 Asus Xonar STX 声卡,我正尝试使用 PlayRec 将它们用作灵敏的音频分析仪。非阻塞音频 IO 包。

现在我知道 Matlab 会说如果你尝试使用 audiorecorder 函数,并在 linux 中指定 24 位,它会告诉你只有 Windows 支持 24 位。然而,ALSA 文献并不暗示这是操作系统或 ALSA 本身的限制,事实上,Alsa 似乎允许您指定 24 位 PCM 设备。 PlayRec 使用 PortAudio,然后在 Linux 系统上使用 Alsa。

现在一切都很好,Playrec 似乎没有指定位深度的方法,只能指定采样率。我做了很多测试,知道我的声卡的传递函数是多少(浮点返回值与输入电压的转换比),我知道我的峰值电压是 3V,我的噪声是 100uV 左右。这给了我 20*log10(3/100e-6) = 91dB。这更接近我期望从 16 位而不是 24 位看到的。

我真正的问题是:是否有某种方法可以验证我实际上在捕获的信号中获得了 24 位?

如果我不是,那么 ALSA 或 Matlab 是否存在一些固有的限制,这限制了我只能使用来自声音捕捉设备的 16 位数据,即使在使用第 3 方程序收集该数据时也是如此。

最佳答案

如果您观察 playrec 通过 playrec('getRec', ...) 输出的数据,您会看到它始终是单精度 float (在 Windows、MATLAB R2013b、most current Playrec 上测试)。 (您可以在使用 Playrec 录制单个页面并查看 IDE 的工作区窗口或通过在命令行运行 whos('<variable_name_of_page>') 后自行验证。

如果你看Line 50 of pa_dll_playrec.h ,您会看到根据定义选择了单精度:

/* Format to be used for samples with PortAudio = 32bit */
typedef float SAMPLE;

不幸的是,这并不能完全回答精确样本精度的问题,因为 PortAudio 库将样本从格式不同的 API 转换为定义的样本。因此,如果您想知道您实际获得的精度是多少,我会建议一个非常实用的解决方案:查看 32 位浮点样本值的尾数。一个简单的fprintf('%+.32f\n', data)应该足以找出实际使用了多少个小数位。


编辑:我刚刚意识到我弄错了。但这里有诀窍:从音频设备的空 channel 录制音频。绘制记录的数据并放大本底噪声。如果您只是得到纯零,则设备可能未正确激活(或信噪比太高)。尝试使用外部接口(interface)和/或稍微调高增益)。根据记录数据的实际位分辨率,您会在示例中看到量化步骤。根据量化器最初使用的位深度,这些步长或大或小。下面您将看到来自同一音频设备的 16 位(左)和 24 位(右)与单独记录的 block 之间的比较,只是我在左侧和右边的 ASIO:

Comparison of sample quantization of 16-bit (left) and 24-bit (right) audio

区别非常明显:在这些非常低的级别上,16 位只允许三个值,而 24 位具有更精细的步进。因此,对于您关于如何确定真实 位深度以及您的信号是否以 24 位记录的问题,这应该是一个充分的答案。如果样本步长小于 2^-15,则可能性很大。

研究这个主题让我意识到它在很大程度上取决于当前选择的录音设备的 API,量化实际发生在哪个位深度。 ASIO 似乎总是使用 24 位,而例如 WASAPI 则退回到 16 位。

关于linux - Linux 上 Matlab 中的 24 位声音捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6206258/

相关文章:

linux - 无法在 Vagrant 上使用版本 2 docker-compose 文件

Matlab,生成并绘制分布在三角形内的点云

performance - 为什么比较 double 比 uint64 快?

c++ - C++ 中的双耳节拍

linux - Linux 中的连接命令

regex - 使用ant<propertyregex>,如何捕获某个用户的/etc/shadow记录?

linux - 如何阻止 Linux 计算机上的所有其他进程 XXX 毫秒?

linux - MMAP 是我需要从 ALSA 获得的在我的游戏中同时播放即时声音的东西吗?

python - setuptools 搜索错误依赖

从 Swift 4 调用 C 函数