主要内容

测量音频延迟

这个例子展示了如何衡量一个音频设备的延迟。示例使用audioLatencyMeasurementExampleApp反过来使用audioPlayerRecorder连同测试信号和交叉相关性来确定延迟。为了避免磁盘访问的干扰,测试信号加载到一个dsp。首先AsyncBuffer对象,框架流对象通过音频设备。

介绍

概括地说,延迟被定义为音频信号输入时的时间从一个系统,直到退出。数字音频处理链,有多个参数,导致延迟:

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

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

  3. 采样率

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

  5. 算法的延迟(如延迟引入一个过滤器或音频效果)

这个例子展示了如何衡量往返延迟。即延迟发生当通过一个设备播放音频时,循环回物理回路电缆,音频和记录的回送音频相同的音频设备。为了计算延迟自己的音频设备,你需要连接的音频,音频端口使用回路电缆。

之间的往返延迟不分解测量输入输出延迟和延迟。它只衡量两者的综合效应。同时,大多数实际应用不会使用环回设置。通常处理链由录制音频,处理,和玩的音频处理。然而,涉及的延迟应该是相同的方式提供了其他因素(帧大小、采样率、算法延迟)不改变。

硬件延迟

小帧大小和高采样率减少往返延迟。然而,权衡是辍学的可能性更高的发生(超支/欠载运行很有用)。

除了潜在的延迟增加,参与音频处理算法的数量也会导致辍学。

测量延迟audioLatencyMeasurementExampleApp.m

函数audioLatencyMeasurementExampleApp计算往返延迟时间(毫秒)对于一个给定的设置。超支和欠载运行很有用。如果超支/欠载运行很有用不是零,结果可能是无效的。例如:

audioLatencyMeasurementExampleApp (“SamplesPerFrame”,64,“SampleRate”48岁的e3)% macOS的测量在这个例子中进行。对于大多数%的测量,斯坦伯格UR22外部使用USB设备。为%的测量使用自定义I / O通道,RME Fireface UFX +设备%使用。这个RME设备比的斯坦伯格设备更低的延迟%给定的采样率/帧尺寸组合。测量在Windows上使用% ASIO司机应该导致相似的价值观。
64年frameSize试验(s)完成。ans = 1×5表SamplesPerFrame SampleRate_kHz Latency_ms超支欠载运行很有用__________ ________售予* * * _____ 64 48 8.3125 0 0

一些建议在测量延迟

实时处理通用操作系统是唯一可能的,如果你减少被计算机执行其他任务。建议:

  1. 关闭所有其他程序

  2. 确保没有欠载运行很有用/超支发生

  3. 使用一个足够大的缓冲区大小(SamplesPerFrame),以确保一致的dropout-free行为

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

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

当使用ASIO(或CoreAudio Mac OS),测量的延迟是一致的,只要没有辍学。对于小缓冲区大小,可以得到一个干净的测量在一个实例和辍学。Ntrials选项可以用来确保一致的辍学行为在测量延迟。例如,执行3测量,使用:

audioLatencyMeasurementExampleApp (“SamplesPerFrame”,96,“SampleRate”48岁的e3,“Ntrials”3)
96年frameSize试验(s)完成。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:

BufferSizes = (64; 96; 128);t = audioLatencyMeasurementExampleApp (“SamplesPerFrame”BufferSizes)%注意每个样本增量的缓冲区大小,额外的%的延迟是3 * SamplesPerFrameIncrement / SampleRate (macOS只)。
64年frameSize试验(s)完成。96年frameSize试验(s)完成。128年frameSize试验(s)完成。t = 3×5表SamplesPerFrame SampleRate_kHz Latency_ms超支欠载运行很有用__________ ________售予* * * _____ 64 48 8.3125 0 0 96 48 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毫秒延迟由于特定于设备的因素。t。Latency_ms - 3 * BufferSizes / 48
= 0.0020 - 0.0020岁= 4.3125 4.3125 4.3125

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

执行的测量目前假设频道# 1是用于输入和输出。如果你的设备有一个回路电缆连接到其他频道,您可以指定它们measureLatency使用IOChannels选项。这是指定为一个2-element向量,对应输入和输出通道使用(mono的测量一直是信号)。例如一个RME Fireface UFX +:

audioLatencyMeasurementExampleApp (“SamplesPerFrame”(32 64 96),“SampleRate”96年e3,“设备”,“Fireface UFX + (23767940) ',“IOChannels”1,[3])
审判(s)为frameSize 32。64年frameSize试验(s)完成。96年frameSize试验(s)完成。ans = 3×5表SamplesPerFrame SampleRate_kHz Latency_ms超支欠载运行很有用_____ _____ __________售予* * * 32 0 32 64 96 2.6458 96 3.6458 0 0 96 96 4.6458 0 0

算法的延迟

测量到目前为止还没有包括算法延迟。因此,他们代表了最小的往返延迟,可以实现对于一个给定的设备,缓冲区大小和采样率。您可以添加一个线性相位滤波器处理链验证延迟测量。此外,它提供了一种验证鲁棒性的实时音频处理在一个给定的工作负载。例如,

L = 961;Fs = 48 e3;audioLatencyMeasurementExampleApp (“SamplesPerFrame”,128,“SampleRate”Fs,“FilterLength”L,“Ntrials”3)%的滤波器引入的延时滤波器%群延迟。GroupDelay = (l - 1) / 2 / Fs%的群延迟占10 ms附加延迟当使用% 961 -利用线性相位数字滤波器和最小实现延迟。
128年frameSize试验(s)完成。ans = 3×6表SamplesPerFrame SampleRate_kHz FilterLength Latency_ms超支欠载运行很有用_______ __________售予* * * ________ _____ 128 48 961 128 0 0 22.312 48 961 22.312 0 0 128 48 961 22.312 0 0 GroupDelay = 0.0100

绘制原始记录信号

%的延迟测量是由cross-correlating源决定的%的音频信号延迟版本的信号后的结果通过音频设备%回环。您可以使用情节选项% measureLatency绘制原始和延时信号%互相关:audioLatencyMeasurementExampleApp (“SamplesPerFrame”,128,“阴谋”,真正的)%如果使用可选的冷杉过滤,波形不受影响%因为使用的过滤器有一个更广泛的带宽比测试音频%的信号。
128年frameSize试验(s)完成。策划……ans = 1×5表SamplesPerFrame SampleRate_kHz Latency_ms超支欠载运行很有用__________ ________售予* * * _____ 128 48 12.312 0 0