audioDeviceWriter

Вопроизведите звуковой карте

Описание

Система audioDeviceWriter object™ пишет аудиосэмплы в устройство аудиовыхода. Свойства средства записи аудио устройства задают драйвер, устройство и атрибуты устройств, такие как частота дискретизации, битовая глубина и buffer size.

Смотрите Аудио ввод-вывод: Буферизация, Задержка и Пропускная способность для подробного объяснения потока данных средства записи аудио устройства.

К потоковым данным к аудио устройству:

  1. Создайте объект audioDeviceWriter и установите его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

deviceWriter = audioDeviceWriter
deviceWriter = audioDeviceWriter(sampleRateValue)
deviceWriter = audioDeviceWriter(___,Name,Value)

Описание

deviceWriter = audioDeviceWriter возвращает Системный объект, deviceWriter, который пишет аудиосэмплы в устройство аудиовыхода в режиме реального времени.

deviceWriter = audioDeviceWriter(sampleRateValue) устанавливает свойство SampleRate на sampleRateValue.

deviceWriter = audioDeviceWriter(___,Name,Value) наборы каждое свойство Name к заданному Value. Незаданные свойства имеют значения по умолчанию.

Пример: deviceWriter = audioDeviceWriter(48000,'BitDepth','8-bit integer') создает Системный объект, deviceWriter, который действует на уровне частоты дискретизации на 48 кГц и 8-битной целочисленной битовой глубины.

Свойства

развернуть все

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и функция release разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

Драйвер раньше получал доступ к вашему аудио устройству, заданному как 'DirectSound', 'ASIO' или 'WASAPI'.

  • Драйверы ASIO™ не прибывают предварительно установленные в машины Windows®. Чтобы использовать опцию драйвера 'ASIO', установите драйвер ASIO за пределами MATLAB®.

    Примечание

    Если Driver задан как 'ASIO', используйте asiosettings, чтобы установить buffer size звуковой карты на buffer size вашего Системного объекта audioDeviceWriter.

  • Драйверы WASAPI поддерживаются для исключительного режима только.

ASIO и драйверы WASAPI не обеспечивают преобразование частоты дискретизации. Для ASIO и драйверов WASAPI, набор SampleRate к частоте дискретизации поддержан вашим аудио устройством.

Это свойство применяется только на машины Windows. Машины Linux® всегда используют драйвер ALSA. Mac обрабатывает машинным способом, всегда используют драйвер CoreAudio.

Чтобы задать значения Driver не по умолчанию, у вас должна быть лицензия Audio Toolbox™. Если тулбокс не установлен, определение, что значения Driver не по умолчанию возвращают ошибку.

Типы данных: char | string

Устройство раньше проигрывало аудиосэмплы, заданные как вектор символов, или представляло скаляр в виде строки. Используйте getAudioDevices, чтобы перечислить доступные устройства для выбранного драйвера.

Типы данных: char | string

Частота дискретизации сигнала отправляется в аудио устройство, в Гц, заданном как положительное целое число. Область значений SampleRate зависит от вашего аудио оборудования.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Тип данных используется устройством, заданным как скаляр строки или вектор символов. Прежде, чем выполнить цифро-аналоговое преобразование, входные данные брошены к типу данных, заданному BitDepth.

Чтобы задать BitDepth не по умолчанию, у вас должна быть лицензия Audio Toolbox. Если тулбокс не установлен, указав, что BitDepth не по умолчанию возвращает ошибку.

Типы данных: char | string

Опция, чтобы поддержать переменный формат кадра, заданный как true или false.

  • ложь Если объект audioDeviceWriter заблокирован, вход должен иметь тот же формат кадра в каждом вызове. Buffer size вашего аудио устройства совпадает с входным форматом кадра.

  • tRUE Если объект audioDeviceWriter заблокирован, входной формат кадра может измениться в каждом вызове. Buffer size вашего аудио устройства задан через свойство BufferSize.

Типы данных: char

Buffer size аудио устройства, заданного как положительное целое число.

Примечание

Если Driver задан как 'ASIO', откройте пользовательский интерфейс ASIO, чтобы установить buffer size звуковой карты на значение BufferSize вашего Системного объекта audioDeviceWriter.

Зависимости

Чтобы включить это свойство, установите SupportVariableSizeInput на true.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Источник отображения между столбцами входной матрицы и каналами устройства аудиовыхода, заданного как 'Auto' или 'Property'.

  • 'auto' Настройки по умолчанию определяют отображение между столбцами входной матрицы и каналами устройства аудиовыхода. Например, предположите, что ваш вход является матрицей с четырьмя столбцами, и ваше аудио устройство имеет четыре канала в наличии. Столбец 1 ваших входных данных пишет, чтобы образовать канал 1 из вашего устройства, столбец 2 ваших входных данных пишет, чтобы образовать канал 2 из вашего устройства и так далее.

  • Свойство 'Property' - The ChannelMapping определяет отображение между столбцами входной матрицы и каналами устройства аудиовыхода.

Типы данных: char | string

Отображение не по умолчанию между столбцами входной матрицы и каналами устройства вывода, заданного как скаляр или вектор допустимых индексов канала. Смотрите, что Задавать Канал Сопоставляет для audioDeviceWriter примера для получения дополнительной информации.

Чтобы выборочно сопоставить между столбцами входной матрицы и выходных каналов вашей звуковой карты, у вас должна быть лицензия Audio Toolbox. Если тулбокс не установлен, указав, что ChannelMapping не по умолчанию возвращает ошибку.

Зависимости

Чтобы включить это свойство, установите ChannelMappingSource на 'Property'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Использование

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить алгоритм Системного объекта. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

numUnderrun = deviceWriter(audioToDevice)

Описание

пример

numUnderrun = deviceWriter(audioToDevice) записи один кадр аудиосэмплов, audioToDevice, к выбранному аудио устройству и возвращают количество недогрузки аудиосэмплов начиная с последней возможности к deviceWriter.

Примечание:  Когда вы вызываете Системный объект audioDeviceWriter, аудио устройство, заданное свойством Device, заблокировано. Аудио устройство может быть заблокировано только одним audioDeviceWriter за один раз. Чтобы выпустить аудио устройство, вызовите release на своем Системном объекте audioDeviceWriter.

Входные параметры

развернуть все

Звуковой сигнал записать в устройство, заданное как матрица. Столбцы матрицы обработаны как независимые звуковые каналы.

Если audioToDevice имеет тип данных 'double' или 'single', средство записи аудио устройства отсекает значения вне области значений [–1, 1]. Для других типов данных позволенный входной диапазон является [min, макс.] заданного типа данных.

Типы данных: single | double | int16 | int32 | uint8

Выходные аргументы

развернуть все

Количество выборок, которыми очередь средства записи аудио устройства была недогрузкой начиная с последней возможности к deviceWriter.

Типы данных: uint32

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

getAudioDevicesПеречислите доступные аудио устройства
infoПолучите информацию аудио устройства
cloneСоздайте объект дублированной системы
isLockedОпределите, используется ли Системный объект
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта
stepЗапустите алгоритм Системного объекта

Примеры

развернуть все

Считайте звуковой файл MP3 и проигрывайте его через ваше устройство аудиовыхода по умолчанию.

Создайте Систему dsp.AudioFileReader object™ с настройками по умолчанию. Используйте функцию audioinfo, чтобы возвратить структуру, содержащую информацию о звуковом файле.

fileReader = dsp.AudioFileReader('speech_dft.mp3');
fileInfo = audioinfo('speech_dft.mp3');

Создайте Системный объект audioDeviceWriter и задайте частоту дискретизации.

deviceWriter = audioDeviceWriter(...
    'SampleRate',fileInfo.SampleRate);

Вызовите setup, чтобы уменьшать вычислительную загрузку инициализации в цикле аудиопотока.

setup(deviceWriter,...
    zeros(fileReader.SamplesPerFrame,fileInfo.NumChannels));

Используйте функцию info, чтобы получить характеристическую информацию о средстве записи устройства.

info(deviceWriter)
ans = struct with fields:
                   Driver: 'ALSA'
               DeviceName: 'ALSAdefault'
    MaximumOutputChannels: 32

В цикле аудиопотока считайте кадр звукового сигнала из файла и запишите кадр в ваше устройство.

while ~isDone(fileReader)
    audioData = fileReader();
    deviceWriter(audioData);
end

Закройте входной файл и выпустите устройство.

release(fileReader);
release(deviceWriter);

Задержка из-за буфера устройства вывода является задержкой записи одного кадра данных. Измените свойства по умолчанию своей Системы audioDeviceWriter object™, чтобы уменьшать задержку из-за buffer size устройства.

Создайте Системный объект dsp.AudioFileReader, чтобы считать звуковой файл с настройками по умолчанию.

fileReader = dsp.AudioFileReader('speech_dft.mp3');

Создайте Системный объект audioDeviceWriter и задайте частоту дискретизации, чтобы совпадать с тем из читателя звукового файла.

deviceWriter = audioDeviceWriter(...
    'SampleRate',fileReader.SampleRate);

Вычислите задержку из-за вашего буфера устройства в секундах.

bufferLatency = fileReader.SamplesPerFrame/deviceWriter.SampleRate %#ok
bufferLatency = 0.0464

Установите свойство SamplesPerFrame своего Системного объекта dsp.AudioFileReader к 256. Вычислите буферную задержку в секундах.

fileReader.SamplesPerFrame = 256;
bufferLatency = fileReader.SamplesPerFrame/deviceWriter.SampleRate
bufferLatency = 0.0116

Недогрузка относится к тишине выходного сигнала, которая происходит, когда цикл аудиопотока не идет в ногу с устройством вывода. Определите недогрузку цикла аудиопотока, добавьте искусственную вычислительную загрузку в цикл аудиопотока, и затем измените свойства своей Системы audioDeviceWriter object™, чтобы уменьшить недогрузку. Ваши результаты зависят от вашего компьютера.

Создайте Системный объект dsp.AudioFileReader и задайте файл, чтобы читать. Используйте функцию audioinfo, чтобы возвратить структуру, содержащую информацию о звуковом файле.

fileReader = dsp.AudioFileReader('speech_dft.mp3');
fileInfo = audioinfo('speech_dft.mp3');

Создайте Системный объект audioDeviceWriter. Используйте SampleRate средства чтения файлов как SampleRate средства записи устройства. Вызовите setup, чтобы уменьшать вычислительную загрузку инициализации в цикле аудиопотока.

deviceWriter = audioDeviceWriter( ...
    'SampleRate',fileReader.SampleRate);
setup(deviceWriter, ...
    zeros(fileReader.SamplesPerFrame,fileInfo.NumChannels));

Запустите свой цикл аудиопотока с входом из файла и выведите к устройству. Распечатайте общую демонстрационную недогрузку и недогрузку в секундах.

totalUnderrun = 0;
while ~isDone(fileReader)
    input = fileReader();
    numUnderrun = deviceWriter(input);
    totalUnderrun = totalUnderrun + numUnderrun;
end
fprintf('Total samples underrun: %d.\n', ...
    totalUnderrun);
fprintf('Total seconds underrun: %d.\n', ...
    double(totalUnderrun)/double(deviceWriter.SampleRate));
Total samples underrun: 0.
Total seconds underrun: 0.

Выпустите свой dsp.AudioFileReader и Системные объекты audioDeviceWriter и обнулите вашу переменную счетчика.

release(fileReader);
release(deviceWriter);
totalUnderrun = 0;

Используйте pause, чтобы подражать алгоритму, который занимает 0,075 секунды к процессу. Пауза заставляет цикл аудиопотока идти медленнее, чем устройство, которое приводит к периодам тишины в выходном звуковом сигнале.

while ~isDone(fileReader)
    input = fileReader();
    numUnderrun = deviceWriter(input);
    totalUnderrun = totalUnderrun + numUnderrun;
    pause(0.075)
end
fprintf('Total samples underrun: %d.\n', ...
    totalUnderrun);
fprintf('Total seconds underrun: %d.\n', ...
    double(totalUnderrun)/double(deviceWriter.SampleRate));
Total samples underrun: 69632.
Total seconds underrun: 3.157914e+00.

Выпустите свой audioDeviceReader и dsp.AudioFileWriter и обнулите переменную счетчика.

release(fileReader);
release(deviceWriter);
totalUnderrun = 0;

Установите формат кадра своего цикла аудиопотока к 2 048. Поскольку свойство SupportVariableSizeInput вашего Системного объекта audioDeviceWriter установлено в false, buffer size вашего аудио устройства одного размера как входной формат кадра. Увеличение вашего buffer size устройства уменьшает недогрузку.

fileReader = dsp.AudioFileReader('speech_dft.mp3');
fileReader.SamplesPerFrame = 2048;
fileInfo = audioinfo('speech_dft.mp3');

deviceWriter = audioDeviceWriter( ...
    'SampleRate',fileReader.SampleRate);
setup(deviceWriter, ...
    zeros(fileReader.SamplesPerFrame,fileInfo.NumChannels));

Вычислите общую недогрузку.

while ~isDone(fileReader)
    input = fileReader();
    numUnderrun = deviceWriter(input);
    totalUnderrun = totalUnderrun + numUnderrun;
    pause(0.075)
end
fprintf('Total samples underrun: %d.\n', ...
    totalUnderrun);
fprintf('Total seconds underrun: %d.\n', ...
    double(totalUnderrun)/double(deviceWriter.SampleRate));
Total samples underrun: 0.
Total seconds underrun: 0.

Увеличенный формат кадра уменьшает общую недогрузку вашего цикла аудиопотока. Однако увеличение формата кадра также увеличивает задержку. Другие подходы, чтобы уменьшать недогрузку включают:

  • Увеличение buffer size, независимого от входного формата кадра. Чтобы увеличить buffer size, независимый от входного формата кадра, необходимо сначала установить SupportVariableSizeInput на true. Этот подход также увеличивает задержку.

  • Уменьшение частоты дискретизации. Уменьшение частоты дискретизации уменьшает и задержку и недогрузку за счет разрешения сигнала.

  • Выбор оптимального драйвера и устройства для системы.

Задайте отображение канала не по умолчанию для Системы audioDeviceWriter object™. Этим примером является конкретное оборудование. Это принимает, что ваш компьютер имеет устройство аудиовыхода по умолчанию с двумя доступными каналами.

Создайте Систему audioDeviceWriter object™ с настройками по умолчанию.

deviceWriter = audioDeviceWriter;

По умолчанию Системный объект audioDeviceWriter пишет максимальное количество доступных каналов, соответствуя столбцам входной матрицы. Используйте info, чтобы получить максимальное количество каналов вашего устройства.

info(deviceWriter)
ans = 

  struct with fields:

                   Driver: 'DirectSound'
               DeviceName: 'Primary Sound Driver'
    MaximumOutputChannels: 2

Если deviceWriter вызван одним столбцом данных, два канала записаны в ваше устройство аудиовыхода. Оба канала соответствуют одному столбцу данных.

Используйте Системный объект audioOscillator, чтобы вывести тон к вашему Системному объекту audioDeviceWriter. Ваш объект, sineGenerator, возвращает вектор, когда названо.

sineGenerator = audioOscillator;

Запишите тон синуса в свое аудио устройство. Если вы используете наушники, можно услышать тон от обоих каналов.

count = 0;
while count < 500
    sine = sineGenerator();
    deviceWriter(sine);
    count = count + 1;
end

Если ваш Системный объект audioDeviceWriter вызван двумя столбцами данных, два канала записаны в ваше устройство аудиовыхода. Первый столбец соответствует каналу 1 из вашего устройства аудиовыхода, и второй столбец соответствует каналу 2 из вашего устройства аудиовыхода.

Запишите матрицу 2D столбца в свое устройство аудиовыхода. Столбец 1 соответствует тону синуса, и столбец 2 соответствует статическому сигналу. Если вы используете наушники, можно услышать тон от одного докладчика и помехи от другого докладчика.

count = 0;
while count < 500
    sine = sineGenerator();
    static = randn(length(sine),1);
    deviceWriter([sine,static]);
    count = count + 1;
end

Задайте альтернативные отображения между каналами вашего устройства и столбцами выходной матрицы путем указания на выходной номер канала в индексе, соответствующем входному столбцу. Установите ChannelMappingSource на 'Property'. Укажите, что первый столбец ваших входных данных пишет, чтобы образовать канал 2 из вашего устройства вывода, и что второй столбец ваших входных данных пишет, чтобы образовать канал 1 из вашего устройства вывода. Чтобы изменить отображение канала, необходимо сначала разблокировать Системный объект audioDeviceReader.

release(deviceWriter);
deviceWriter.ChannelMappingSource = 'Property';
deviceWriter.ChannelMapping = [2,1];

Проигрывайте свои звуковые сигналы с обратным отображением. Если вы используете наушники, заметьте, что тон и статичный переключил динамики.

count = 0;
while count < 500
    sine = sineGenerator();
    static = randn(length(sine),1);
    deviceWriter([sine,static]);
    count = count + 1;
end

Расширенные возможности

Введенный в R2016a