Ускоренный многофазный набор фильтров синтеза

Этот пример показывает, как использовать dspunfold, чтобы ускорить симуляцию многофазного набора фильтров БПФ синтеза путем генерации многопоточного файла MEX. Этот пример требует MATLAB Coder.

Многофазный набор фильтров синтеза

dspdemo.PolyphaseFFTMuxer реализует многофазный набор фильтров синтеза. Банк синтеза или muxer берут несколько узкополосной связи, образовывает канал и формируется, один широкополосный канал с узкополосной связью образовывает канал рядом.

Реализация состоит из многофазного КИХ-фильтра с определенным числом коэффициентов для каждой многофазной фазы (PolyphaseLength). Этот фильтр имеет длину состояния, равную PolyphaseLength. Фильтру предшествует обратный БПФ, который используется, чтобы модулировать фильтр к различным поддиапазонам частоты.

Основанная на MATLAB реализация

В этом примере используется фильтр с PolyphaseLength 48. Файл HelperPolyphaseSynthesisFilterBank запускает фильтрацию. Как пример, используются 64 канала, и формат кадра для каждого канала установлен в 256.

FrameLength = 256;
Nchan       = 64;

Фильтрация реализована путем записи кода MATLAB. Поскольку необходимо циклично выполниться по входным кадрам, реализация имеет тенденцию быть медленной по сравнению со сгенерированным кодом. ifft реализован со скомпилированным кодом, и поэтому ускорение не влияет на эту часть вычисления значительно. Как базовая линия, мы измеряемся, сколько времени она берет, чтобы обработать 250 кадров

Nframes = 250;
tic
for n = 1:Nframes
    x = complex(randn(FrameLength,Nchan),randn(FrameLength,Nchan));
    y = HelperPolyphaseSynthesisFilterBank(x);
end
toc
Elapsed time is 22.839157 seconds.

Генерация ускоренного однопоточного и многопоточного файла MEX

dspunfold может использоваться, чтобы сгенерировать и однопоточное и многопоточный файл MEX. Входной сигнал является кадром, длина состояния дана PolyphaseLength, и мы устанавливаем количество повторения на 10. Мы обеспечиваем количество потоков, используемых, чтобы быть 2 так, чтобы улучшения были видны на машинах по крайней мере с двумя ядрами. Это значение может быть увеличено на машинах с большим количеством ядер за счет более высокой задержки.

dspunfold HelperPolyphaseSynthesisFilterBank -args {x} -f true -s 48 -r 10 -t 2
State length: 48 samples, Repetition: 10, Output latency: 40 frames, Threads: 2
Analyzing: HelperPolyphaseSynthesisFilterBank.m
Creating single-threaded MEX file: HelperPolyphaseSynthesisFilterBank_st.mexmaci64
Creating multi-threaded MEX file: HelperPolyphaseSynthesisFilterBank_mt.mexmaci64
Creating analyzer file: HelperPolyphaseSynthesisFilterBank_analyzer.p

Сравнительное тестирование однопоточного файла MEX

Мы сначала тестируем сгенерированного однопоточного файла в сравнении с эталоном. Этот файл MEX эквивалентен MEX, который был бы сгенерирован с помощью функции codegen.

tic
for n = 1:Nframes
    x   = complex(randn(FrameLength,Nchan),randn(FrameLength,Nchan));
    yst = HelperPolyphaseSynthesisFilterBank_st(x);
end
toc
Elapsed time is 1.255142 seconds.

Сравнительное тестирование многопоточного файла MEX

Затем мы тестируем сгенерированного многопоточного файла в сравнении с эталоном. Поскольку ускорение влияет в основном на фильтрацию а не обратный БПФ, улучшение не прямо пропорционально к количеству ядер, которые может иметь рабочий стол. Тем не менее, улучшение по крайней мере 60% видно в большинстве случаев. Обратите внимание на то, что в порядке сделать справедливое сравнение, мы добавляем 40 кадров в многопоточном случае из-за задержки, введенной путем разворачивания.

tic
for n = 1:Nframes+40
    x   = complex(randn(FrameLength,Nchan),randn(FrameLength,Nchan));
    ymt = HelperPolyphaseSynthesisFilterBank_mt(x);
end
toc
Elapsed time is 0.709653 seconds.