audioDeviceWriter

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

Описание

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

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

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

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

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

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

Создание

Описание

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 Используя Системные объекты.

Драйвер раньше получал доступ к вашему аудио устройству в виде '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.

  • 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' – Свойство ChannelMapping определяет отображение между столбцами входной матрицы и каналами устройства аудиовыхода.

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

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

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

Примечание

Чтобы гарантировать моно выход только на одном канале устройства стерео, используйте ChannelMapping по умолчанию установка и обеспечивает сигнал стерео, где один канал является всеми нулями.

Пример: outputLeftOnly = [x(:,1) zeros(size(x,1),1)];

Пример: outputRightOnly = [zeros(size(x,1),1) x(:,1)];

Зависимости

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

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

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

Описание

пример

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Запустите алгоритм Системного объекта
setupОдноразовый набор задачи для Системных объектов

Примеры

свернуть все

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

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

fileReader = dsp.AudioFileReader('speech_dft.mp3');
fileInfo = audioinfo('speech_dft.mp3')
fileInfo = struct with fields:
             Filename: '/mathworks/devel/bat/BR2021bd/build/matlab/toolbox/dsp/dsp/speech_dft.mp3'
    CompressionMethod: 'MP3'
          NumChannels: 1
           SampleRate: 22050
         TotalSamples: 112320
             Duration: 5.0939
                Title: []
              Comment: []
               Artist: []
              BitRate: 64

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

Создайте 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)
Total samples underrun: 0.
fprintf('Total seconds underrun: %d.\n',double(totalUnderrun)/double(deviceWriter.SampleRate))
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)
Total samples underrun: 68608.
fprintf('Total seconds underrun: %d.\n',double(totalUnderrun)/double(deviceWriter.SampleRate))
Total seconds underrun: 3.111474e+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)
Total samples underrun: 0.
fprintf('Total seconds underrun: %d.\n',double(totalUnderrun)/double(deviceWriter.SampleRate))
Total seconds underrun: 0.

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

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

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

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

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

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

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