主要内容

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

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

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

本教程中呈现的概念在MATLAB环境中的系统对象方面描述。相同的概念可以应用于Simulink中的相应块金宝app®环境。

输入音频流

要从文件中获取音频流,请使用dsp。AudioFileReaderSystem Object™。要从设备获取音频流,请使用audiodevicereader.系统对象。

此图和下面的描述表示使用audiodevicereader.系统对象。

配置

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

实时处理循环

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

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

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

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

输出音频流

将音频流发送到文件中,请使用dsp.audiofileWriter.系统对象。要将音频流发送到设备,请使用audiodevicewriter.系统对象。

此图和下面的描述在播放Monichannel信号时表明数据流量audiodevicewriter.系统对象。

配置

  • 你的财产audiodevicewriter.指定设备的输出通道和列输入的驱动程序,设备(声卡),采样率,位深度,缓冲区大小和通道映射audiodevicewriter.目的。您的对象将这些规范传达给驱动程序一次设置

实时处理循环

  1. 处理阶段将变量长度帧传递给audiodevicewriter.系统对象。

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

  3. 声卡从缓冲区中提取最旧的帧并执行数字到模拟转换。声卡将模拟块发送到扬声器。如果声卡尝试从其拉动时,缓冲区是空的,则声卡输出了一个沉默区域。这被称为欠跑

同步音频到和从设备

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

此图和下面的描述表示用audioPlayerRecorder系统对象。

配置

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

实时处理循环

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

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

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

优化性能的术语和技术

信号下降

  • 欠跑指输出信号沉默。当数字到模拟转换时,如果设备缓冲区为空,则输出信号静默。当MATLAB中的处理循环不能以声卡要求的速率提供样本时,就会产生这种结果。调用时返回欠运行的样本数audioPlayerRecorder或者audiodevicewriter.目的。

  • 超支指输入信号掉落。当处理阶段没有与采集样本的采集时不保持速度时,会发生输入信号液滴。当您打电话给您时,返回的样本数量audioPlayerRecorder或者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。简介,或dsp.arrayplot..按照第1点中列出的建议来设置和预运行范围。如果需要自定义图形或正在循环中处理回调,请使用drawn命令并指定有限的更新速率来优化事件队列。

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

    • 用经过速度优化的MATLAB特性取代手写代码。

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

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

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

    • 如果您正在考虑将算法转换为VST插件,则尝试将其运行为Matlab中的VST插件。VST插件生成在引擎盖下使用C代码生成技术,并在MATLAB中运行生成的VST插件可能会导致比原始MATLAB代码更快的执行。看到音频插件在MATLAB主机外部音频插件要了解如何设计,生成,然后主持VST插件。

延迟

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

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

如果属性和帧大小保持一致,则输入延迟输出延迟通话之间是否一致audioPlayerRecorder目的。

要最大限度地减少延迟,可以:

  1. 优化处理阶段。如果您的处理阶段已经达到了算法的峰值,请使用MATLAB代码编译为C代码使用MATLAB编码器可能导致更快的执行。

  2. 提高采样率。

  3. 减少帧大小。

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

另请参阅

||||||||||

相关话题