主要内容

音频I/O:缓冲、延迟和吞吐量

音频工具箱™是优化的实时流处理。它的输入和输出系统对象是高效的、低延迟的,并且它们控制所有必要的参数,因此您可以在吞吐量和延迟之间进行权衡。

本教程介绍MATLAB如何®软件实现实时流处理。本教程介绍了优化流处理算法的关键术语和基本技术。有关更详细的技术描述和概念,请参阅本教程中使用的音频I/O系统对象的文档。

本教程中介绍的概念是根据MATLAB环境中的System对象进行描述的。同样的概念可以应用于Simulink中的相应块金宝app®环境。

输入音频流

要从文件获取音频流,请使用dsp。AudioFileReader系统对象™。要从设备获取音频流,使用audioDeviceReader系统对象。

这个图和后面的描述表明了用单通道信号获取数据流audioDeviceReader系统对象。

配置

  • 您的属性audioDeviceReader指定驱动程序、设备(声卡)、采样率、位深度、缓冲区大小以及设备的输入通道和从您的audioDeviceReader对象。您的对象将这些规范一次性传递给驱动程序设置

实时处理回路

  1. 麦克风接收声音并向声卡发送连续的电信号。

  2. 声卡在配置过程中指定的采样率、缓冲区大小和位深度执行模数转换。

  3. 模数转换器将音频样本写入声卡缓冲区。如果缓冲区已满,则丢弃新的样本。这些样品被称为超支

  4. audioDeviceReader使用驱动程序迭代地从声卡缓冲区中提取最旧的帧。

输出音频流

将音频流发送到文件,使用dsp。AudioFileWriter系统对象。要向设备发送音频流,请使用audioDeviceWriter系统对象。

这个图和后面的描述表明了当使用audioDeviceWriter系统对象。

配置

  • 您的属性audioDeviceWriter指定驱动程序、设备(声卡)、采样率、位深度、缓冲区大小以及设备的输出通道和输入到您的audioDeviceWriter对象。您的对象将这些规范一次性传递给驱动程序设置

实时处理回路

  1. 处理阶段将可变长度的帧传递给audioDeviceWriter系统对象。

  2. audioDeviceWriter将帧发送到声卡的缓冲区。

  3. 声卡从缓冲器中提取最老的帧并进行数模转换。声卡将模拟数据块发送到扬声器。如果当声卡试图从中拉出缓冲区时,缓冲区为空,则声卡输出一个沉默区域。这被称为暗流

同步音频和设备

要同时对单个音频设备进行读写,请使用audioPlayerRecorder系统对象。

此图和随后的描述表明了使用单通道信号播放和记录时的数据流audioPlayerRecorder系统对象。

配置

  • 您的属性audioPlayerRecorder指定设备(声卡)、采样率、位深度、缓冲区大小以及设备和对象之间的通道映射。您的对象将这些规范一次性传递给驱动程序设置

实时处理回路

  1. 麦克风接收声音并向声卡发送连续的电信号。同时,扬声器播放从声卡接收的模拟块。

  2. 声卡对所采集的音频信号进行模数转换,并将所述数字块写入所述输入缓冲器。如果输入缓冲区已满,则丢弃新的样本。同时,声卡从输出缓冲区中提取最旧的帧,并对要播放的下一个音频块进行数模转换。如果声卡试图检索数据时输出缓冲区为空,则声卡输出一个沉默区域。

  3. audioPlayerRecorder对象将采集到的音频信号返回到MATLAB环境进行处理。方法的参数指定要播放的音频audioPlayerRecorder以便在下一个I/O周期中回放。

优化性能的术语和技术

信号下降

  • 暗流指输出信号静音。当进行数模转换时,如果设备缓冲区为空,则会发生输出信号沉默。当MATLAB中的处理循环不以声卡要求的速率提供采样时,就会出现这种情况。当您调用您的audioPlayerRecorderaudioDeviceWriter对象。

  • 泛滥指输入信号降。当处理阶段跟不上采样的步伐时,输入信号就会下降。返回超出的样本数audioPlayerRecorderaudioDeviceReader对象。

如果遇到溢出或运行不足的情况,请尝试用以下一种或多种方法改进I/O系统:

  1. 确定何时发生超限或欠限。如果它发生在前几个迭代中,请考虑调用setupImpl在需要实时处理的循环之前对System对象进行处理。在开始真正的处理之前,还可以用虚拟数据运行I/O系统几帧。有关更多信息,请参见测量流实时音频算法的性能

  2. 如果您在Windows上使用DirectSound驱动程序®平台,请考虑切换到WASAPI或ASIO™驱动程序。ASIO驱动的开销最小。如果您使用的是ASIO驱动程序,请确保MATLAB中的帧大小与ASIO缓冲区大小相匹配。你可以用asiosettings从MATLAB中打开ASIO首选项UI。

  3. 如果您可以负担得起为应用程序增加更多的延迟,请考虑增加对象的缓冲区大小。默认情况下,缓冲区大小是音频对象处理的数据的帧大小。

  4. 如果可以降低信号分辨率,可以考虑降低采样率。

  5. 关闭计算机上所有不必要的进程,例如邮件检查程序和文件同步实用程序。这些进程可以通过中断异步请求CPU时间,并扰乱音频处理循环。

  6. 为了最大限度地提高性能,请从实时循环中删除所有绘图和可视化。如果您需要在处理循环中更新可视化,请使用DSP System Toolbox™作用域,例如timescopedsp。简介,或dsp。ArrayPlot.按照第1点中列出的建议设置和预运行作用域。如果需要自定义图形或在循环中处理回调,请使用drawnow命令并指定有限更新速率以优化事件队列。

  7. 如果处理循环的算法繁重,请尝试分析循环以找到瓶颈,然后应用适当的措施:

    • 用已为速度优化的MATLAB功能替换手写代码。

    • 遵循性能最佳实践:提高绩效的技巧

    • 生成MATLAB可执行文件(MEX文件)使用MATLAB编码器™可能导致更快的执行。看到从音频流中移除干扰音举个例子。

      您还可以生成独立的可执行文件(EXE文件)。看到生成独立可执行的参数音频均衡器举个例子。

    • 如果您正在考虑将算法转换为VST插件,请尝试在MATLAB中将其作为VST插件运行。VST插件生成在底层使用C代码生成技术,在MATLAB中运行生成的VST插件可能比使用原始MATLAB代码执行得更快。看到MATLAB中的音频插件主机外部音频插件学习如何设计,生成,然后托管一个VST插件。

延迟

  • 输出延迟测量为MATLAB中音频帧的生成时间与通过扬声器听到音频的时间之间的时间延迟。

  • 输入延迟以音频进入声卡的时间与处理阶段输出帧的时间之间的时间延迟来测量。

如果属性和帧大小保持一致,则输入延迟输出延迟对an的呼叫是否一致audioPlayerRecorder对象。

要最小化延迟,您可以:

  1. 优化加工阶段。如果你的处理阶段已经达到了算法上的峰值,使用MATLAB编码器可能导致更快的执行。

  2. 提高采样率。

  3. 减小帧大小。

有关测量系统往返延迟的教程,请参见测量音频延迟

另请参阅

||||||||||

相关的话题