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

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

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

本教程中介绍的概念是根据MATLAB环境中的System对象来描述的。同样的概念也可以应用到Simulink中相应的模块中万博1manbetx®环境。

输入音频流

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

此图和下面的说明指示了使用audioDeviceReader系统对象。

配置

  • 你的属性audioDeviceReader指定驱动程序、设备(声卡)、采样率、位深度、缓冲区大小以及设备的输入通道和输出列之间的通道映射audioDeviceReader对象。你的对象立即将这些规范传递给驱动程序设置.

实时处理回路

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

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

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

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

输出音频流

要向文件发送音频流,请使用音频文件编写器系统对象。要向设备发送音频流,请使用audioDeviceWriter系统对象。

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

配置

  • 你的属性audioDeviceWriter指定驱动程序、设备(声卡)、采样率、位深、缓冲区大小和设备输出通道与输入列之间的通道映射audioDeviceWriter对象。你的对象立即将这些规范传递给驱动程序设置.

实时处理回路

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

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

  3. 声卡从缓冲器中取出最旧的帧并进行数字-模拟转换。声卡将模拟块发送给扬声器。如果声卡试图从缓冲区中提取时缓冲区为空,则声卡将输出一个静默区域。这被称为低劣.

同步设备与设备之间的音频

要同时从单个音频设备读取和写入,请使用音频播放器记录系统对象。

此图和下面的说明指示了使用播放和记录单声道信号时的数据流音频播放器记录系统对象。

配置

  • 你的属性音频播放器记录指定设备(声卡)、采样率、位深、缓冲区大小和设备和对象之间的通道映射。你的对象立即将这些规范传递给驱动程序设置.

实时处理回路

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

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

  3. 这个音频播放器记录对象将获取的音频信号返回到MATLAB环境进行处理。同时,要播放的音频被指定为音频播放器记录用于在下一个I/O循环中播放。

优化性能的术语和技术

信号下降

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

  • 泛滥指输入信号降。当处理阶段与采集样本的速度不一致时,输入信号就会下降。当您调用您的音频播放器记录audioDeviceReader对象。

如果遇到溢出或不足,请尝试通过以下一种或多种方式改进I/O系统:

  1. 确定何时发生溢出或不足。如果它发生在前几个迭代中,考虑调用设置在需要实时处理的循环之前的系统对象上。在开始实际处理之前,还可以使用虚拟数据运行I/O系统几帧。有关详细信息,请参阅流式实时音频算法的性能度量.

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

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

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

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

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

  7. 如果处理循环是算法密集型的,请尝试分析循环以定位瓶颈,然后应用适当的措施:

    • 将手写代码替换为针对速度进行了优化的MATLAB功能。

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

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

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

    • 如果你正在考虑将你的算法变成一个VST插件,然后尝试在MATLAB中运行它作为一个VST插件。VST插件生成实际上使用了C代码生成技术,在MATLAB中运行生成的VST插件可能会比使用原始MATLAB代码更快。看到MATLAB中的音频插件主机外部音频插件学习如何设计,生成,然后托管一个VST插件。

潜伏期

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

  • 输入延迟被测量为音频进入声卡的时间与处理级输出帧的时间之间的时间延迟。

如果属性和帧大小保持一致,则输入延迟输出延迟在对音频播放器记录对象。

为了最小化延迟,你可以:

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

  2. 增加抽样率。

  3. 减小帧大小。

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

另见

||||||||||

相关话题