主要内容

audioDeviceReader

声卡记录

描述

audioDeviceReader系统对象™使用计算机的音频输入设备读取音频样本。

音频I / O:缓冲,延迟和吞吐量有关音频设备读取器数据流的详细说明。

音频设备阅读器指定驱动程序、设备及其属性,以及System对象的数据类型和大小输出。

从音频设备传输数据:

  1. 创建audioDeviceReader对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解有关系统对象如何工作的更多信息,请参阅什么是系统对象?

创建

描述

deviceReader.= audiodevicereader.返回一个System对象,deviceReader.,它实时使用音频输入设备读取音频样本。

deviceReader.= audioDeviceReader (sampleRateValue设置SampleRate财产sampleRateValue

deviceReader.= audioDeviceReader (sampleRateValuesampPerFrameValue设置SamplesPerFrame财产sampPerFrameValue

deviceReader.= audioDeviceReader (___名称,价值设置每个属性的名字到指定的价值.未指定的属性具有默认值。

例子:devicereader = audiodevicereader(16000,'bitdepth','8位整数')创建一个System对象,deviceReader.,它以16 kHz采样率和8位整数位深度操作。

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改其值。

有关更改属性值的更多信息,请参见MATLAB使用系统对象的系统设计

用于访问音频设备的驱动程序,指定为声音处理软件的'asio',或'芥末'

  • ASIO™驱动程序不会预先安装在Windows上®机器。用来'asio'驱动程序选项,在MATLAB外部安装ASIO驱动程序®

    笔记

    如果司机被指定为'asio',使用asiosettings将声卡缓冲区大小设置为SamplesPerFrame你的价值audioDeviceReader系统对象。

  • 只有独家模式支持WASAPI驱动程序。万博1manbetx

ASIO和WASAPI驱动程序不提供样本速率转换。对于ASIO和WASAPI驱动程序,设置SampleRate到您的音频设备支持的采样率。万博1manbetx

此属性仅适用于Windows计算机。Linux.®机器总是使用ALSA驱动程序。苹果电脑机器总是使用CoreAudio驱动程序。

数据类型:字符|字符串

用于获取音频样本的设备,指定为字符向量或字符串。使用getAudioDevices列出所选驱动程序的可用设备。

数据类型:字符|字符串

音频设备获取的输入通道数,指定为整数。范围NumChannels.取决于您的音频硬件。

依赖关系

若要启用此属性,请设置ChannelMappingSource“汽车”

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

帧大小从音频设备读取,指定为正整数。SamplesPerFrame也是您的设备缓冲区的大小和您的输出矩阵返回的列数audioDeviceReader目的。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

设备用于获取音频数据的采样率,Hz,指定为正整数。范围SampleRate取决于您的音频硬件。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

设备使用的数据类型获取音频数据,指定为字符向量或字符串。

数据类型:字符|字符串

音频输入设备的通道和输出矩阵列之间的映射源,指定为“汽车”“属性”

  • “汽车”——默认设置决定设备通道和输出矩阵之间的映射。例如,假设您的音频设备有六个可用的频道,并且您设置了NumChannels.6。从您的音频设备阅读器调用的输出是一个六列矩阵。列1对应通道1,列2对应通道2,以此类推。

  • “属性”- 这ChannelMapping属性确定音频设备的通道和输出矩阵列之间的映射。

数据类型:字符|字符串

音频输入设备的通道和输出矩阵列之间的非默认映射,指定为有效的通道索引向量。看为audiodevicereader指定通道映射为更多的信息。

依赖关系

若要启用此属性,请设置ChannelMappingSource“属性”

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

输出的数据类型,指定为字符向量或字符串。

笔记

如果OutputDataType被指定为'双倍的'“单一”,音频设备读取器在范围内输出数据[-1,1]。对于其他数据类型,范围是指定数据类型的[min,max]。

数据类型:字符|字符串

使用

描述

例子

audioFromDevice=deviceReader.()从选定的音频输入设备返回一帧音频样本。

例子

[audioFromDeviceNumoverRun.] =deviceReader.()返回音频读者队列的样本数以来,自上次呼叫以来overrundeviceReader.

注意:当你呼叫audioDeviceReader对象指定的音频设备设备财产被锁定。音频设备只能锁定一个audioDeviceReader在一个时间。要释放音频设备,请调用释放在你的audioDeviceReader目的。

输出参数

全部展开

从设备读取的音频信号,返回为矩阵。指定数量的渠道和SamplesPerFrame属性确定矩阵大小。矩阵的数据类型取决于OutputDataType财产。

数据类型:||int16|int32|uint8

自上次调用以来音频阅读器的队列溢出的样本数deviceReader.

数据类型:uint32

对象功能

要使用对象函数,请将System对象指定为第一个输入参数。例如,要发布命名的系统对象的系统资源obj.,使用下面的语法:

释放(obj)

全部展开

getAudioDevices 列出可用的音频设备
信息 获取音频设备信息
克隆 创建重复的系统对象
isLocked 确定系统对象在使用
释放 释放资源并允许更改系统对象属性值和输入特性
重置 使内部状态复位系统对象
一步 运行系统对象算法
设置 一次性设置系统对象的任务

例子

全部收缩

用麦克风录制10秒的语音,并将输出发送到WAV文件。

创建一个audioDeviceReader对象的默认设置。调用设置减少音频流循环中初始化的计算负载。

deviceReader = audioDeviceReader;设置(deviceReader)

创建一个dsp。AudioFileWriter系统对象。指定要写入的文件名和类型。

fileWriter = dsp。AudioFileWriter (“mySpeech.wav”“FileFormat”“WAV”);

记录10秒的演讲。在音频流循环中,从设备读取音频信号帧,并将音频信号帧写入指定的文件。该文件保存到当前文件夹。

disp (“现在对着麦克风说话。”
现在对着麦克风说话。
Tic.toc < 10 acquiredAudio = deviceReader();fileWriter (acquiredAudio);结尾disp ('录制完成。'
记录完成。

释放音频设备并关闭输出文件。

发布(deviceReader)发布(fileWriter)

潜伏由于输入设备缓冲器是获取一帧数据的时间延迟。在这个例子中,您修改了您的默认属性audioDeviceReader对象以减少延迟。

创建一个audioDeviceReader对象的默认设置。

deviceReader = audioDeviceReader
DeviceReader =具有属性的AudioDevicereader:设备:'默认'NumChannels:1样品框架:1024 Samplege:44100显示所有属性

计算由于您的设备缓冲区的延迟。

fprintf('由于设备缓冲区导致的延迟:%f秒.\n',devicereader.samplesperframe / devicereader.samplere)
由于设备缓冲区的延迟:0.023220秒。

设置SamplesPerFrame你的财产audioDeviceReader对象64.计算延迟。

deviceReader。SamplesPerFrame = 64;fprintf('由于设备缓冲区导致的延迟:%f秒.\n',devicereader.samplesperframe / devicereader.samplere)
设备缓冲区导致的延迟:0.001451秒。

设置SampleRate你的财产audioDeviceReader系统对象96000.计算延迟。

devicereader.sampleate = 96000;fprintf('由于设备缓冲区导致的延迟:%f秒.\n',devicereader.samplesperframe / devicereader.samplere)
由于设备缓冲区的延迟:0.000667秒。

泛滥指输入信号下降,当音频流循环与设备不同步时发生。确定音频流循环的溢出,向音频流循环添加人工计算负载,然后修改audioDeviceReader对象减少超支。您的结果取决于您的计算机。

创建一个audioDeviceReader系统对象SamplesPerFrame设置256SampleRate设置44100.调用设置减少音频流循环中初始化的计算负载。

deviceReader = audioDeviceReader (...'samplesperframe',256,...“SampleRate”, 44100);设置(deviceReader)

创建一个dsp。AudioFileWriter目的。指定要编写的文件名和数据类型。

fileWriter = dsp。AudioFileWriter (“mySpeech.wav”“FileFormat”“WAV”);

录音5秒。在音频流循环中,从设备中读取音频信号帧,并将音频信号帧写入指定的文件。

totalOverrun = 0;disp (“现在对着麦克风说话。”
现在对着麦克风说话。
Tic.toc < 5 [input,numOverrun] = deviceReader();totalOverrun = totalOverrun + nummoverrun;fileWriter(输入);结尾fprintf(“录音完成。\ n”
记录完成。
fprintf(“样本总数超过:%d。\ n'totalOverrun)
样本溢出总数:0。
fprintf(“超过的总秒数:%d.\n”,双(TotaloverRun)/ Double(Devicereader.Sampleger)))
总秒溢出:0。

释放你的audioDeviceReaderdsp.audevicewriter.对象和零您的计数器变量。

释放(fileWriter)释放(deviceReader) totalOverrun = 0;

使用暂停向音频流循环添加人工计算负载。计算负荷导致音频流循环比设备慢慢,这导致获取的采样被丢弃。

disp (“现在对着麦克风说话。”
现在对着麦克风说话。
Tic.toc < 5 [input,numOverrun] = deviceReader();totalOverrun = totalOverrun + nummoverrun;fileWriter(输入);暂停(0.01)结尾fprintf(“录音完成。\ n”
记录完成。
fprintf(“样本总数超过:%d。\ n'totalOverrun)
样品超限总数:97536
fprintf(“超过的总秒数:%d.\n”,双(TotaloverRun)/ Double(Devicereader.Sampleger)))
超过总秒数:2.211701e+00。

释放你的audioDeviceReaderdsp。AudioFileWriter对象,并设置sampleperframe.财产512..设备缓冲区的大小增加,因此设备现在需要更长的时间来获取一帧数据。将计数器变量设置为零。

发布(fileWriter)发布deviceReader (deviceReader)。SamplesPerFrame = 512;totalOverrun = 0;

使用修改后的代码计算音频流循环的总溢出SamplesPerFrame财产。

disp (“现在对着麦克风说话。”
现在对着麦克风说话。
Tic.toc < 5 [input,numOverrun] = deviceReader();totalOverrun = totalOverrun + nummoverrun;fileWriter(输入);暂停(0.01)结尾fprintf(“录音完成。\ n”
记录完成。
fprintf(“样本总数超过:%d。\ n'totalOverrun)
样本溢出总数:0。
fprintf('总秒数超过:%f。\ n'totalOverrun / deviceReader.SampleRate)
累计超限秒数:0.000000。

对象的非默认通道映射audioDeviceReader目的。此示例是特定于硬件。它假设您的计算机有一个具有两个可用频道的默认音频输入设备。

创建一个audioDeviceReader对象的默认设置。

deviceReader = audioDeviceReader;

缺省情况下,通道数为1。打电话给你的audioDeviceReader对象类似于一个函数,它不带参数,以便从音频设备读取一帧数据。验证输出数据矩阵是否只有一列。

x = deviceReader ();[frameLength, numChannels] =大小(x)
frameLength = 1024.
numchannels = 1

使用信息以确定可用的输入通道的最大数目司机设备配置。

信息(deviceReader)
ans =.结构与字段:司机:'DirectSound'devicename:'主要声音捕获驱动程序'最大值incutchannels:2

ChannelMappingSource“属性”.这audioDeviceReader对象必须解除锁定才能更改此属性。

发布(devicereader)devicereader.channelmappingsource =“属性”
deviceReader = audioDeviceReader带有属性:Driver: 'DirectSound' Device: 'Default' SamplesPerFrame: 1024 SampleRate: 44100显示所有属性

默认情况下,如果ChannelMappingSource被设置为“属性”,所有可用的通道都映射到输出。打电话给你的audioDeviceReader对象从音频设备读取一帧数据。验证输出数据矩阵是否有两列。

x = deviceReader ();[frameLength, numChannels] =大小(x)
frameLength = 1024.
numchannels = 2

使用ChannelMapping属性指定设备通道和输出矩阵列之间的替代映射。在对应于输出列的索引处指示输入通道编号。要更改此属性,请先解锁audioDeviceReader目的。

发布(devicereader)devicereader.channelmapping = [2,1];

现在当你打电话给你的时候audioDeviceReader

  • 设备的输入通道1映射到输出矩阵的第二列。

  • 设备的输入通道2映射到输出矩阵的第一列。

从输入设备获得一个特定的通道。

deviceReader。ChannelMapping = 2;

如果你把你的audioDeviceReader,设备的输入通道2映射到输出向量。

扩展功能

在R2016A介绍