В этом примере показано, как измерить задержку звукового устройства. В примере используется audioLatencyMeasurateExampleApp, который, в свою очередь, использует AudioStartRecorder вместе с тестовым сигналом и перекрестной корреляцией для определения задержки. Во избежание помех доступа к диску тестовый сигнал загружается в dsp. Сначала объект AsyncBuffer, и кадры передаются из этого объекта через аудиоустройство.
В общих чертах задержка определяется как время с момента поступления звукового сигнала в систему до его выхода. В цепочке обработки цифрового звука существует несколько параметров, вызывающих задержку:
Аппаратные средства (включая преобразование A/D и D/A)
Аудио драйверы, которые взаимодействуют со звуковой картой системы
Частота отбора проб
Выборки на кадр (размер буфера)
Алгоритмическая задержка (например, задержка, вызванная фильтром или звуковым эффектом)
В этом примере показано, как измерить задержку в обоих направлениях. То есть задержка, возникающая при воспроизведении звука через устройство, закольцовывании звука с помощью физического кабеля закольцовывания и записи звука закольцовывания с помощью того же звукового устройства. Чтобы вычислить задержку для собственного аудиоустройства, необходимо подключить аудиовыход и звук в портах с помощью шлейфа.

Задержка по округу не нарушает измерение между задержкой на выходе и задержкой на входе. Он измеряет только совокупный эффект этих двух факторов. Кроме того, в большинстве практических приложений не будет использоваться установка закольцовывания. Обычно цепочка обработки состоит из записи звука, его обработки и воспроизведения обработанного звука. Однако задержка должна быть одинаковой при условии, что другие факторы (размер кадра, частота дискретизации, задержка алгоритма) не изменяются.
Меньшие размеры кадра и более высокая частота дискретизации снижают задержку при циклическом переходе. Тем не менее, компромисс является более высоким шансом возникновения отсева (перерасход/недозачет).
В дополнение к потенциально увеличивающейся задержке, объем обработки, участвующий в звуковом алгоритме, также может вызвать отсев.
Функция audioLatencyMeasurateExampleApp вычисляет задержку округления в миллисекундах для данной установки. Также представлены перерасходы и недоделки. Если значения переполнения/недоделки не равны нулю, результаты могут оказаться недействительными. Например:
audioLatencyMeasurementExampleApp('SamplesPerFrame',64,'SampleRate',48e3) % The measurements in this example were done on macOS. For most % measurements, a Steinberg UR22 external USB device was used. For the % measurements with custom I/O channels, an RME Fireface UFX+ device was % used. This RME device has lower latency than the Steinberg device for a % given sample rate/frame size combination. Measurements on Windows using % ASIO drivers should result in similar values.
Trial(s) done for frameSize 64.
ans =
1×5 table
SamplesPerFrame SampleRate_kHz Latency_ms Overruns Underruns
_______________ ______________ __________ ________ _________
64 48 8.3125 0 0
Обработка в реальном времени в операционной системе общего назначения возможна только при минимизации других задач, выполняемых компьютером. Рекомендуется:
Закрыть все остальные программы
Убедитесь в отсутствии недозагрузок/перерасходов
Использовать достаточно большой размер буфера (SharingPerFrame) для обеспечения согласованного поведения без отсева
Убедитесь, что настройки оборудования (размер буфера, частота дискретизации) соответствуют входам измерения Задержка
В Windows можно использовать функцию asiosettings для запуска диалогового окна для управления настройками оборудования. На macOS следует запустить программу установки Audio MIDI.
При использовании ASIO (или CoreAudio с Mac OS) измерения задержки согласуются до тех пор, пока не произойдет отсев. Для небольших размеров буфера можно получить чистое измерение в одном экземпляре и отсев в следующем. Параметр Ntrials может использоваться для обеспечения согласованного поведения отсева при измерении задержки. Например, чтобы выполнить 3 измерения, используйте:
audioLatencyMeasurementExampleApp('SamplesPerFrame',96,... 'SampleRate',48e3,'Ntrials',3)
Trial(s) done for frameSize 96.
ans =
3×5 table
SamplesPerFrame SampleRate_kHz Latency_ms Overruns Underruns
_______________ ______________ __________ ________ _________
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) % Notice that for every sample increment in the buffer size, the additional % latency is 3*SamplesPerFrameIncrement/SampleRate (macOS only).
Trial(s) done for frameSize 64.
Trial(s) done for frameSize 96.
Trial(s) done for frameSize 128.
t =
3×5 table
SamplesPerFrame SampleRate_kHz Latency_ms Overruns Underruns
_______________ ______________ __________ ________ _________
64 48 8.3125 0 0
96 48 10.312 0 0
128 48 12.312 0 0
В частности, в предыдущем примере приращение равно
3*[128-96, 96-64]/48e3 % In addition, notice that the actual buffering latency is also determined % by 3*SamplesPerFrame/SampleRate. Subtracting this value from the measured % latency gives a measure of the latency introduced by the device (combined % effect of A/D conversion, D/A conversion, and drivers). The numbers above % indicate about 4.3125 ms latency due to device-specific factors. t.Latency_ms - 3*BufferSizes/48
ans =
0.0020 0.0020
ans =
4.3125
4.3125
4.3125
Измерения, выполненные до сих пор, предполагают, что канал # 1 используется как для входа, так и для выхода. Если устройство имеет кабель закольцовывания, подключенный к другим каналам, их можно указать с помощью опции «Каналы МНК» для параметра measureLatency. Это определяется как 2-элементный вектор, соответствующий используемому входному и выходному каналам (измерение всегда производится на моносигнале). Например, для RME Fireface UFX +:
audioLatencyMeasurementExampleApp('SamplesPerFrame',[32 64 96],... 'SampleRate',96e3,'Device','Fireface UFX+ (23767940)',... 'IOChannels',[1 3])
Trial(s) done for frameSize 32.
Trial(s) done for frameSize 64.
Trial(s) done for frameSize 96.
ans =
3×5 table
SamplesPerFrame SampleRate_kHz Latency_ms Overruns Underruns
_______________ ______________ __________ _________ __________
32 96 2.6458 0 32
64 96 3.6458 0 0
96 96 4.6458 0 0
Измерения до сих пор не включали задержку алгоритма. Следовательно, они представляют собой минимальную задержку циклического переключения, которая может быть достигнута для данного устройства, размера буфера и частоты дискретизации. Можно добавить линейный фазовый фильтр FIR в цепочку обработки, чтобы убедиться, что измерения задержки соответствуют ожидаемым. Кроме того, он обеспечивает способ проверки надежности обработки звука в реальном времени при данной рабочей нагрузке. Например,
L = 961; Fs = 48e3; audioLatencyMeasurementExampleApp('SamplesPerFrame',128,... 'SampleRate',Fs,'FilterLength',L,'Ntrials',3) % The latency introduced by the filter is given by the filter's % group-delay. GroupDelay = (L-1)/2/Fs % The group delay accounts for the 10 ms of additional latency when using a % 961-tap linear-phase FIR filter vs. the minimal achievable latency.
Trial(s) done for frameSize 128.
ans =
3×6 table
SamplesPerFrame SampleRate_kHz FilterLength Latency_ms Overruns Underruns
_______________ ______________ ____________ __________ ________ _________
128 48 961 22.312 0 0
128 48 961 22.312 0 0
128 48 961 22.312 0 0
GroupDelay =
0.0100
%The latency measurements are determined by cross-correlating a source %audio signal with a delayed version of the signal that results after %loopback through the audio device. You can use the Plot option in %measureLatency to plot the original and delayed signal along with the %cross correlation: audioLatencyMeasurementExampleApp('SamplesPerFrame',128,'Plot',true) % If the optional FIR filtering is used, the waveforms are not affected % because the filter used has a broader bandwidth than the test audio % signal.
Trial(s) done for frameSize 128.
Plotting...
ans =
1×5 table
SamplesPerFrame SampleRate_kHz Latency_ms Overruns Underruns
_______________ ______________ __________ ________ _________
128 48 12.312 0 0
