主要内容

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

Audio Toolbox™针对实时流处理进行了优化。其输入和输出系统对象是有效的,低延迟,它们控制所有必要的参数,以便您可以在吞吐量和延迟之间进行折交。

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

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

输入音频流

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

此图和下面的描述在获取MonoChannel信号时,表明数据流量audioDeviceReader系统对象。

配置

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

实时处理循环

  1. 麦克风拾取声音并向声卡发送连续电信号。

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

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

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

输出音频流

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

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

配置

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

实时处理循环

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

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

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

将音频与设备同步

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

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

配置

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

实时处理循环

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

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

  3. audioltayerrecorder.对象将所获取的音频信号返回到MATLAB环境以进行处理。同时,要播放的音频被指定为一个参数audioltayerrecorder.在下一个I / O周期中的播放。

优化性能的术语和技巧

信号滴

  • 暗流是指输出信号沉默。如果设备缓冲区是空的,则会出现输出信号静音,当数字到模拟转换时为空。这导致MATLAB中的处理循环在声卡需求的速率下不提供样品。当您打电话给您时,返回的样本数量audioltayerrecorder.audioDeviceWriter对象。

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

如果您遇到过度运行或欠下,请尝试以以下方式以一种或多种方式改进I / O系统:

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

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

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

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

  5. 关闭计算机上的所有非校存流程,例如邮件检查和文件同步实用程序。这些过程可以通过中断和干扰音频处理循环来异步地询问CPU时间。

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

  7. 如果处理循环的算法量很大,尝试分析你的循环来定位瓶颈,然后应用适当的措施:

潜伏

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

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

如果属性和帧大小保持一致,则输入延迟输出延迟呼叫之间是一致的audioltayerrecorder.对象。

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

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

  2. 增加抽样率。

  3. 减少框架尺寸。

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

也可以看看

||||||||||

相关的话题