实现硬件,高效的QR分解的一个脉动阵列使用CORDIC

这个例子展示了如何在Simulink®中使用硬件高效的MATLAB®代码计算矩阵的QR分解。万博1manbetx

要求解方程组或使用Q R分解计算矩阵方程AX=B的最小二乘解,请计算R和Q'B,其中QR=a,RX=Q'B。R是上三角矩阵,Q是正交矩阵。如果你只想要Q和R,那么把B设为恒等矩阵。

在这个例子中,R是从矩阵A通过使用CORDIC算法施加Givens变换计算的。C = Q'B从矩阵B通过应用相同的Givens变换计算的。该算法使用迭代仅移位和加法来执行这些计算。

有关此示例中使用的算法的详细信息,请参见执行QR分解利用CORDIC

概述

本例中使万博1manbetx用的Simulink模型是:

fxpdemo_real_4x4_systolic_array_QR_模型

要输入自己的输入矩阵A和B,请打开左侧相应启用子系统块的块参数。仿真后,模型将计算出的输出矩阵C=Q'B和R返回到工作空间。可以在Q'B,R 4x4实CORDIC脉动阵列子系统的块参数中指定CORDIC迭代次数。如果输入是固定点,则CORDIC迭代次数必须小于单词长度。计算的准确性提高了每次迭代一位,直到输入的字长。

这种模式将与定点,双,单数据类型的工作。

要了解的算法进行分解,一脸Q'B的面具下,R 4×4真正的CORDIC脉动阵列子系统。注释指示正被上为零时的子对角线元素操作的矩阵的行。的脉动阵列被设置用于一个4乘4矩阵A,但可以通过下面的相同的图案扩展到任意大小。此实现只有真正的输入矩阵的工作原理。

要在使用CORDIC执行Givens转换的MATLAB函数块中查看MATLAB代码,请继续查看块掩码下的内容。

在本例中,A的行数和列数必须为4。矩阵B必须有4行和任意数量的列。

使用QR求解矩阵方程Ax = b的

在求解矩阵方程AX第一步= B是计算RX = Q'B,其中R是上三角,Q是正交的,并且Q * R = A.

下列输入是双精度浮点类型,所以设置的迭代次数是52,它是位的双倍尾数数。

格式NumberOfCORDICIterations = 52;A = 2 *兰特(4,4)-1;B = 2 *兰特(4,4)-1;

模拟模型来计算R和C = Q'B。

sim卡fxpdemo_real_4x4_systolic_array_QR_模型R C
R = 1.5149 -0.0519 1.7292 -0.3224 0 0.9593 -0.0259 -0.0879 0 0 0.2565 1.0888 0 0 0 -0.6429 C = 0.5942 -0.2382 0.0676 -0.9370 -0.8887 0.6146 -0.5758 0.3051 0.1725 0.7339 0.5409 0.5374 0.8540 1.1078 -0.2183 -0.5620

验证用R和C=Q'B进行反代换得到的结果与MATLAB相同。

X = R \ C X_should_be = A \ B
X = -7.1245 -12.1131 -0.6637 1.4236 -0.8779 0.7572 -0.5511 0.3545 6.3113 10.1759 0.6673 -1.6155 -1.3283 -1.7231 0.3396 0.8741 X_should_be = -7.1245 -12.1131 -0.6637 1.4236 -0.8779 0.7572 -0.5511 0.3545 6.3113 10.1759 0.6673 -1.6155 -1.3283 -1.72310.3396 0.8741

内置MATLAB和CORDIC QR解决方案应该是小的区别的标准。

规范(应该是X-X)
ANS = 3.6171e-14

计算Q和R

若要计算Q和R,请将B设为等于单位矩阵。当B等于恒等式矩阵时,Q=C’。

NumberOfCORDICIterations = 52;A = 2 *兰特(4,4)-1;B =眼(尺寸(A,1),'喜欢',A);模拟fxpdemo_real_4x4_systolic_array_QR_模型Q = C';

理论上的QR分解是QR==A,所以计算出的QR和A之间的差别应该很小。

范数(Q*R-A)
ans=2.2861e-15

QR不是唯一的

Q R分解是唯一的,直到R行和Q列的符号为止。你可以通过使R的对角线元素都是正的来进行唯一的QR分解。

d = DIAG(符号(DIAG(R)));Qunique = Q * d与runique = d * R
Qunique = -0.3086 0.1224 -0.1033 -0.9376 -0.6277 -0.7636 -0.0952 0.1174 -0.5573 0.3930 0.7146 0.1559 0.4474 -0.4975 0.6852 -0.2877与runique = 1.4459 -0.8090 0.1547 0.3977 0 1.1441 0.0809 -0.2494 0 0 0.8193 0.1894 0 0 0 0.4836

然后你可以从模型到内置MATLAB QR功能比较计算QR。

[Q0,R0] = QR(A);D0 = DIAG(符号(DIAG(R0)));Q0 = Q0 * D0 R0 = D0 * R0
Q0=-0.3086 0.1224-0.1033-0.9376-0.6277-0.7636-0.0952 0.1174-0.5573 0.3930 0.7146 0.1559 0.4474-0.4975 0.6852-0.2877 R0=1.4459-0.8090 0.1547 0.3977 0.1441 0.0809-0.2494 0.8193 0.1894 0.4836

使用固定点实现硬件效率

使用定点输入数据类型为ASIC和FPGA设备生成高效的HDL代码。

有关如何选择定点数据类型不会溢出的更多信息,请参见例执行QR分解利用CORDIC.

可以通过使A和B 3维阵列运行通过模型许多测试输入。

n_test_输入=100;

以下部分定义了被缩放之间-1和1,所以设置定点字长18位和​​分数长度到14位,以允许在QR分解生长和中间计算在对矩阵A和B随机输入CORDIC算法。

单词长度=18;分数长度=14;

CORDIC迭代的最佳精度是字长减1。如果CORDIC迭代次数设置为小于word_length-1,则下一个就绪信号的延迟和时钟周期将更短,但其精确度将更低。CORDIC迭代次数不应设置得更大,因为生成的代码不支持大于定点类型的字长的移位。万博1manbetx

NumberOfCORDICIterations = word_length  -  1
NumberOfCORDICIterations = 17

将随机测试输入串联起来,以便在时间k时,输入是A(:,:,k)和B(:,:,k)。A和B的每个元素都是-1和+1之间的均匀随机变量。

A = 2 *兰特(4,4,n_test_inputs)-1;

选择B作为单位矩阵,所以Q=C'。

B=眼睛(4);B=repmat(B,1,1,n_test_inputs);

投A至固定点,并且铸造乙像A.

A=fi(A,1,单词长度,分数长度);B=cast(B,'喜欢',一个);

模拟模型

sim卡fxpdemo_real_4x4_systolic_array_QR_模型

计算并绘制错误

norm_error =零(1,尺寸(R,3));对于k=1:size(R,3)Q_乘以R_减A=double(C(:,:,k))'*double(R(:,:,k))-double(A(:,:,k));norm_error(k)=norm(Q_乘以R_减A);结束

误差应该在10^3左右。

clf图(标准误差,“o-”)网格标题('范数(QR  -  A)')

%#好的<*NASGU,*NOPTS>