24-битный звукозахват в Matlab на Linux - PullRequest
0 голосов
/ 01 июня 2011

У меня довольно другой вопрос.Так что я использую 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 *. 1007 *

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

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

Ответы [ 2 ]

1 голос
/ 31 марта 2014

Если вы наблюдаете данные, которые 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 справа:

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-битной.

0 голосов
/ 02 июня 2011

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

...