主要内容

测量音频延迟

此示例示出了如何测量音频设备的等待时间。该示例使用AudiolatencyMeasurementExamPleapp,从而使用audioplayerRecorder以及测试信号和互相关以确定延迟。为了避免磁盘访问干扰,测试信号被加载到dsp.AsyncBuffer第一对象,并且帧被从该对象通过音频设备流式传输。

介绍

笼统,延迟被定义为从音频信号进入系统直到退出时的时间。在数字音频处理链中,有多个引起延迟的参数:

  1. 硬件(包括A/D和D/A转换)

  2. 与系统声卡通信的音频驱动程序

  3. 采样率

  4. 每帧样品(缓冲区大小)

  5. 算法等待时间(例如延迟引入通过一个过滤器或音频效果)

此示例显示如何测量往返延迟。也就是说,通过设备播放音频时发生的延迟,用物理环回电缆循环音频,并使用相同的音频设备记录环回音频。为了计算您自己的音频设备的延迟,您需要使用环回电缆连接音频输出和音频。

往返延迟不会分解输出延迟和输入延迟之间的测量。它只测量两者的综合效果。此外,大多数实际应用程序不会使用环回设置。通常,处理链包括录制音频,处理它并播放处理的音频。但是,所涉及的延迟应该是其他任何方式,提供了其他因素(帧大小,采样率,算法延迟)不改变。

硬件延迟

较小的框架尺寸和更高的采样率降低了往返延迟。然而,权衡是发生的辍学机会的可能性(超统/欠跑)。

除了潜在的延迟之外,音频算法中涉及的处理量也可以导致丢失。

用audiolatencymeasurementexampreapp.m测量延迟

函数audiolatencymeasurementexampleapp计算给定设置的循环延迟以毫秒为单位。还提出了超支和underruns。如果overruns / underruns不为零,则结果可能无效。例如:

audiolatencymeasurementexampleapp('samplesperframe',64,'采样率'48岁的e3)%本例中的测量是在macOS上进行的。对于大多数%测量值,使用Steinberg UR22外部USB设备。为了使用自定义I / O通道进行测量,RME Fireface UFX +设备是% 用过的。该RME设备的延迟较低,而不是Steinberg设备%给定采样率/帧大小组合。在Windows上使用测量% ASIO驱动程序应该会产生类似的值。
为框架化64完成试验64.NAS = 1×5表样本框架Samplerve_khz Latency_ms overruns undruns _______________ _______________________________44 48 8.3125 0 0

测量延迟的一些技巧

只有最小化计算机执行的其他任务,才能对通用操作系统进行实时处理。建议:

  1. 关闭所有其他程序

  2. 确保不会发生undruns / overruns

  3. 使用足够大的缓冲区大小(SamplesPerFrame),以确保一致的无辍学行为

  4. 确保您的硬件设置(缓冲区大小,采样率)将输入与FormeCelaty匹配

在Windows上,您可以使用asiosettings函数来启动对话框来控制硬件设置。在macOS上,你应该启动Audio MIDI设置。

当使用ASIO(或CoreAudio与Mac OS),延迟测量是一致的,只要没有辍学发生。对于较小的缓冲区大小,有可能在一个实例中得到一个干净的度量,而在下一个实例中退出。Ntrials选项可用于在测量延迟时确保一致的退出行为。例如,要执行3次测量,请使用:

audiolatencymeasurementexampleapp('samplesperframe',96,......'采样率',48E3,'ntrial'3,3)
试验(S)框架尺寸96. ANS = 3×5表SamplesPerFrame SampleRate_kHz Latency_ms树精欠载_______________ ______________ __________ ________ _________ 96 48 10.312 0 0 96 48 10.312 0 0 96 48 10.312 0 0进行

不同缓冲区大小的测量

在MacOS上,也可以在不改变硬件设置的情况下尝试不同的帧大小。要使这种方便,可以指定SamplesPerframe的向量:

缓冲= [64; 96; 128];t = audiolatencymeasurementexampleapp('samplesperframe'BufferSizes)%注意,对于缓冲区大小的每个样本增量,额外的%延迟是3 * samplesperframeIncrement / samplege(仅限麦克斯)。
框架尺寸128. T = 3×5表SamplesPerFrame SampleRate_kHz Latency_ms树精欠载_______________ ______________ __________ ________ _________ 64 48 8.3125 0 0 96 48完成试验(一个或多个),用于框架尺寸96.试验(一个或多个)来完成框架尺寸64.试验(一个或多个)来完成10.312 0 0 128 48 12.312 0 0

具体地,在前面的示例中,增量是

3 * (128 - 96, 96 - 64) / 48 e3%此外,请注意,还确定了实际缓冲等待时间%到3 * samplesperframe / samplerate。从测量中减去此值%延迟给出了设备引入的延迟的量度(组合A / D转换,D / A转换和驱动器的效果)。上面的数字由于设备特定因素,%指示约4.3125 ms延迟。t.latency_ms  -  3 * Buffersize / 48
ANS = 0.0020 0.0020 ANS = 4.3125 4.3125 4.3125

指定自定义输入/输出通道

到目前为止执行的测量假设通道#1用于输入和输出。如果您的设备具有连接到其他通道的环回电缆,则可以使用iochannels选项指定它们以Formedelaty。这被指定为2元件向量,对应于要使用的输入和输出通道(测量始终在单声道信号上)。例如,对于RME Fireface UFX +:

audiolatencymeasurementexampleapp('samplesperframe'[32 64 96],......'采样率',96e3,'设备''Fireface UFX +(23767940)'......“IOChannels”,[1 3])
框架尺寸96. ANS = 3×5表SamplesPerFrame SampleRate_kHz Latency_ms树精欠载_______________ ______________ __________ _________ __________ 32 96 2.6458 0 32 64 96试验进行(一个或多个),用于框架尺寸64试验(一个或多个)来完成框架尺寸32试验(一个或多个)来完成3.6458 0 0 96 96 4.6458 0 0

算法延迟

到目前为止的测量率未包含算法延迟。因此,它们代表可以为给定的设备,缓冲区大小和采样率实现的最小往返延迟。您可以添加线性阶段FIR滤波器处理链以验证延迟测量是否正常。此外,它提供了一个给定的工作负载下验证实时音频处理的鲁棒性的一种方式。例如,

l = 961;FS = 48E3;audiolatencymeasurementexampleapp('samplesperframe',128,......'采样率',fs,'filterlength',l,'ntrial'3,3)滤波器引入的延迟由过滤器给出%群延迟。GroupDelay =(L-1)/ 2 / Fs的%组延迟占使用%961  - 抽头线性相位FIR滤波器与最小可实现的延迟。
试验(S)框架尺寸128 ANS = 3×6表SamplesPerFrame SampleRate_kHz FilterLength Latency_ms树精欠载_______________ ______________ ____________ __________ ________ _________ 128 48 961 22.312 0 0 128 48 961 22.312 0 0 128 48 961 22.312 0 0 GroupDelay = 0.0100进行

绘制原始和录制的信号

%的等待时间测量是通过互相关源确定%音频信号,带有延迟版本的信号后%环回通过音频设备。您可以使用绘图选项%Fearmelatiency绘制原始和延迟信号以及%互相关:audiolatencymeasurementexampleapp('samplesperframe',128,'阴谋',真的)%如果使用可选的FIR滤波,则波形不受影响%,因为所用过滤器具有比测试音频更宽的带宽% 信号。
试验(S)框架尺寸128绘制完成... ANS = 1×5表SamplesPerFrame SampleRate_kHz Latency_ms树精欠载_______________ ______________ __________ ________ _________ 128 48 12.312 0 0