主要内容

测量音频延迟

这个例子展示了如何测量音频设备的延迟。该示例使用audioLatencyMeasurementExampleApp,它依次使用audioPlayerRecorder以及测试信号和互相关来确定延迟。为了避免硬盘访问干扰,测试信号被加载到dsp中。AsyncBuffer对象,帧从该对象通过音频设备流。

简介

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

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

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

  3. 采样率

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

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

这个例子展示了如何度量往返延迟。即通过设备播放音频、使用物理环回线回环音频、使用同一音频设备录制环回音频时产生的延迟。为了计算您自己的音频设备的延迟,您需要使用环回电缆连接音频输出和音频输入端口。

往返延迟不会分解输出延迟和输入延迟之间的度量。它只衡量两者的综合效果。此外,大多数实际应用程序不会使用环回设置。通常,处理链由录音、处理和播放处理过的音频组成。然而,在其他因素(帧大小、采样率、算法延迟)不变的情况下,所涉及的延迟应该是相同的。

硬件延迟

较小的帧大小和较高的采样率降低了往返延迟。然而,代价是发生退出的可能性更高(超出/不足)。

除了可能增加延迟之外,音频算法中涉及的处理数量也可能导致退出。

使用audioLatencyMeasurementExampleApp.m测量延迟

函数audioLatencyMeasurementExampleApp为给定的设置计算以毫秒为单位的往返延迟。超支和不足也被提出。如果超出/不足不为零,则结果可能无效。例如:

audioLatencyMeasurementExampleApp (“SamplesPerFrame”, 64,“SampleRate”48岁的e3)本例中的测量是在macOS上完成的。。对于大多数%测量时,使用Steinberg UR22外接USB设备。为%的测量与自定义I/O通道,RME Fireface UFX+设备%使用。这个RME设备有较低的延迟比斯坦伯格设备%给定的采样率/帧大小组合。使用视窗的测量ASIO驱动程序应该得到类似的值。
对frameSize 64进行了试验。ans = 1×5表SamplesPerFrame SampleRate_kHz Latency_ms超支欠载运行很有用  _______________ ______________ __________ ________ _________ 64 48 8.3125 0 0

在测量延迟时的一些建议

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

  1. 关闭所有其他程序

  2. 确保没有发生不足/超支

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

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

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

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

audioLatencyMeasurementExampleApp (“SamplesPerFrame”, 96,...“SampleRate”48岁的e3,“Ntrials”3)
对frameSize 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向量:

BufferSizes = (64; 96; 128);t = audioLatencyMeasurementExampleApp (“SamplesPerFrame”BufferSizes)注意,对于缓冲区大小的每一个示例增量,附加的%延迟是3*SamplesPerFrameIncrement/SampleRate(仅macOS)。
对frameSize 64进行了试验。对frameSize 96进行了试验。对frameSize 128进行了试验。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。用测量值减去这个值% latency给出了设备引入的延迟的度量A/D转换、D/A转换和驱动程序的%效果)。上面的数字%表示由于设备特定的因素,约4.3125 ms延迟。t.Latency_ms - 3 * BufferSizes / 48
Ans = 0.0020 0.0020 Ans = 4.3125 4.3125 4.3125

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

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

audioLatencyMeasurementExampleApp (“SamplesPerFrame”(32 64 96),...“SampleRate”96年e3,“设备”“Fireface UFX + (23767940) '...“IOChannels”1, [3])
对frameSize 32进行了试验。对frameSize 64进行了试验。对frameSize 96进行了试验。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

算法的延迟

目前的测量还不包括算法延迟。因此,对于给定的设备、缓冲区大小和采样率,它们表示可以实现的最小往返延迟。您可以在处理链中添加一个线性相位FIR滤波器,以验证延迟测量是否符合预期。此外,它还提供了一种验证在给定工作负载下实时音频处理的鲁棒性的方法。例如,

L = 961;Fs = 48 e3;audioLatencyMeasurementExampleApp (“SamplesPerFrame”, 128,...“SampleRate”Fs,“FilterLength”L,“Ntrials”3)由过滤器引入的延迟是由过滤器给出的%群延迟。GroupDelay = (l - 1) / 2 / Fs组延迟占10毫秒的额外延迟时,使用961 tap线性相位FIR滤波器vs.最小可实现延迟。
对frameSize 128进行了试验。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

绘制原始和记录的信号

延迟测量是通过相互关联的源来确定的。%音频信号的延迟版本后产生的信号%环回通过音频设备。中的Plot选项绘制原始信号和延迟信号的度量相关性%互相关:audioLatencyMeasurementExampleApp (“SamplesPerFrame”, 128,“阴谋”,真正的)如果使用可选的FIR滤波,波形不受影响。%,因为使用的过滤器比测试音频有更宽的带宽%的信号。
对frameSize 128进行了试验。策划……ans = 1×5表SamplesPerFrame SampleRate_kHz Latency_ms超支欠载运行很有用  _______________ ______________ __________ ________ _________ 128 48 12.312 0 0

Baidu
map