В этом примере показано, как использовать 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.