24-разрядный захват звука в Matlab на Linux

#linux #matlab #alsa #24-bit

#linux #matlab #alsa #24-разрядный

Вопрос:

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

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

Ответ №1:

Если вы понаблюдаете за данными, которые выводит playrec playrec('getRec', ...) , вы увидите, что они всегда являются данными с плавающей запятой одинарной точности (протестировано в Windows, MATLAB R2013b, самой последней версии Playrec). (вы можете убедиться в этом самостоятельно, записав одну страницу с помощью Playrec и заглянув в окно workspace 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('% .32fn', data) должно быть достаточно, чтобы узнать, сколько знаков после запятой фактически используется.


Редактировать: Я только что понял, что ошибся. Но вот в чем хитрость: записывайте звук с пустого канала вашего аудиоустройства. Отобразите записанные данные и увеличьте минимальный уровень шума. Если вы просто получаете простые нули, устройство, вероятно, не активировано должным образом (или имеет слишком хорошее соотношение сигнал / шум). Попробуйте внешний интерфейс и / или немного увеличьте коэффициент усиления). В зависимости от фактического битового разрешения записанных данных, вы увидите шаги квантования в образцах. В зависимости от разрядности, первоначально используемой квантователем, эти шаги больше или меньше. Ниже вы увидите сравнение между 16-разрядными (слева) и 24-разрядными (справа) блоками, записанными отдельно, с одного и того же аудиоустройства, только я использовал WASAPI API PortAudio (очевидно, в Windows) слева и ASIO справа:

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

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

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

Комментарии:

1. Но только потому, что вы знаете, сколько битов в номере FP используется, на самом деле вам это не очень помогает, верно? Если только у вас не было средств манипулирования одним LSB в A / D. Затем вы могли бы увидеть, как это повлияло на значение с плавающей запятой по отношению к полному масштабу, и определить биты точности. Пока черный ящик выполняет A / D (в целых значениях) -> с плавающей запятой одинарной точности без знания передаточной функции, невозможно определить, какое разрядное разрешение вы получаете от A / D. звуковой карты

2. @dynamphorous Вы правы. Я обновил свой ответ выше.

3. Я согласен с вами, что это один из возможных способов. Но я никогда не видел звуковую карту, уровень шума которой не был бы существенно выше LSB квантователя. Итак, я думаю, я мог бы поискать наименьший возможный набор шагов в моем белом спектре и попытаться предположить, что это мой минимальный квантованный шаг. Но мне это все еще кажется запутанным. Я отмечу это как ответ, поскольку могу сказать, что вы вложили в это значительное количество мыслей, и это разумный ответ, если шум Джонсона ниже вашего LSB вашего квантователя!

Ответ №2:

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

Комментарии:

1. Что ж, мне нравится, как вы думаете, единственная проблема заключается в том, что к моменту его считывания в Matlab сигнал становится 2 каналами чисел с плавающей запятой одинарной точности. Таким образом, запись его в wav-файл с использованием wavwrite или какой-либо другой функции, похоже, затем просто преобразует файл в заданную вами разрядность и частоту дискретизации, вместо того, чтобы сохранять характеристики, которые у него были, когда он впервые вышел из A / D. Вот почему я привязал выполнение своих собственных вычислений S / N, поскольку Xonar STX ДОЛЖЕН иметь динамический диапазон 118 дБ (что они подтверждают в руководстве с точностью звука), а я получаю 91 дБ.