音频I/O:缓冲,延迟和吞吐量
Audio Toolbox™针对实时流处理进行了优化。它的输入和输出System对象是高效的、低延迟的,并且它们控制所有必要的参数,以便您可以在吞吐量和延迟之间进行权衡。
本教程描述了MATLAB®软件实现实时流处理。本教程介绍优化流处理算法的关键术语和基本技术。有关更详细的技术描述和概念,请参阅本教程中使用的音频I/O系统对象的文档。
本教程中介绍的概念是根据MATLAB环境中的系统对象来描述的。同样的概念可以应用到Simulink中的相应块中万博1manbetx®环境。
输入音频流
要从文件中获取音频流,请使用dsp。AudioFileReader
系统对象™。若要从设备获取音频流,请使用audioDeviceReader
系统对象。
此图和下面的说明指明了用audioDeviceReader
系统对象。
配置
你的属性
audioDeviceReader
指定驱动程序、设备(声卡)、采样率、位深度、缓冲区大小以及设备的输入通道和从您的audioDeviceReader
对象。你的对象一旦将这些规范传达给驱动程序设置
.
实时处理循环
麦克风接收声音并向声卡发送连续的电信号。
声卡以配置期间指定的采样速率、缓冲区大小和位深度执行模拟-数字转换。
模数转换器将音频样本写入声卡缓冲器。如果缓冲区已满,则删除新的示例。这些样本被称为超支.
的
audioDeviceReader
使用驱动程序迭代地从声卡缓冲区中提取最老的帧。
输出音频流
要将音频流发送到文件,请使用dsp。AudioFileWriter
系统对象。要将音频流发送到设备,请使用audioDeviceWriter
系统对象。
接口播放单通道信号时的数据流audioDeviceWriter
系统对象。
配置
你的属性
audioDeviceWriter
指定驱动程序、设备(声卡)、采样率、位深度、缓冲区大小以及设备输出通道和输入到您的audioDeviceWriter
对象。你的对象一旦将这些规范传达给驱动程序设置
.
实时处理循环
处理阶段将一个可变长度的帧传递给
audioDeviceWriter
系统对象。audioDeviceWriter
将帧发送到声卡的缓冲区。声卡从缓冲区中提取最老的帧,并执行数字到模拟的转换。声卡将模拟块发送到扬声器。当声卡试图从缓冲区中提取时,如果缓冲区为空,声卡将输出一个静默区域。这被称为暗流.
同步音频到设备和从设备
若要同时读取和写入单个音频设备,请使用audioPlayerRecorder
系统对象。
此图表和下面的说明表示播放和记录单通道信号时的数据流audioPlayerRecorder
系统对象。
配置
你的属性
audioPlayerRecorder
指定设备(声卡)、采样速率、位深度、缓冲区大小以及设备和对象之间的通道映射。你的对象一旦将这些规范传达给驱动程序设置
.
实时处理循环
麦克风接收声音并向声卡发送连续的电信号。同时,扬声器播放从声卡接收到的模拟块。
声卡对所采集的音频信号进行模数转换,并将数字块写入输入缓冲区。如果输入缓冲区已满,则删除新的示例。同时,声卡从输出缓冲区中提取最老的帧,并对下一个要播放的音频块执行数字到模拟转换。当声卡试图检索数据时,如果输出缓冲区为空,则声卡输出静默区域。
的
audioPlayerRecorder
对象将获取的音频信号返回到MATLAB环境进行处理。的参数指定要播放的音频audioPlayerRecorder
以便在下一个I/O循环中播放。
优化性能的术语和技术
信号下降
暗流指输出信号静默。当数字到模拟转换时,如果设备缓冲区为空,则会发生输出信号静默。当MATLAB中的处理循环不以声卡要求的速率提供样本时,就会产生这种结果。函数调用时返回未运行的样例数量
audioPlayerRecorder
或audioDeviceWriter
对象。泛滥指输入信号下降。当处理阶段与采样不同步时,就会发生输入信号下降。调用溢出的样本数量时返回
audioPlayerRecorder
或audioDeviceReader
对象。
如果你遇到溢出或运行不足,试着用以下一种或多种方法改进你的I/O系统:
确定何时发生溢出或不足运行。如果它发生在最初的几个迭代中,考虑调用
setupImpl
在需要实时处理的循环之前对系统对象进行处理。在开始真正的处理之前,您还可以使用虚拟数据运行I/O系统几帧。有关更多信息,请参见流媒体实时音频算法的性能测量.如果您在Windows上使用DirectSound驱动程序®平台,考虑切换到WASAPI或ASIO™驱动程序。ASIO驱动程序的开销最小。如果您正在使用ASIO驱动程序,请确保将MATLAB中的帧大小与ASIO缓冲区大小匹配。您可以使用
asiosettings
从MATLAB打开ASIO首选项UI。如果可以为应用程序增加更多的延迟,可以考虑增加对象的缓冲区大小。默认情况下,缓冲区大小是音频对象处理的数据的帧大小。
如果可以降低信号分辨率,可以考虑降低采样率。
关闭机器上所有不必要的进程,例如邮件检查程序和文件同步实用程序。这些进程可以通过中断异步地请求CPU时间并干扰音频处理循环。
为了最大化性能,请从实时循环中删除所有绘图和可视化。如果您需要在处理循环中更新可视化,请使用DSP System Toolbox™作用域,例如
timescope
,简介
,或dsp。ArrayPlot
.按照第1点中列出的建议设置和预运行作用域。如果需要自定义图形或正在循环中处理回调,请使用drawnow
命令并指定一个有限的更新速率以优化事件队列。如果处理循环的算法很重,试着分析你的循环来定位瓶颈,然后应用适当的措施:
用优化过的MATLAB特性替换手写代码。
遵循最佳实践的性能:提高性能的技巧.
生成MATLAB可执行文件(MEX文件)MATLAB编码器™可能会导致更快的执行。看到从音频流中删除干扰音了一个例子。
您还可以生成独立的可执行文件(EXE文件)。看到为参数音频均衡器生成独立的可执行文件了一个例子。
如果您正在考虑将您的算法转换为VST插件,那么尝试在MATLAB中作为VST插件运行它。VST插件生成在底层使用C代码生成技术,在MATLAB中运行生成的VST插件可能会比使用原始的MATLAB代码执行得更快。看到音频插件在MATLAB而且主机外部音频插件学习如何设计、生成和托管VST插件。
延迟
输出延迟为在MATLAB中生成音频帧的时间与通过扬声器听到音频的时间之间的时间延迟。
输入延迟测量为音频进入声卡的时间与处理阶段输出帧的时间之间的时间延迟。
如果属性和帧大小保持一致,则输入延迟来输出延迟调用之间是否一致audioPlayerRecorder
对象。
为了减少延迟,你可以:
优化加工阶段。如果你的处理阶段达到了算法的峰值,编译你的MATLAB代码到C代码使用MATLAB编码器可能会导致更快的执行。
增加采样率。
减小帧大小。
有关测量系统的往返延迟的教程,请参见测量音频延迟.
另请参阅
asiosettings
|getAudioDevices
|dsp。AudioFileReader
|dsp。AudioFileWriter
|audioDeviceReader
|audioDeviceWriter
|audioPlayerRecorder
|音频设备的读者|音频设备的作家|从多媒体文件|多媒体文件