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-битные имеют гораздо более точный степпинг. Так что это должно быть достаточным ответом на ваш вопрос о том, как определить реальную битовую глубину и записан ли ваш сигнал в 24-битном формате. Если есть примеры шагов меньше 2^-15, шансы довольно хорошие.
Просмотр этой темы заставил меня понять, что это очень сильно зависит от API выбранного в настоящее время записывающего устройства, с какой глубиной в битах фактически происходит квантование. ASIO, кажется, всегда использует 24-битный, в то время как, например, WASAPI возвращается к 16-битному.
Если вы можете сохранить этот сигнал в виде файла WAV, запустите file
Команда на WAV из командной строки в Linux. Что-то вроде:file x.wav
даст вам частоту дискретизации и биты, в которых был закодирован файл. Выходной сигнал обычно выглядит примерно так: 16 бит, 16000 Гц и т. Д.