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

时间:2011-06-01 18:56:46

标签: linux matlab alsa 24-bit

我有一个相当不同的问题。所以我在Linux Gentoo机器上使用Matlab。我有一些华硕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位数据。

2 个答案:

答案 0 :(得分:1)

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

如果你看一下most current Playrec,你会发现根据定义选择了单精度:

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

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


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

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

差别很明显:在这些非常低的级别,16位只允许三个值,而24位具有更精细的步进。因此,对于如何确定 real bitdepth以及您的信号是否以24位记录的问题,这应该是一个充分的答案。如果样本步数小于2 ^ -15,则几率非常好。

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

答案 1 :(得分:0)

如果您可以将该信号存储为wav文件,请在linux中的命令行中对wav运行file命令。类似的东西:
file x.wav将为您提供采样率和文件编码的位数。输出通常类似于:16位,16000Hz等。