Измерение эффективности потоковых аудио алгоритмов в реальном времени

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

Введение

Возможность прототипа алгоритма обработки аудиосигнала в режиме реального времени с помощью MATLAB зависит в первую очередь от его эффективности выполнения. Эффективность зависит от ряда факторов, таких как сложность алгоритма, частота дискретизации и размер входного кадра. В конечном счете алгоритм должен быть достаточно быстрым, чтобы убедиться, что он всегда может выполняться в пределах доступного бюджета времени и не сбрасывать какие-либо системы координат. Системы координат отбрасываются всякий раз, когда входная очередь аудио переполнена новыми выборками (недостаточно быстро считываются) или очередь аудио выходов переполнена (недостаточно быстро записывается). Потеря пакетов результата в нежелательных программных продуктах в выход аудиосигнале.

Этот пример представляет утилиту для профилирования эффективности выполнения алгоритма обработки аудиосигнала в MATLAB и сравнения его с доступным бюджетом времени.

Результаты в этом примере были получены на компьютере с процессором Intel (R) Xeon (R) с тактовой частотой 3,50 ГГц и 64 ГБ оперативной памяти. Результаты варьируются в зависимости от спецификаций системы.

Измерение эффективности приложения узкополосного фильтра

В этом примере вы измеряете эффективность узкополосного фильтра восьмого порядка, реализованного с помощью dsp.BiquadFilter.

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

audioexample.AudioLoopTimer является объектом утилиты, используемым для профилирования эффективности выполнения и отображения сводных данных результатов. Утилита использует простые команды tic/toc, чтобы логгировать синхронизацию различных этапов симуляции. Время инициализации (которое является временем, которое требуется для создания экземпляров и настройки переменных и объектов до начала цикла симуляции) измеряется с помощью ticInit и tocInit методы. Индивидуальное время цикла симуляции измеряется с помощью ticLoop и tocLoop методы. После завершения цикла симуляции создается отчет о эффективности с использованием generateReport объекта способ.

Выполните helperAudioLoopTimerExample чтобы запустить симуляцию и просмотреть отчет о эффективности:

helperAudioLoopTimerExample;

Рисунок отчета о эффективности отображает гистограмму времен выполнения цикла на верхнем графике. Красная линия представляет максимально допустимое время выполнения цикла или бюджет, выше которого будут сброшены выборки. Бюджет на цикл симуляции равен L/Fs, где L - размер входного кадра, а Fs - частота дискретизации. В этом примере L = 512, Fs = 44100 Гц, и бюджет на цикл составляет около 11,6 миллисекунд. Отчет о эффективности также отображает время выполнения отдельных циклов симуляции на нижнем графике. Снова, красная линия представляет допустимый бюджет по циклу.

Заметьте, что, хотя медианное время цикла хорошо в пределах бюджета, максимальное время цикла превышает бюджет. Из нижнего графика видно, что бюджет превышен на самом первом проходе цикла, и что последующие циклы находятся в пределах бюджета. Относительная медленная эффективность первого цикла симуляции обусловлена штрафом, понесенным при первом вызове метода шага на dsp.BiquadFilter и dsp.AudioFileReader объекты. Первый вызов в step запускает выполнение одноразовых задач, которые не зависят от входов на шаг, таких как выделение аппаратных ресурсов и инициализация состояния. Эта проблема может быть устранена путем выполнения одноразовых задач перед циклом симуляции. Вы можете выполнить разовые задачи, вызвав setup метод по объектам симуляции на этапе инициализации. Выполните helperAudioLoopTimerExample(true) чтобы повторно запустить симуляцию с включенной настройкой предварительного цикла.

helperAudioLoopTimerExample(true);

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