0

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

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

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

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

如果我不是,ALSA 或 Matlab 是否存在一些固有限制,这限制我只能从声音捕获设备获取 16 位数据,即使使用 3rd 方程序收集该数据也是如此。

4

2 回答 2

1

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

如果您查看第 50 行pa_dll_playrec.h,您会看到根据定义选择了单精度:

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

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


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

16 位(左)和 24 位(右)音频的样本量化比较

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

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

于 2014-03-31T11:41:49.033 回答
0

如果您可以将该信号存储为 wav 文件,file请从 linux 的命令行在 wav 上运行命令。像:
file x.wav会给你采样率和文件编码的位。输出通常类似于:16 位、16000Hz 等。

于 2011-06-02T19:13:18.230 回答