Воспроизведение на звуковую карту
The audioDeviceWriter
Система object™ записывает аудио выборок в устройство аудио выхода. Свойства аудио устройства средства записи задать драйвер, устройство и атрибуты устройства, такие как частота дискретизации, глубина бита и buffer size.
Смотрите Аудио ввода-вывода: Буферизация, Задержка и Пропускная способность для подробного объяснения аудио устройства средства записи потока данных.
Чтобы передать данные в аудио устройство:
Создайте audioDeviceWriter
Объекту и установите его свойства.
Вызывайте объект с аргументами, как будто это функция.
Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».
возвращает Системный объект, deviceWriter
= audioDeviceWriterdeviceWriter
, который записывает аудио выборки в устройство выхода аудио в режиме реального времени.
устанавливает свойство SampleRate на deviceWriter
= audioDeviceWriter(sampleRateValue
)sampleRateValue
.
устанавливает каждое свойство deviceWriter
= audioDeviceWriter(___,Name,Value
)Name
к заданной Value
. Неопределенные свойства имеют значения по умолчанию.
deviceWriter = audioDeviceWriter(48000,'BitDepth','8-bit integer')
создает Системный объект, deviceWriter
, который действует со скоростью дискретизации 48 кГц и 8-битовой целочисленной битовой глубиной.Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release
функция разблокирует их.
Если свойство настраивается, можно изменить его значение в любой момент.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.
Driver
- Драйвер, используемый для доступа к аудиоустройству (только для Windows)'DirectSound'
(по умолчанию) | 'ASIO'
| 'WASAPI'
Драйвер, используемый для доступа к вашему аудио устройству, задается как '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.
Как задать nondefault Driver
значения должны иметь лицензию Audio Toolbox™. Если тулбокс не установлен, задайте nondefault 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. Если тулбокс не установлен, задается значение nondefault BitDepth
возвращает ошибку.
Типы данных: char
| string
SupportVariableSizeInput
- Поддержка переменного формата кадраfalse
(по умолчанию) | true
Опция для поддержки переменного формата кадра, заданная как true
или false
.
false
- Если audioDeviceWriter
объект заблокирован, вход должен иметь одинаковый формат кадра при каждом вызове. Buffer size вашего аудио устройства совпадает с размером входного кадра.
true
- Если audioDeviceWriter
объект заблокирован, размер входного кадра может измениться при каждом вызове. Значение buffer size вашего аудио устройства задается свойством BufferSize.
Типы данных: char
BufferSize
- Buffer size аудиоустройства4096
(по умолчанию) | положительное целое числоBuffer size аудио устройства, заданная как положительное целое число.
Примечание
Если Driver
задается как 'ASIO'
откройте пользовательский интерфейс ASIO, чтобы установить buffer size звуковой карты равным BufferSize
значение вашего audioDeviceWriter
Системный объект.
Чтобы включить это свойство, установите значение SupportVariableSizeInput на true
.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
ChannelMappingSource
- Источник отображения между входной матрицей и каналами устройства'Auto'
(по умолчанию) | 'Property'
Источник отображения между столбцами матрицы входа и каналами устройства аудио выхода, заданный как 'Auto'
или 'Property'
.
'Auto'
- Настройки по умолчанию определяют отображение между столбцами входа матрицы и каналами устройства аудио выхода. Для примера предположим, что ваш вход является матрицей с четырьмя столбцами, и ваше аудио устройство имеет четыре доступных канала. Столбец 1 ваших входных данных записывает в канал 1 вашего устройства, столбец 2 ваших входных данных записывает в канал 2 вашего устройства и так далее.
'Property'
- Свойство ChannelMapping определяет отображение между столбцами входа матрицы и каналами устройства аудио выхода.
Типы данных: char
| string
ChannelMapping
- Сопоставление Nondefault между входной матрицей и каналами устройств[1:MaximumOutputChannels]
(по умолчанию) | скалярный вектор |Сопоставление Nondefault между столбцами входа матрицы и каналами выхода устройства, заданное как скаляр или вектор допустимых индексов канала. Дополнительные сведения см. в примере «Настройка отображения каналов для audioDeviceWriter».
Чтобы выборочно сопоставить между столбцами матрицы входа и каналами выхода звуковой карты, вы должны иметь лицензию Audio Toolbox. Если тулбокс не установлен, задается значение nondefault 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
- Аудио к устройствуАудиосигнал для записи в устройство, заданный как матрица. Столбцы матрицы рассматриваются как независимые аудиоканалы.
Если audioToDevice
относится к типу данных 'double'
или 'single'
, значение аудио устройства средства записи клипса за пределами области значений [-1, 1]. Для других типов данных допустимая входная область значений равна [min, max] заданного типа данных.
Типы данных: single
| double
| int16
| int32
| uint8
numUnderrun
- Количество выборокКоличество выборок, по которым очередь аудио устройства средства записи была недооценена с момента последнего вызова 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/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™, чтобы уменьшить задержку из-за 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
Underrun относится к молчанию выходного сигнала, которое происходит, когда цикл аудиопотока не успевает за выходным устройством. Определите недооценку цикла аудиопотока, добавьте искусственную вычислительную нагрузку в цикл аудиопотока, а затем измените свойства своего 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
, 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
Задайте nondefault отображения канала для 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 Coder)
Исполняемый файл, сгенерированный из этого системного объекта, полагается на предварительно созданные файлы динамической библиотеки (.dll
файлы) в комплекте с MATLAB. Используйте packNGo
функция, чтобы упаковать код, сгенерированный из этого объекта, и все соответствующие файлы в сжатом zip-файле. Используя эту zip- файла, можно переместить, распаковать и перестроить проект в другой среде разработки, где MATLAB не установлен. Для получения дополнительной информации смотрите Run Audio I/O Features Outside MATLAB и Simulink.
asiosettings
| Audio Device Writer | audioDeviceReader
| audioPlayerRecorder
| dsp.AudioFileReader
| dsp.AudioFileWriter
| getAudioDevices
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.