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

Подробное описание потока данных устройства записи аудиосигнала см. в разделе Аудио-ввод-вывод: буферизация, задержка и пропускная способность.
Для потоковой передачи данных на аудиоустройство:
Создать audioDeviceWriter и задайте его свойства.
Вызовите объект с аргументами, как если бы это была функция.
Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.
возвращает объект System, deviceWriter = audioDeviceWriterdeviceWriter, которая записывает выборки звука в устройство вывода звука в реальном времени.
устанавливает для свойства SampleRate значение deviceWriter = audioDeviceWriter(sampleRateValue)sampleRateValue.
задает каждое свойство deviceWriter = audioDeviceWriter(___,Name,Value)Name к указанному Value. Неопределенные свойства имеют значения по умолчанию.
deviceWriter = audioDeviceWriter(48000,'BitDepth','8-bit integer') создает объект System, deviceWriter, которая работает при частоте дискретизации 48 кГц и 8-битовой целочисленной битовой глубине.Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.
Если свойство настраивается, его значение можно изменить в любое время.
Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.
Driver - Драйвер, используемый для доступа к аудиоустройству (только для Windows)'DirectSound' (по умолчанию) | 'ASIO' | 'WASAPI'Драйвер, используемый для доступа к аудиоустройству, указан как 'DirectSound', 'ASIO', или 'WASAPI'.
Драйверы ASIO™ не устанавливаются на компьютерах с ОС Windows ®. Для использования 'ASIO' , установите драйвер ASIO вне MATLAB ®.
Примечание
Если Driver указывается как 'ASIO', использовать asiosettings для установки размера буфера звуковой карты на размер буфера audioDeviceWriter Системный объект.
Драйверы WASAPI поддерживаются только для эксклюзивного режима.
Драйверы ASIO и WASAPI не обеспечивают преобразование частоты дискретизации. Для драйверов ASIO и WASAPI, установка SampleRate до частоты выборки, поддерживаемой аудиоустройством.
Это свойство применяется только к компьютерам Windows. Машины Linux ® всегда используют драйвер ALSA. Компьютеры Mac всегда используют драйвер CoreAudio.
Указание значения по умолчанию Driver значения, необходимо иметь лицензию Audio Toolbox™. Если панель инструментов не установлена, укажите значение по умолчанию Driver значения возвращают ошибку.
Типы данных: char | string
Device - Устройство, используемое для воспроизведения образцов звукаУстройство, используемое для воспроизведения отсчетов звука, указанное как вектор символа или скаляр строки. Использовать getAudioDevices список доступных устройств для выбранного драйвера.
Типы данных: char | string
SampleRate - Частота дискретизации сигнала, подаваемого на аудиоустройство (Гц)44100 (по умолчанию) | положительное целое числоЧастота дискретизации сигнала, посылаемого на аудиоустройство, в Гц, заданная как положительное целое число. Диапазон SampleRate зависит от вашего звукового оборудования.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
BitDepth - тип данных, используемый устройством;'16-bit integer' (по умолчанию) | '8-bit integer' | '24-bit integer' | '32-bit float'Тип данных, используемый устройством, указанный как вектор символов или скаляр строки. Перед выполнением цифроаналогового преобразования входные данные преобразуются в тип данных, указанный в BitDepth.
Задание значения по умолчанию BitDepth, необходимо иметь лицензию Audio Toolbox. Если панель инструментов не установлена, укажите значение по умолчанию BitDepth возвращает ошибку.
Типы данных: char | string
SupportVariableSizeInput - Поддержка переменного размера рамыfalse (по умолчанию) | trueПараметр, поддерживающий переменный размер кадра, указанный как true или false.
false - Если audioDeviceWriter объект заблокирован, при каждом вызове входные данные должны иметь одинаковый размер кадра. Размер буфера аудиоустройства совпадает с размером входного кадра.
true - Если audioDeviceWriter объект заблокирован, размер входного кадра может изменяться при каждом вызове. Размер буфера аудиоустройства задается с помощью свойства BufferSize.
Типы данных: char
BufferSize - Размер буфера аудиоустройства4096 (по умолчанию) | положительное целое числоРазмер буфера аудиоустройства, указанный как положительное целое число.
Примечание
Если Driver указывается как 'ASIO', откройте пользовательский интерфейс ASIO, чтобы установить размер буфера звуковой карты в BufferSize ценность вашего audioDeviceWriter Системный объект.
Чтобы включить это свойство, задайте для параметра SupportVariiveStartInput значение true.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
ChannelMappingSource - Источник отображения между входной матрицей и каналами устройства'Auto' (по умолчанию) | 'Property'Источник отображения между столбцами входной матрицы и каналами устройства вывода звука, указанный как 'Auto' или 'Property'.
'Auto' - Настройки по умолчанию определяют соответствие между столбцами входной матрицы и каналами устройства вывода звука. Например, предположим, что ваш вход является матрицей с четырьмя столбцами, а аудиоустройство имеет четыре доступных канала. Столбец 1 входных данных записывает в канал 1 устройства, столбец 2 входных данных записывает в канал 2 устройства и т.д.
'Property' - Свойство StartMapping определяет отображение между столбцами входной матрицы и каналами устройства вывода звука.
Типы данных: char | string
ChannelMapping - Отображение по умолчанию между входной матрицей и каналами устройства[1:MaximumOutputChannels] (по умолчанию) | скаляр | векторОтображение по умолчанию между столбцами входной матрицы и каналами выходного устройства, задаваемое как скаляр или вектор действительных индексов канала. Дополнительные сведения см. в примере Указание сопоставления каналов для audioDeviceWriter.
Для выборочного отображения между столбцами входной матрицы и каналами вывода звуковой платы необходимо иметь лицензию Audio Toolbox. Если панель инструментов не установлена, укажите значение по умолчанию ChannelMapping возвращает ошибку.
Примечание
Для обеспечения моноотхода только на одном канале стереоустройства используйте значение по умолчанию ChannelMapping установка и предоставление стереосигнала, где один канал - все нули.
Пример:
outputLeftOnly = [x(:,1) zeros(size(x,1),1)];
Пример:
outputRightOnly = [zeros(size(x,1),1) x(:,1)];
Чтобы включить это свойство, задайте для StartMappingSource значение 'Property'.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
записывает один кадр аудиоотсчетов, numUnderrun = deviceWriter(audioToDevice)audioToDevice, к выбранному аудиоустройству и возвращает количество не выполненных аудиоотсчетов с момента последнего вызова deviceWriter.
Примечание: При вызове audioDeviceWriter Системный объект, звуковое устройство, указанное Device свойство заблокировано. Аудиоустройство может быть заблокировано только одним audioDeviceWriter за раз. Для освобождения аудиоустройства вызовите release на вашем audioDeviceWriter Системный объект.
audioToDevice - Аудио на устройствоЗвуковой сигнал для записи в устройство, заданный как матрица. Столбцы матрицы обрабатываются как независимые аудиоканалы.
Если audioToDevice имеет тип данных 'double' или 'single', устройство записи аудиоустройства записывает значения за пределами диапазона [-1, 1]. Для других типов данных допустимый диапазон ввода равен [min, max] указанного типа данных.
Типы данных: single | double | int16 | int32 | uint8
numUnderrun - Количество недоиспользованных пробЧисло выборок, на которое очередь записи аудиоустройства была недоиспользована с момента последнего вызова deviceWriter.
Типы данных: uint32
Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:
release(obj)
getAudioDevices | Список доступных аудиоустройств |
info | Получение информации об аудиоустройстве |
clone | Создать повторяющийся объект System |
isLocked | Определить, используется ли объект System |
release | Деблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков |
reset | Сброс внутренних состояний объекта System |
step | Запустить алгоритм объекта System |
setup | Однократная настройка задач для системных объектов |
Прочитайте аудиофайл MP3 и воспроизведите его через устройство вывода звука по умолчанию.
Создать dsp.AudioFileReader с настройками по умолчанию. Используйте audioinfo функция для возврата структуры, содержащей информацию об аудиофайле.
fileReader = dsp.AudioFileReader('speech_dft.mp3'); fileInfo = audioinfo('speech_dft.mp3')
fileInfo = struct with fields:
Filename: '/mathworks/devel/bat/BR2021ad/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™ сократить задержки из-за размера буфера устройства.
Создать dsp.AudioFileReader Системный объект для чтения аудиофайла с настройками по умолчанию.
fileReader = dsp.AudioFileReader('speech_dft.mp3');Создание audioDeviceWriter Системный объект и укажите частоту дискретизации, соответствующую частоте чтения аудиофайлов.
deviceWriter = audioDeviceWriter(... 'SampleRate',fileReader.SampleRate);
Вычислите задержку из-за буфера устройства в секундах.
bufferLatency = fileReader.SamplesPerFrame/deviceWriter.SampleRate %#okbufferLatency = 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: 71680.
fprintf('Total seconds underrun: %d.\n',double(totalUnderrun)/double(deviceWriter.SampleRate))Total seconds underrun: 3.250794e+00.
Отпустите свой audioDeviceReader и dsp.AudioFileWriter и установите значение переменной счетчика равным нулю.
release(fileReader) release(deviceWriter) totalUnderrun = 0;
Установите размер кадра цикла аудиопотока на 2048. Потому что SupportVariableSizeInput собственность вашего audioDeviceWriter Системный объект имеет значение falseразмер буфера аудиоустройства совпадает с размером входного кадра. Увеличение размера буфера устройства уменьшает недозапуск.
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.
Увеличенный размер кадра уменьшает общее недоделание цикла аудиопотока. Однако увеличение размера кадра также увеличивает задержку. Другие подходы к сокращению недозахода включают:
Увеличение размера буфера независимо от размера входного кадра. Чтобы увеличить размер буфера независимо от размера входного кадра, необходимо сначала установить SupportVariableSizeInput кому true. Этот подход также увеличивает задержки.
Уменьшение частоты выборки. Уменьшение частоты дискретизации уменьшает как задержку, так и недозапуск за счет разрешения сигнала.
Выбор оптимального драйвера и устройства для вашей системы.
audioDeviceWriterУказание отображения канала, не используемого по умолчанию, для 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 устройства вывода звука.
Запишите матрицу из двух столбцов на устройство вывода звука. Столбец 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
Примечания и ограничения по использованию:
Системные объекты в генерации кода MATLAB (кодер MATLAB)
Исполняемый файл, созданный из этого объекта System, основан на предварительно созданных файлах динамической библиотеки (.dll файлы), входящие в состав MATLAB. Используйте packNGo для упаковки кода, созданного из этого объекта, и всех соответствующих файлов в сжатый zip-файл. С помощью этого zip-файла можно переместить, распаковать и перестроить проект в другой среде разработки, где MATLAB не установлен. Дополнительные сведения см. в разделе Запуск функций аудио ввода/вывода вне MATLAB и Simulink.
asiosettings | Устройство записи аудиоустройств | audioDeviceReader | audioPlayerRecorder | dsp.AudioFileReader | dsp.AudioFileWriter | getAudioDevices
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.