Этот пример показывает, как использовать dspunfold
, чтобы ускорить симуляцию многофазного набора фильтров БПФ синтеза путем генерации многопоточного файла MEX. Этот пример требует MATLAB Coder.
dspdemo.PolyphaseFFTMuxer
реализует многофазный набор фильтров синтеза. Банк синтеза или muxer берут несколько узкополосной связи, образовывает канал и формируется, один широкополосный канал с узкополосной связью образовывает канал рядом.
Реализация состоит из многофазного КИХ-фильтра с определенным числом коэффициентов для каждой многофазной фазы (PolyphaseLength
). Этот фильтр имеет длину состояния, равную PolyphaseLength
. Фильтру предшествует обратный БПФ, который используется, чтобы модулировать фильтр к различным поддиапазонам частоты.
В этом примере используется фильтр с 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.
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, который был бы сгенерирован с помощью функции 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.
Затем мы тестируем сгенерированного многопоточного файла в сравнении с эталоном. Поскольку ускорение влияет в основном на фильтрацию а не обратный БПФ, улучшение не прямо пропорционально к количеству ядер, которые может иметь рабочий стол. Тем не менее, улучшение по крайней мере 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.