主要内容

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

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

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

本教程中介绍的概念是根据MATLAB环境中的系统对象进行描述的。同样的概念可以应用到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系统工具箱™作用域,例如timescope简介,或dsp。ArrayPlot.按照第1点中列出的建议设置并预运行作用域。如果需要自定义图形或正在循环中处理回调,请使用drawnow命令并指定有限的更新速率以优化事件队列。

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

延迟

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

  • 输入延迟被测量为音频进入声卡的时间和帧由处理阶段输出的时间之间的时间延迟。

如果属性和帧大小保持一致,则输入延迟输出延迟调用之间是否一致audioPlayerRecorder对象。

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

  1. 优化加工阶段。如果您的处理阶段在算法上达到了峰值,请将MATLAB代码编译为C代码MATLAB编码器可能会导致更快的执行。

  2. 增加抽样率。

  3. 减小帧大小。

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

另请参阅

||||||||||

相关的话题