主要内容

信号处理算法加速MATLAB

请注意

本例中的基准一直在衡量一台机器与四个物理核心。

这个例子展示了如何加速MATLAB信号处理算法®使用codegen(MATLAB编码器)dspunfold功能。你可以生成一个MATLAB可执行(墨西哥人函数)整个MATLAB函数或特定地区的MATLAB函数。当您运行这个墨西哥人函数代替原始的MATLAB代码,模拟速度可以显著增加。生成相当于墨西哥人,该算法必须支持代码生成。万博1manbetx

使用codegen(MATLAB编码器),你必须有MATLAB编码器™安装。使用dspunfold,你必须有MATLAB编码器和DSP系统工具箱™安装。

使用dspunfold在Windows和Linux,您必须使用一个编译器,它支持开放的多处理(OpenMP)应用程序接口。万博1manbetx看到万博1manbetx支持编译器

冷杉滤波算法

考虑一个简单的冷杉滤波算法来加速。复制firfilter函数代码firfilter.m文件。

函数[y, z1] = firfilter (b, x)%的输入:% b - 1 xntaps行向量的系数% x -噪声输入的帧%:% z, z1 NTapsx1列向量的状态%输出:% y -帧过滤输出持续的z;如果(isempty (z)) z = 0(长度(b), 1);结束Lx =大小(x, 1);y = 0(大小(x),“喜欢”,x);z1 = z;m = 1: Lx%加载下一个输入样本z1 (: 1) = x (m:);%计算输出y (m:) = b * z1;%更新状态z1 (2:,:) = z1 (1: end-1,:);z = z1;结束

firfilter函数接受一个矢量滤波器系数,b嘈杂的输入信号,x,作为输入。生成滤波器系数使用fir1函数。

NTaps = 250;Fp = 4 e3 / (44.1 e3/2);b = fir1 (NTaps-1、Fp);

过滤器的流噪声利用正弦波信号firfilter函数。正弦波的外框尺寸为4000样本和192 kHz的采样率。生成正弦波使用dsp.SineWave系统对象™。是一个高斯白噪声均值为0,方差为0.02。这个函数的名字firfilter_sim。的firfilter_sim函数调用的firfilter函数的输入。

函数totVal = firfilter_sim (b)%创建信号源Sig = dsp.SineWave (“SamplesPerFrame”,4000,“SampleRate”,19200);totVal = 0 (4000、500);R = 0.02;清晰的firfilter;%的迭代循环。每个迭代过滤器框架的噪声信号。i = 1: 500 trueVal = Sig ();%原正弦波noisyVal = trueVal + sqrt (R) * randn;%的正弦波filteredVal = firfilter (b, noisyVal);%过滤正弦波totVal (:, i) = filteredVal;%存储完整的正弦波结束

运行firfilter_sim和测量的速度执行。在你的机器上执行的速度而异。

抽搐;totVal = firfilter_sim (b); t1 = toc;流(“原始算法仿真时间:% 4.1 f秒\ n ',t1);
原始算法仿真时间:7.8秒

加快冷杉过滤器使用codegen

调用codegenfirfilter,并生成其相当于墨西哥人,firfilter_mex。生成并通过滤波器系数和正弦波信号作为输入firfilter函数。

Ntaps = 250;Sig = dsp.SineWave (“SamplesPerFrame”,4000,“SampleRate”,19200);%创建信号源R = 0.02;trueVal = Sig ();%原正弦波noisyVal = trueVal + sqrt (R) * randn;%的正弦波Fp = 4 e3 / (44.1 e3/2);b = fir1 (Ntaps-1、Fp);%滤波器系数codegenfirfilterarg游戏{b, noisyVal}

firfilter_sim函数,取代noisyVal firfilter (b)函数调用,noisyVal firfilter_mex (b)。这个函数的名字firfilter_codegen

函数totVal = firfilter_codegen (b)%创建信号源Sig = dsp.SineWave (“SamplesPerFrame”,4000,“SampleRate”,19200);totVal = 0 (4000、500);R = 0.02;清晰的firfilter_mex;%的迭代循环。每个迭代过滤器框架的噪声信号。i = 1: 500 trueVal = Sig ();%原正弦波noisyVal = trueVal + sqrt (R) * randn;%的正弦波filteredVal = firfilter_mex (b, noisyVal);%过滤正弦波totVal (:, i) = filteredVal;%存储完整的正弦波结束

运行firfilter_codegen和测量的速度执行。在你的机器上执行的速度而异。

抽搐;totValcodegen = firfilter_codegen (b); t2 = toc;流(算法仿真时间与codegen: % 5 f秒\ n ',t2);流(的加速因子codegen: % 5 f \ n”(t1 / t2));
与codegen算法仿真时间:0.923683秒加速因子codegen: 8.5531

加速获得大约是8.5

加快冷杉过滤器使用dspunfold

dspunfold函数生成一个多线程的墨西哥人文件可进一步提高加速增长。

dspunfold还生成一个单线程的墨西哥人文件和自我诊断分析仪的功能。利用多线程墨西哥人文件的多核CPU架构主机电脑。单线程的墨西哥人文件类似于墨西哥人的文件的codegen函数生成。分析仪功能的措施加速获得的多线程的墨西哥人在单线程的墨西哥人文件。

调用dspunfoldfirfilter并生成其多线程相当于墨西哥人,firfilter_mt。检测样品通过使用中的状态长度- f选项,该选项可以提高加速进一步增加。- s汽车长度检测触发自动状态。有关使用的更多信息- f- s选项,请参阅dspunfold

dspunfoldfirfilterarg游戏{b, noisyVal}- s汽车- f(假,真的)
状态长度:自动检测样品,重复:1,输出延迟:8帧,线程:4分析:firfilter。m创建线程的墨西哥人文件:firfilter_st。mexw64寻找最小状态长度(这可能需要一段时间)检查无状态……检查4000个样本不足……充分检查2000个样本…充分检查1000个样本…充分检查500个样本…充分检查250个样本…充分检查125个样本…检查187个样本不足……检查218个样本不足…… Insufficient Checking 234 samples ... Insufficient Checking 242 samples ... Insufficient Checking 246 samples ... Insufficient Checking 248 samples ... Insufficient Checking 249 samples ... Sufficient Minimal state length is 249 samples Creating multi-threaded MEX file: firfilter_mt.mexw64 Creating analyzer file: firfilter_analyzer.p

自动状态长度检测工具检测到一个确切的长度259年样本。

调用分析器函数和测量多线程加速获得的墨西哥人文件的单线程的墨西哥人文件。至少提供两种不同的帧的每个输入参数分析仪。帧是附加在第一维度。分析器这些帧之间的交替而验证输出匹配。未能提供多个帧对每个输入可以减少分析的有效性,并可能导致假阳性的验证结果。

firfilter_analyzer ([b; b 0.5 * 0.6 * b], [noisyVal; 0.5 * noisyVal; 0.6 * noisyVal]);
分析多线程文件firfilter_mt.mexw64墨西哥人。为达到最佳效果,请避免与计算机进行交互并停止其他进程,直到分析仪。加速延迟= 8帧= 3.2 x

firfilter_mt有一个加速增益系数的3.2单线程的墨西哥人文件相比,firfilter_st。进一步提高加速,增加重复因子使用- r选择。是输出延迟增加的权衡。使用重复的因素3。指定的确切状态长度减少开销,提高进一步加速。

dspunfoldfirfilterarg游戏{b, noisyVal}- s249年- f(假,真的)- r3
长度:249样本,重复:3,输出延迟:24帧,线程:4分析:firfilter。m创建线程的墨西哥人文件:firfilter_st。mexw64创建多线程的墨西哥人文件:firfilter_mt。mexw64创建分析器文件:firfilter_analyzer.p

调用分析器的功能。

firfilter_analyzer ([b; b 0.5 * 0.6 * b], [noisyVal; 0.5 * noisyVal; 0.6 * noisyVal]);
分析多线程文件firfilter_mt.mexw64墨西哥人。为达到最佳效果,请避免与计算机进行交互并停止其他进程,直到分析仪。延迟= 24帧加速= 3.8 x

加速增益系数3.8,或者大约32倍的速度执行最初的模拟。

对于这个特殊的算法,可以看到dspunfold产生一个高度优化的代码,而无需编写任何C或c++代码。加速获得尺度与核的数量在你的主机。

冷杉过滤器函数在本例中只有一个说明性的算法,很容易理解。您可以应用该工作流的定制算法。如果你想使用一个冷杉过滤器,建议您使用dsp.FIRFilter系统在DSP系统工具箱对象。这个对象运行速度远远超过基准数字呈现在这个例子中,而不需要代码生成。

卡尔曼滤波算法

考虑一个卡尔曼滤波器算法,估计从嘈杂的输入正弦波信号。这个例子展示了卡尔曼滤波器的性能codegendspunfold

吵闹的正弦波输入帧尺寸4000样品和192 kHz的采样率。噪声是高斯白均值为0,方差为0.02。

这个函数filterNoisySignal调用kalmanfilter函数的输入。

类型filterNoisySignal
功能totVal = filterNoisySignal %创建信号源团体= dsp.SineWave (“SampleRate”“SamplesPerFrame”, 4000年,19200年);totVal = 0 (4000、500);R = 0.02;清楚kalmanfilter;%的迭代循环估计正弦波信号i = 1: 500 trueVal = Sig ();%实际值noisyVal = trueVal + sqrt (R) * randn;%噪声测量estVal = kalmanfilter (noisyVal);%正弦波通过卡尔曼滤波器估计totVal (:, i) = estVal;%存储整个正弦波
类型kalmanfilter
函数[estVal estState] = kalmanfilter (noisyVal) %这个函数使用卡尔曼滤波跟踪一个嘈杂的正弦信号信号% %状态转移矩阵a = 1;stateSpaceDim =大小(1);%测量矩阵H = 1;measurementSpaceDim =大小(H, 1);numTsteps = (noisyVal 1) / measurementSpaceDim大小;%的容器来存储预测和估计时间所有步骤zEstContainer = noisyVal;xEstContainer = 0(大小(noisyVal));Q = 0.0001;%过程噪声协方差R = 0.02;%测量噪声协方差持续性xhat P xPrior发生; % Local copies of discrete states if isempty(xhat) xhat = 5; % Initial state estimate end if isempty(P) P = 1; % Error covariance estimate end if isempty(xPrior) xPrior = 0; end if isempty(PPrior) PPrior = 0; end % Loop over all time steps for n=1:numTsteps % Gather chunks for current time step zRowIndexChunk = (n-1)*measurementSpaceDim + (1:measurementSpaceDim); stateEstsRowIndexChunk = (n-1)*stateSpaceDim + (1:stateSpaceDim); % Prediction step xPrior = A * xhat; PPrior = A * P * A' + Q; % Correction step. Compute Kalman gain. PpriorH = PPrior * H'; HPpriorHR = H * PpriorH + R; KalmanGain = (HPpriorHR \ PpriorH')'; KH = KalmanGain * H; % States and error covariance are updated in the % correction step xhat = xPrior + KalmanGain * noisyVal(zRowIndexChunk,:) - ... KH * xPrior; P = PPrior - KH * PPrior; % Append estimates xEstContainer(stateEstsRowIndexChunk, :) = xhat; zEstContainer(zRowIndexChunk,:) = H*xhat; end % Populate the outputs estVal = zEstContainer; estState = xEstContainer; end

运行filterNoisySignal.m和测量的速度执行。

抽搐,totVal = filterNoisySignal; t1 = toc;流(“原始算法仿真时间:% 4.1 f秒\ n ',t1);
原始算法仿真时间:21.7秒

加快卡尔曼滤波器使用codegen

调用codegen函数kalmanfilter,并生成其相当于墨西哥人,kalmanfilter_mex

kalmanfilter函数需要吵闹的正弦波作为输入。

Sig = dsp.SineWave (“SamplesPerFrame”,4000,“SampleRate”,19200);%创建信号源R = 0.02;%测量噪声协方差trueVal =步骤(团体);%实际值noisyVal = trueVal + sqrt (R) * randn;%噪声测量codegenarg游戏{noisyVal}kalmanfilter.m

取代kalmanfilter (noisyVal)filterNoisySignal函数与kalmanfilter_mex (noisyVal)。这个函数的名字为filterNoisySignal_codegen

函数totVal = filterNoisySignal_codegen%创建信号源Sig = dsp.SineWave (“SamplesPerFrame”,4000,“SampleRate”,19200);totVal = 0 (4000、500);R = 0.02;清晰的kalmanfilter_mex;%的迭代循环估计正弦波信号i = 1: 500 trueVal = Sig ();%实际值noisyVal = trueVal + sqrt (R) * randn;%噪声测量estVal = kalmanfilter_mex (noisyVal);%正弦波通过卡尔曼滤波估计totVal (:, i) = estVal;%存储完整的正弦波结束

运行filterNoisySignal_codegen和测量的速度执行。

抽搐;totValcodegen = filterNoisySignal_codegen;t2 = toc;流(算法仿真时间与codegen: % 5 f秒\ n ',t2);流(“加速codegen % 0.1 f '、t1 / t2);
算法仿真时间与codegen: 0.095480秒加速codegen是227.0

卡尔曼滤波算法实现了几种矩阵乘法。codegen使用线性代数的基本子程序(bla)库来执行这些乘法。这些库生成一个高度优化的代码,因此加速增加了227。

加快卡尔曼滤波器使用dspunfold

生成一个文件使用多线程的墨西哥人dspunfold并比较其性能codegen

Sig = dsp.SineWave (“SamplesPerFrame”,4000,“SampleRate”,19200);%创建信号源R = 0.02;%测量噪声协方差trueVal =步骤(团体);%实际值noisyVal = trueVal + sqrt (R) * randn;%噪声测量dspunfoldkalmanfilterarg游戏{noisyVal}- s汽车
长度:状态(自动侦测)框架,重复:1,输出延迟:8帧,线程:4分析:kalmanfilter。m创建线程的墨西哥人文件:kalmanfilter_st。mexw64寻找最小状态长度(这可能需要一段时间)检查无状态……检查不足1帧…足够的最小状态长度是1帧创建多线程的墨西哥人文件:kalmanfilter_mt。mexw64创建分析器文件:kalmanfilter_analyzer.p

调用分析器的功能。

kalmanfilter_analyzer ([noisyVal; 0.01 * noisyVal; 0.05 * noisyVal; 0.1 * noisyVal]);
分析多线程文件kalmanfilter_mt.mexw64墨西哥人。为达到最佳效果,请避免与计算机进行交互并停止其他进程,直到分析仪。加速延迟= 8帧= 0.7 x

kalmanfilter_mt有一个加速因子0.7,这是一个性能损失30%单线程的墨西哥人文件相比,kalmanfilter_st。增加重复的因素3是否增加性能。同时,检测样品中状态的长度。

dspunfoldkalmanfilterarg游戏{noisyVal}- s汽车- f真正的- r3
状态长度:自动检测样品,重复:3、输出延时:24帧,线程:4分析:kalmanfilter。m创建线程的墨西哥人文件:kalmanfilter_st。mexw64寻找最小状态长度(这可能需要一段时间)检查无状态……检查4000个样本不足……充分检查2000个样本…充分检查1000个样本…充分检查500个样本…充分检查250个样本…检查375个样本不足……充分检查312个样本…充分检查281个样本… Sufficient Checking 265 samples ... Sufficient Checking 257 samples ... Insufficient Checking 261 samples ... Sufficient Checking 259 samples ... Sufficient Checking 258 samples ... Insufficient Minimal state length is 259 samples Creating multi-threaded MEX file: kalmanfilter_mt.mexw64 Creating analyzer file: kalmanfilter_analyzer.p

调用分析器的功能。

kalmanfilter_analyzer ([noisyVal; 0.01 * noisyVal; 0.05 * noisyVal; 0.1 * noisyVal]);
分析多线程文件kalmanfilter_mt.mexw64墨西哥人。为达到最佳效果,请避免与计算机进行交互并停止其他进程,直到分析仪。延迟= 24帧加速= 1.4 x

dspunfold给出了加速增长40%相比,高度优化的单线程的墨西哥人文件。指定的长度和增加重复的因素4

dspunfoldkalmanfilterarg游戏{noisyVal}- s259年- f真正的- r4
长度:259样本,重复:4,输出延迟:32帧,线程:4分析:kalmanfilter。m创建线程的墨西哥人文件:kalmanfilter_st。mexw64创建多线程的墨西哥人文件:kalmanfilter_mt。mexw64创建分析器文件:kalmanfilter_analyzer.p

调用分析器功能加速增益。

kalmanfilter_analyzer ([noisyVal; 0.01 * noisyVal; 0.05 * noisyVal; 0.1 * noisyVal]);
分析多线程文件kalmanfilter_mt.mexw64墨西哥人。为达到最佳效果,请避免与计算机进行交互并停止其他进程,直到分析仪。延迟= 32帧加速= 1.5 x

加速增益系数50%相比单线程的墨西哥人文件。

性能的因素codegendspunfold取决于你的算法。codegen为一些MATLAB结构提供足够的加速度。dspunfold可以使用内核提供额外的性能提升提供在您的机器上通过展开分发算法。如这个例子所示,加速的数量dspunfold提供取决于特定的算法来加速。使用dspunfold除了codegen如果你通过展开算法非常适合分发,如果由此产生的延迟成本符合应用程序的约束。

一些MATLAB构造与MATLAB高度优化的解释执行。的fft功能,例如,在解释模拟经营快得多,而不是代码生成。

相关的话题