主要内容

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

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

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

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

输入音频流

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

该图和下面的描述表明了用该方法获取单通道信号时的数据流audioDeviceReader系统对象。

配置

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

实时处理循环

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

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

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

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

输出音频流

要将音频流发送到文件,请使用音频文件编写器系统对象。要将音频流发送到设备,请使用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在需要实时处理的循环之前的系统对象上。在开始实际处理之前,还可以使用虚拟数据运行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. 减小帧大小。

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

另请参阅

||||||||||

相关话题