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

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

Теперь я знаю, что 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-битными данными с устройств захвата звука, даже при использовании сторонней программы для сбора этих данных.

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) слева и ASIO справа:

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

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

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

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

Другие вопросы по тегам