dspunfoldЗапустите входную функцию MATLAB ® с вводами, которые необходимо проверить. Убедитесь, что функция не содержит ошибок во время выполнения. Звонитьcodegen и убедитесь, что он успешно генерирует файл MEX.
Создание многопоточного MEX-файла с помощью dspunfold. Укажите длину состояния с помощью -s вариант. Длина состояния должна быть, по крайней мере, той же самой длины, что и алгоритм в функции MATLAB. По умолчанию -s имеет значение 0, указывая, что алгоритм не имеет состояния.
Запустите созданную функцию анализатора. Используйте pass флаг для проверки соответствия результатов вывода многопоточного файла MEX и однопоточного файла MEX. Кроме того, проверьте, удовлетворительны ли скорость и задержка, отображаемые функцией анализатора.
Если выходные результаты не совпадают, увеличьте длину состояния и снова создайте многопоточный MEX-файл. Либо используйте автоматическое определение длины состояния (указанное с помощью -s auto) для определения минимальной длины состояния, соответствующей выходам.
Если выходные результаты совпадают, но скорость и задержка неудовлетворительны, увеличьте коэффициент повторения, используя -r или увеличить число потоков с помощью -t. Кроме того, можно настроить длину состояния. Отрегулируйте dspunfold и создавать новые многопоточные MEX-файлы до тех пор, пока вы не будете удовлетворены результатами..
Рекомендации по созданию многопоточного MEX-файла с использованием dspunfold, см. раздел «Советы» dspunfold.
Выполнение функции MATLAB точки входа
Создайте функцию MATLAB точки входа.
function [y,mse] = AdaptiveFilter(x,noise) persistent rlsf1 ffilt noise_var if isempty (rlsf1) rlsf1 = dsp.RLSFilter(32, 'ForgettingFactor', 0.98); ffilt = dsp.FIRFilter('Numerator',fir1(32, .25)); % Unknown System noise_var = 1e-4; end d = ffilt(x) + noise_var * noise; % desired signal [y,e] = rlsf1(x, d); mse = 10*log10(sum(e.^2)); end
Функция моделирует фильтр RLS, который фильтрует входной сигнал x, использование d в качестве требуемого сигнала. Функция возвращает отфильтрованные выходные данные в y и ошибка фильтра в e.
Управляемый AdaptiveFilter с вводами, которые требуется проверить. Убедитесь, что функция работает без ошибок.
AdaptiveFilter(randn(1000,1), randn(1000,1));
Звонить codegen на AdaptiveFilter и создайте файл MEX.
codegen AdaptiveFilter -args {randn(1000,1), randn(1000,1)}
Создание многопоточного MEX-файла с помощью dspunfold
Задайте длину состояния как 32 выборки и коэффициент повторения 1. Укажите длину состояния, которая больше или равна длине алгоритма в функции MATLAB. Когда хотя бы одна запись frameinputs имеет значение true, в образцах учитывается длина состояния.
dspunfold AdaptiveFilter -args {randn(1000,1), randn(1000,1)} -s 32 -f true
Analyzing input MATLAB function AdaptiveFilter Creating single-threaded MEX file AdaptiveFilter_st.mexw64 Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64 Creating analyzer file AdaptiveFilter_analyzer
Выполнение сгенерированной функции анализатора
Анализатор учитывает фактические значения входного сигнала. Чтобы повысить эффективность анализатора, предоставьте по крайней мере два различных кадра вдоль первого размера входных сигналов.
AdaptiveFilter_analyzer(randn(1000*4,1),randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64 ...
Latency = 8 frames
Speedup = 3.5x
Warning: The output results of the multi-threaded MEX file AdaptiveFilter_mt.mexw64 do not match
the output results of the single-threaded MEX file AdaptiveFilter_st.mexw64. Check that you
provided the correct state length value to the dspunfold function when you generated the
multi-threaded MEX file AdaptiveFilter_mt.mexw64. For best practices and possible solutions to
this problem, see the 'Tips' section in the dspunfold function reference page.
> In coder.internal.warning (line 8)
In AdaptiveFilter_analyzer
ans =
Latency: 8
Speedup: 3.4686
Pass: 0Увеличение длины состояния
Анализатор не прошел проверку. Отображаемое предупреждающее сообщение указывает, что неверное значение длины состояния предоставлено dspunfold функция. Увеличить длину состояния до 1000 и повторите процесс из предыдущего раздела.
dspunfold AdaptiveFilter -args {randn(1000,1),randn(1000,1)} -s 1000 -f true
Analyzing input MATLAB function AdaptiveFilter Creating single-threaded MEX file AdaptiveFilter_st.mexw64 Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64 Creating analyzer file AdaptiveFilter_analyzer
Запустите созданный анализатор.
AdaptiveFilter_analyzer(randn(1000*4,1),randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64 ...
Latency = 8 frames
Speedup = 1.8x
ans =
Latency: 8
Speedup: 1.7778
Pass: 1Анализатор прошел проверку. Рекомендуется указать различные цифры для функции анализатора и убедиться, что функция анализатора проходит.
Повышение быстродействия и корректировка задержек
Если вы хотите увеличить скорость и ваша система может позволить себе большую задержку, увеличьте коэффициент повторения до 2.
dspunfold AdaptiveFilter -args {randn(1000,1),randn(1000,1)} -s 1000 -r 2 -f true
Analyzing input MATLAB function AdaptiveFilter Creating single-threaded MEX file AdaptiveFilter_st.mexw64 Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64 Creating analyzer file AdaptiveFilter_analyzer
Запустите анализатор.
AdaptiveFilter_analyzer(randn(1000*4,1), randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64 ...
Latency = 16 frames
Speedup = 2.4x
ans =
Latency: 16
Speedup: 2.3674
Pass: 1
Повторяйте процесс до достижения удовлетворительного ускорения и задержки.
Использовать автоматическое определение длины состояния
Выберите длину состояния, которая больше или равна длине состояния алгоритма. Если определить длину состояния для алгоритма аналитически непросто, используйте инструмент автоматического определения длины состояния. Вызвать автоматическое определение длины состояния с помощью параметра -s кому auto. Инструмент определяет минимальную длину состояния, с которой анализатор проходит проверку.
dspunfold AdaptiveFilter -args {randn(1000,1),randn(1000,1)} -s auto -f true
Analyzing input MATLAB function AdaptiveFilter Creating single-threaded MEX file AdaptiveFilter_st.mexw64 Searching for minimal state length (this might take a while) Checking stateless ... Insufficient Checking 1000 ... Sufficient Checking 500 ... Insufficient Checking 750 ... Insufficient Checking 875 ... Sufficient Checking 812 ... Insufficient Checking 843 ... Sufficient Checking 827 ... Insufficient Checking 835 ... Insufficient Checking 839 ... Sufficient Checking 837 ... Sufficient Checking 836 ... Sufficient Minimal state length is 836 Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64 Creating analyzer file AdaptiveFilter_analyzer
Минимальная длина состояния - 836 образцы.
Запустите созданный анализатор.
AdaptiveFilter_analyzer(randn(1000*4,1), randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64 ...
Latency = 8 frames
Speedup = 1.9x
ans =
Latency: 8
Speedup: 1.9137
Pass: 1Анализатор прошел проверку.