24-битный захват звука в Matlab на Linux

У меня несколько другой вопрос. Итак, я использую Matlab на машине с Linux Gentoo. У меня есть несколько звуковых карт Asus Xonar STX, и я пытаюсь использовать их в качестве чувствительного анализатора звуковых частот, используя PlayRec неблокирующий аудио пакет IO.

Теперь я знаю, что Matlab скажет, если вы попытаетесь использовать функцию аудиозаписи и укажете 24 бита в Linux, он скажет вам, что 24 бита поддерживаются только в Windows. Однако в литературе по ALSA не подразумевается, что это ограничение операционной системы или самой ALSA, и на самом деле Alsa, по-видимому, позволяет указать 24-битное устройство PCM. И PlayRec использует PortAudio, который затем использует Alsa в системах Linux.

Теперь все хорошо, и Playrec, кажется, не имеет средства указать битовую глубину, только частоту дискретизации. Я провел много тестов и знаю, какова передаточная функция моей звуковой карты (возвращаемое значение с плавающей запятой в коэффициент преобразования входного напряжения), и я знаю, что мое пиковое напряжение составляет 3 В, а мой шум составляет около 100 мкВ. Это дает мне 20 * log10 (3/100e-6) = 91 дБ. Что ближе к тому, что я ожидаю увидеть от 16 бит, а не от 24.

Мой реальный вопрос заключается в следующем: есть ли способ проверить, что я действительно получаю 24 бита в своем захваченном сигнале?

И если нет, то есть ли какое-то неотъемлемое ограничение ALSA или Matlab, которое ограничивает меня только 16-битными данными с устройств звукозаписи, даже при использовании сторонней программы для сбора этих данных.


person dynamphorous    schedule 01.06.2011    source источник


Ответы (2)


Если вы посмотрите на данные, которые 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-битным (справа) отдельно записанными блоками с одного и того же аудиоустройства, за исключением того, что я использовал WASAPI API PortAudio (очевидно, в Windows) слева и АСИО справа:

Сравнение дискретизации 16-битного (слева) и 24-битного (справа) звука

Разница вполне очевидна: на этих очень низких уровнях 16-битный позволяет только три значения, в то время как 24-битный имеет гораздо более точный шаг. Таким образом, это должно быть достаточным ответом на ваш вопрос о том, как определить реальную битовую глубину и записан ли ваш сигнал в 24-битном формате. Если шаги выборки меньше 2^-15, шансы довольно хорошие.

Глядя на эту тему, я понял, что это очень сильно зависит от API выбранного в данный момент записывающего устройства, на какой битовой глубине фактически происходит квантование. ASIO, похоже, всегда использует 24-битную систему, в то время как, например, WASAPI возвращается к 16-битной.

person Jan W    schedule 31.03.2014
comment
Но то, что вы знаете, сколько битов в номере FP используется, на самом деле не очень вам поможет, верно? Если только у вас не было возможности манипулировать одним LSB на A/D. Затем вы могли увидеть, как это повлияло на значение с плавающей запятой по отношению к полной шкале, и определить биты точности. Пока это черный ящик, выполняющий АЦП (в целых значениях) с плавающей запятой одинарной точности без знания передаточной функции, невозможно определить, какое битовое разрешение вы получаете от АЦП звуковой карты. - person dynamphorous; 31.03.2014
comment
@dynamphorous Вы правы. Я обновил свой ответ выше. - person Jan W; 01.04.2014
comment
Я допускаю, что это один из возможных способов. Но я никогда не видел звуковую карту, у которой минимальный уровень шума существенно не превышал бы LSB квантизатора. Так что я думаю, я мог бы найти наименьший возможный набор шагов в моем белом спектре и попытаться предположить, что это мой минимальный квантованный шаг. Но мне это все еще кажется неуклюжим. Я отмечу это как ответ, так как я могу сказать, что вы много думали об этом, и это разумный ответ, если шум Джонсона ниже вашего LSB вашего квантователя! - person dynamphorous; 01.04.2014

Если вы можете сохранить этот сигнал в виде файла wav, запустите команду file для wav из командной строки в Linux. Что-то вроде:
file x.wav даст вам частоту дискретизации и биты, с которыми был закодирован файл. Выход обычно что-то вроде: 16 бит, 16000 Гц и т. д.

person Sriram    schedule 02.06.2011
comment
Ну, мне нравится, как вы думаете, единственная проблема заключается в том, что к тому времени, когда он считывается в Matlab, сигнал становится 2-мя каналами чисел с плавающей запятой одинарной точности. Таким образом, записывая его в файл wav, используя wavwrite или какую-либо другую функцию, кажется, что он просто преобразует файл в битовую глубину и частоту дискретизации, которые вы указали, вместо того, чтобы сохранять характеристики, которые он имел, когда он впервые вышел из ОБЪЯВЛЕНИЕ. Вот почему я привязал свои собственные вычисления отношения сигнал/шум, поскольку Xonar STX ДОЛЖЕН иметь динамический диапазон 118 дБ (что они подтверждают в руководстве с точностью звука), а я получаю 91 дБ. - person dynamphorous; 03.06.2011