exponenta event banner

Измерение задержки звука

В этом примере показано, как измерить задержку звукового устройства. В примере используется audioLatencyMeasurateExampleApp, который, в свою очередь, использует AudioStartRecorder вместе с тестовым сигналом и перекрестной корреляцией для определения задержки. Во избежание помех доступа к диску тестовый сигнал загружается в dsp. Сначала объект AsyncBuffer, и кадры передаются из этого объекта через аудиоустройство.

Введение

В общих чертах задержка определяется как время с момента поступления звукового сигнала в систему до его выхода. В цепочке обработки цифрового звука существует несколько параметров, вызывающих задержку:

  1. Аппаратные средства (включая преобразование A/D и D/A)

  2. Аудио драйверы, которые взаимодействуют со звуковой картой системы

  3. Частота отбора проб

  4. Выборки на кадр (размер буфера)

  5. Алгоритмическая задержка (например, задержка, вызванная фильтром или звуковым эффектом)

В этом примере показано, как измерить задержку в обоих направлениях. То есть задержка, возникающая при воспроизведении звука через устройство, закольцовывании звука с помощью физического кабеля закольцовывания и записи звука закольцовывания с помощью того же звукового устройства. Чтобы вычислить задержку для собственного аудиоустройства, необходимо подключить аудиовыход и звук в портах с помощью шлейфа.

Задержка по округу не нарушает измерение между задержкой на выходе и задержкой на входе. Он измеряет только совокупный эффект этих двух факторов. Кроме того, в большинстве практических приложений не будет использоваться установка закольцовывания. Обычно цепочка обработки состоит из записи звука, его обработки и воспроизведения обработанного звука. Однако задержка должна быть одинаковой при условии, что другие факторы (размер кадра, частота дискретизации, задержка алгоритма) не изменяются.

Задержка аппаратного обеспечения

Меньшие размеры кадра и более высокая частота дискретизации снижают задержку при циклическом переходе. Тем не менее, компромисс является более высоким шансом возникновения отсева (перерасход/недозачет).

В дополнение к потенциально увеличивающейся задержке, объем обработки, участвующий в звуковом алгоритме, также может вызвать отсев.

Измерение задержки с помощью audioLatencyMeasureExampleApp.m

Функция 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        

Некоторые советы при измерении задержки

Обработка в реальном времени в операционной системе общего назначения возможна только при минимизации других задач, выполняемых компьютером. Рекомендуется:

  1. Закрыть все остальные программы

  2. Убедитесь в отсутствии недозагрузок/перерасходов

  3. Использовать достаточно большой размер буфера (SharingPerFrame) для обеспечения согласованного поведения без отсева

  4. Убедитесь, что настройки оборудования (размер буфера, частота дискретизации) соответствуют входам измерения Задержка

В 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