CORDIC算法FPGA的实现

2023-11-13

基于CORDIC算法FPGA的实现

CORDIC算法原理利用简单的移位就实现,主要用于三角函数、双曲线、指数、对数的计算,在以二进制操作为基础的FPGA硬件中就显得尤为重要。虽然现在的fpga有了集成IP核,但是对于其基本原理还是需要关注的。
基于个人理解,本文主要对该算法进行简单推导,同时利用matlab进行仿真,并在fpga中实现。

1、CORDIC算法的推导

CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法。在网上已经有了很多推导算法,不过在这里还是给大家挑选一种重新推导下。先附上示意图如下

在这里插入图片描述

1.1 圆坐标系旋转公式推导

该坐标旋转在一个半径为r的圆中进行旋转(注意是一个圆坐标系,因为还有在线性坐标和双曲线坐标系中,其他坐标系推导也类似,这里不进行阐述),
那么(x1,y1)坐标可以表示为
x1=rcosφ, y1=sinφ;
(x1,y1)旋转θ角度后为(x2,y2)坐标可以表示为
x2=rcos(φ+θ)=rcosφcosθ-rsinφsinθ=x1cosθ- y1sinθ;
y2=rsin(φ+θ)=rsinφcosθ+rcosφsinθ=y1cosθ+ x1sinθ;
因此,在圆坐标系中,(x1,y1)逆时钟旋转θ角度后,得到的(x2,y2)坐标为
x2=x1cosθ- y1sinθ;
y2=x1sinθ+y1cosθ;

这个就是圆坐标系的旋转公式。通过提出因数cosθ ,方程可写成下面的形式
x2 =cosθ(x1 – y1 tanθ)
y2= cosθ(y1 + x1 tanθ)

如果去除 cosθ项,我们得到 伪旋转 方程式
x2’ =(x1 – y1 tanθ)
y2’= (y1 + x1 tanθ)

即旋转的角度是正确的,但是 x 与 y 的值增加1/cosθ 倍 ( 由于1/cosθ大于1,所以模值变大),为什么要去除cosθ,是因为去除后可以简化坐标平面旋转的计算操作。
在这里插入图片描述因此经过伪旋转之后,向量 R 的模值将增加 1/cosθ 倍。

1.2CORDIC算法推导

为什么要提取cosθ公共项,并去除cosθ,其实本质是需要构造一个tanθ的函数,利用tanθ构造可在二进制中的移位的迭代参数,同时cosθ因子并不能通过适当的数学方法去除(去除该因子后文给出说明),所以要转为伪旋转。利用matlab构造tanθ和二进制移位参数表如下图所示,该参数表固定,

##matlab生成参数表
clear; close all; clc;
for i=0:15
	theta = rad2deg( atan(2^(-i)) );
	fprintf('i=%d\t2^-i=%.9f\ttheta=%.9f\ttanθ=%.9f\n',i,2^-i,theta,tand(theta))
end

在这里插入图片描述
可以看出,迭代关系(二进制移位关系)和旋转角度tanθ关系,即任何旋转角度都应在表格参数中,对任意角度θ的旋转能够通过一系列连续小角度的旋转迭代 i 来完成。旋转的角度为θ,根据伪旋转公式,正切项tanθ变成了迭代移位操作。
第 1 次迭代 : 旋转 45°; 第 2 次迭代 : 旋转 26.6°, 第 3 次迭代 : 旋转 14°等。每次旋转的方向都影响到最终要旋转的累积角度,理论上-99.7°到99.7°的的范围内的任意角度都可以旋转,对于该范围之外的角度, 可使用三角恒等式转化成该范围内的角度。
旋转方向也涉及逆时钟和顺时钟,每次迭代过程需要根据旋转方向进行加或减运算。因此在伪旋转基础上,引入d 角度旋转判决因子,用于确定旋转的方向。同时也引入角度累加器概念用来在每次迭代过程中追踪累加的旋转角度Z,同时将tanθ改为二进制移位算术,伪旋转就变成如下
在这里插入图片描述

前面也提到过,每次伪旋转,模值都会相应增加,随着不断迭代,最终cos 45 x cos 26.5 x cos 14.03 x cos 7.125 … x cos 0.0139≈ 0.607252941,增加1/0.607=1.6476倍。引用该段证明,如下所示
在这里插入图片描述
如果我们已知将被执行的迭代次数,我们便可以预先计算出 1/Kn 的值,并通过将 1/Kn 与 x(n) 和 y(n)相乘来校正 x(n) 和 y(n) 的最终值。n次迭代后,最终的坐标值就只和初始的没旋转之前的坐标值x0,y0和最终旋转要达到的角度值xn,yn有关了,如下所示
在这里插入图片描述
乍一看公式,前面一直在说伪旋转,经过多次迭代怎么又回到看着像是最开始的圆坐标系旋转公式呢。先给出一段证明如下:
伪旋转公式为
在这里插入图片描述
那么就有
![在这里插入图片描述](https://img-blog.csdnimg.cn/e714d8da901e484996c21f115be79e4b.png
n次迭代后,最终的坐标值就只和初始的没旋转之前的坐标值x0,y0和最终旋转要达到的角度值,注意看
在这里插入图片描述
可设
在这里插入图片描述
因此,等式就变为
在这里插入图片描述
看到这里,应该也清楚CORDIC算法来由啦。到这里,有同学又问了怎么Z不是0,最开始上面公式Z=0啊。简单来说,其实就是咱么在计算一个角度时,预设了一个角度φ,然后通过每次叠加与预设角度φ比对,来逼近预设角度,即Z=0的实质是
在这里插入图片描述

因此综合上述推导,整个CORDIC算法为
在这里插入图片描述
在实际应用中,往往是通过Z’参数来判断旋转符号。
其实,换一个角度理解,旋转公式
xn=x0 cosθ – y0 sinθ
yn= x0 sinθ + y0 cosθ

就是(x0,y0)圆坐标系一次性旋转θ,得到最终xn,yn。但是,回到前面开始说的圆坐标系旋转和伪旋转区别,其实就是相差一个伸缩因子Kn,现在已知迭代次数求得Kn,圆坐标系旋转乘以伸缩因子系数Kn,不就成伪旋转吗。只是表达式与前面叙述不一样,本质其实就是伪旋转。下面也给出迭代次数与伸缩因子关系表。
在这里插入图片描述

1.3 CORDIC算法操作模式

前面推导这么多,只是对CORDIC算法理论的推导,现在总算来到实际运用阶段啦。都知道CORDIC算法可以求三角函数,那么怎么求呢。实际上,CORDIC算法有两种操作模式,旋转模式和向量模式。前面推导的其实就是旋转模式

1.3.1旋转模式

简单看前面推导过程及结果,其实就明白,CORDIC算法的旋转模式可以求cosZ sinZ 。
在这里插入图片描述
既然要求角度为Z的cosZ sinZ,那么根据上述公式,就可以设置初值,
x0 = 1/Kn 和 y0= 0 ,Z‘为判别条件,迭代后X值即为 cos z,y值即为 sin z
现附上旋转模式求解cosz, sinz的matlab程序,程序不难理解

close all;
clear;
clc;
% 初始化
die = 16;%迭代次数
x = zeros(die+1,1);
y = zeros(die+1,1);
z = zeros(die+1,1);
x(1) = 0.607253;%初始设置
z(1) = pi/3;%待求角度θ
%迭代操作
for i = 1:die
    if z(i) >= 0%角度的符号判断
        d = 1;
    else
        d = -1;
    end
    x(i+1) = x(i) - d*y(i)*(2^(-(i-1)));
    y(i+1) = y(i) + d*x(i)*(2^(-(i-1)));
    z(i+1) = z(i) - d*atan(2^(-(i-1)));%角度累加值
end
cosz = vpa(x(17),10)
sinz = vpa(y(17),10)
c = vpa(z(17),10)%最终累加角度误差值

求得,
在这里插入图片描述
FPGA的实现原理其实一样,主要注意角度的定点量化。量化位数直接影响计算精度,量化8位则一般迭代7次就结束,同时误差也会相对较大,如果量化32bit,则一般迭代16次就结束,误差相对较小。实际运用时平衡考虑FPGA资源以及误差。
先附上初值量化matlab程序

bit_quantify=32;
die=32;
%%初值
x0=0.607253;
y0=0;
Z0=pi/3;

theta=zeros(1,die);%以pi为基准量化
thetabin=zeros(1,die);

for i=1:1:die
theta(i)=atan(2^(-(i-1)));
end
%量化后的数据
xbin=dec2hex(round(x0/1*(2^(bit_quantify-1)-1)));

zbin=dec2hex(round(Z0/pi*(2^(bit_quantify-1)-1)));

for i=1:1:die
thetabin(i)=round(theta(i)/pi*(2^(bit_quantify-1)-1));
end
thetabin=dec2hex(thetabin);

直接附上FPGA实现代码,量化32bit进行计算

`timescale 1 ps/ 1 ps
module Cordic_Test
(
	CLK_SYS,RST_N,
	Phase,
	Sin_out,Cos_out,Error
);

	input 					CLK_SYS;
	input 					RST_N;
	input 		signed[31:0] 		Phase;//输入角度,弧度量化
	output		signed[31:0] 		Sin_out;
	output		signed[31:0] 		Cos_out;
	output		signed[31:0] 		Error;//角度误差


	`define rot0   32'h20000000//45°    45°=pi/4=0.785398163397448  以pi为基准量化    pi/4*(2^31-1)
	`define rot1   32'h12E4051D//26.5650511770780°
	`define rot2   32'h09FB385B//14.0362434679265°
	`define rot3   32'h051111D4//7.12501634890180°
	`define rot4   32'h028B0D43//3.57633437499735°
	`define rot5   32'h0145D7E1//1.78991060824607°
	`define rot6   32'h00A2F61E//0.895173710211074°
	`define rot7   32'h00517C55//0.447614170860553°
	`define rot8   32'h0028BE53//0.223810500368538°
	`define rot9   32'h00145F2F//0.111905677066207°
	`define rot10  32'h000A2F98//0.0559528918938037°
	`define rot11  32'h000517CC//0.0279764526170037°
	`define rot12  32'h00028BE6//0.0139882271422650°
	`define rot13  32'h000145F3//0.00699411367535292°
	`define rot14  32'h0000A2FA//0.00349705685070401°
	`define rot15  32'h0000517D//0.00174852842698045°
	`define rot16  32'h000028BE//0.000874264213693780°
	`define rot17  32'h0000145F//0.000437132106872335°
	`define rot18  32'h00000A30//0.000218566053439348°
	`define rot19  32'h00000518//0.000109283026720071°
	`define rot20  32'h0000028C//5.46415133600854e-05°
	`define rot21  32'h00000146//2.73207566800489e-05°
	`define rot22  32'h000000A3//1.36603783400252e-05°
	`define rot23  32'h00000051//6.83018917001272e-06°
	`define rot24  32'h00000029//3.41509458500637e-06°
	`define rot25  32'h00000014//1.70754729250319e-06°
	`define rot26  32'h0000000A//8.53773646251594e-07°
	`define rot27  32'h00000005//4.26886823125797e-07°
	`define rot28  32'h00000003//2.13443411562898e-07°
	`define rot29  32'h00000001//1.06721705781449e-07°
	`define rot30  32'h00000001//5.33608528907246e-08°
	`define rot31  32'h00000000//2.66804264453623e-08°

	parameter Pipeline =16;//迭代次数
	parameter Kn = 32'h4DBA775F;	//K=0.607253*(2^31-1),32'h4DBA775F

	reg signed 	[31:0] 		Sin;
	reg signed 	[31:0] 		Cos;
	reg signed 	[31:0] 		Error;
	reg signed  [31:0]		reg_phase,phase_delay;

	reg signed 	[31:0]		xn [Pipeline:0];
	reg signed 	[31:0]		yn [Pipeline:0];
	reg signed 	[31:0]		zn [Pipeline:0];
	
	reg signed 	[31:0]		rot[Pipeline:0];
	reg 		[1:0] 		Quadrant [Pipeline:0];
	reg signed	[31:0]overeult_xn,overeult_yn;
//-----------存储角度值-----------------------------	
always @ (posedge CLK_SYS or negedge RST_N)
begin
	if(!RST_N)
	begin
		rot[0] <= 1'b0;
		rot[1] <= 1'b0;
		rot[2] <= 1'b0;
		rot[3] <= 1'b0;
		rot[4] <= 1'b0;
		rot[5] <= 1'b0;
		rot[6] <= 1'b0;
		rot[7] <= 1'b0;
		rot[8] <= 1'b0;
		rot[9] <= 1'b0;
		rot[10] <= 1'b0;
		rot[11] <= 1'b0;
		rot[12] <= 1'b0;
		rot[13] <= 1'b0;
		rot[14] <= 1'b0;
		rot[15] <= 1'b0;
		rot[16] <= 1'b0;
	end
	else
	begin
		rot[0] <= `rot0;
		rot[1] <= `rot1;
		rot[2] <= `rot2;
		rot[3] <= `rot3;
		rot[4] <= `rot4;
		rot[5] <= `rot5;
		rot[6] <= `rot6;
		rot[7] <= `rot7;
		rot[8] <= `rot8;
		rot[9] <= `rot9;
		rot[10] <= `rot10;
		rot[11] <= `rot11;
		rot[12] <= `rot12;
		rot[13] <= `rot13;
		rot[14] <= `rot14;
		rot[15] <= `rot15;
		rot[16] <= `rot16;
	end
end
	
 //----------将要计算的角度转换到-pi/2到pi/2之间----------
always @(posedge CLK_SYS or negedge RST_N)
begin
     if(!RST_N)
     begin
		reg_phase <= 0;
		phase_delay <= 0;
     end
else begin
        phase_delay<= Phase;
		case(Phase[31:30])//根据角度象限,将角度转换到可求区域
        2'b00:  reg_phase <= Phase;
        2'b01:  reg_phase <= Phase - 32'h3FFFFFFF;  //-pi/2
        2'b10:  reg_phase <= Phase - 32'h7FFFFFFF;  //-pi    h7FFFFFFF
        2'b11:  reg_phase <= Phase - 32'hBFFFFFFF;  //-3pi/2   hBFFFFFFF
        default:reg_phase <= 32'h00;
        endcase
     end
end

//-------------迭代计算-----------
always @ (posedge CLK_SYS or negedge RST_N)
begin
	if(!RST_N)
	begin
		xn[0] <= 32'h0; 						
		yn[0] <= 32'h0;
		zn[0] <= 32'h0;
	end
	else
	begin
		xn[0] <= Kn;
		yn[0] <= 32'd0;
		zn[0] <= reg_phase;
	end
end


genvar die;
generate
    for (die = 0; die <Pipeline; die=die+1)
    begin: dieLoop
        always @(posedge CLK_SYS or negedge RST_N)
            if (!RST_N) begin
                xn[die+1] <= 32'h0;
				yn[die+1] <= 32'h0;
				zn[die+1] <= 32'h0;
            end
        	else begin             
				if(zn[die][31]==1'b0)//角度符号判断
					begin
				     xn[die+1] <= xn[die] - (yn[die]>>>die);
				     yn[die+1] <= yn[die] + (xn[die]>>>die);
				     zn[die+1] <= zn[die] - rot[die];  
				    end
				else begin
				      xn[die+1] <= xn[die] + (yn[die]>>>die);
				      yn[die+1] <= yn[die] - (xn[die]>>>die);
				      zn[die+1] <= zn[die] + rot[die];  
				      end
            end
    end
endgenerate

//------根据实际角度输出结果--------------
genvar dif;
generate
    for (dif = 0; dif <Pipeline; dif=dif+1)
    begin: degLoop
        always @(posedge CLK_SYS or negedge RST_N)
            if (!RST_N) begin
                Quadrant[dif] <= 2'd0;
            end
        	else begin
               Quadrant[dif+1]<=Quadrant[dif];
			   Quadrant[0]<=phase_delay[31:30];//此处是根据实际输入角度输出结果,因此相位判断是实际角度
            end
    end
endgenerate

	//角度转为第一象限,则迭代后防止数据溢出
always @(posedge CLK_SYS or negedge RST_N)
     if(!RST_N)
		overeult_xn<=0;
	else if(xn[Pipeline-1][31:30]==2'b11)//溢出负值<0
		overeult_xn<=~xn[Pipeline-1]+ 1'b1;
	else if(xn[Pipeline-1][31:30]==2'b10)//溢出>1
		overeult_xn<=32'h7FFFFFFF-xn[Pipeline-1]+32'h7FFFFFFF;//32'h7FFFFFFF-xn[Pipeline]+32'h7FFFFFFF;
	else 
		overeult_xn<=xn[Pipeline-1];
		
always @(posedge CLK_SYS or negedge RST_N)
     if(!RST_N)
		overeult_yn<=0;
	else if(yn[Pipeline-1][31:30]==2'b11)//溢出负值<0
		overeult_yn<=~yn[Pipeline-1]+ 1'b1;
	else if(yn[Pipeline-1][31:30]==2'b10)//溢出>1
		overeult_yn<=32'h7FFFFFFF-yn[Pipeline-1]+32'h7FFFFFFF;//32'h7FFFFFFF-yn[Pipeline]+32'h7FFFFFFF;
	else 
		overeult_yn<=yn[Pipeline-1];


	//根据实际角度,反推结果---------------
always @ (posedge CLK_SYS or negedge RST_N)
begin
	if(!RST_N)
	begin
		Cos <= 32'h0;
		Sin <= 32'h0;
		Error <= 32'h0;
	end
	else begin
		Error <= zn[Pipeline];//角度误差
		case(Quadrant[Pipeline])
			2'b00: //实际输入角度第一象限  Sin(X)=Sin(A),Cos(X)=Cos(A)
				begin
					Cos <= overeult_xn;
					Sin <= overeult_yn;
				end
			2'b01: //实际输入角度第二象限 Sin(X)=Sin(A+90)=CosA,Cos(X)=Cos(A+90)=-SinA
				begin
					Cos <= ~overeult_yn + 1'b1;//-Sin
					Sin <= overeult_xn;//Cos
				end
			2'b10: //实际输入角度第三象限 Sin(X)=Sin(A+180)=-SinA,Cos(X)=Cos(A+180)=-CosA
				begin
					Cos <= ~overeult_xn+ 1'b1;//-Cos
					Sin <= ~overeult_yn + 1'b1;//-Sin
				end
			2'b11: //实际输入角度第四象限 Sin(X)=Sin(A+270)=-CosA,Cos(X)=Cos(A+270)=SinA
				begin
					Cos <= overeult_yn;//Sin
					Sin <= ~overeult_xn + 1'b1;//-Cos
				end
		endcase
	end
end 

assign Sin_out=Sin;
assign Cos_out=Cos;

endmodule


以pi/3为例,pi/3量化后相位为32‘h‘2AAAAAAA’ ,计算仿真结果如下
在这里插入图片描述
可知计算的cos(pi/3)=32’h40006a4e sin(pi/3)=32’h6ed9af48 计算结果都是量化后的结果,返回量化前的值如下
在这里插入图片描述
可知cos(pi/3)=0.5 sin(pi/3)=0.866,计算结果也是符号要求。例子中注意角度量化和数值量化的标准。

1.3.1向量模式

CORDIC算法还有一种模式是向量模式,直接附上公式
在这里插入图片描述
这又是个啥,怎么理解。别急,咱们回到前面推导过程中说过一句话,圆坐标系旋转和伪旋转区别,其实就是相差一个伸缩因子Kn
那么如果初值(x0,y0)不是在x轴上,是任意一个点,经过n次迭代后,yn逐渐旋转到X轴上,及yn=0,那么模值sqrt((x0^2 )+ ( y0 ^2))前乘上伸缩因子Kn即为伪旋转后Xn坐标也是模值,Zn即为旋转的角度值。
从式子中,可以看出,通过**设定初值z0=0,可以求(x0,y0)的夹角,**也即角度值Z。
借鉴网上的matlab程序如下,计算角度值

close all;
clear;
clc;
% 初始化
die = 16;%迭代次数
x = zeros(die+1,1);
y = zeros(die+1,1);
z = zeros(die+1,1);
x(1) = 100;%初始设置
y(1) = 200;%初始设置
k = 0.607253;%初始设置
%迭代操作
for i = 1:die
    if y(i) >= 0
        d = -1;
    else
        d = 1;
    end
    x(i+1) = x(i) - d*y(i)*(2^(-(i-1)));
    y(i+1) = y(i) + d*x(i)*(2^(-(i-1)));
    z(i+1) = z(i) - d*atan(2^(-(i-1)));
end
d = vpa(x(17)*k,10)
a = vpa(y(17),10)
c = vpa(rad2deg(z(17)),10)

由于本人实际开发过程中,利用FPGA计算角度值的地方运用较少,因此未进行FPGA的实现,感兴趣的同学可以根据matlab程序进行FPGA程序的移植。移植过程注意数值与角度的量化标准。

2、CORDIC算法总结

借鉴多个参考资料,根据本人对CORDIC算法实际运用和理解,总结下来CORDIC算法就4点:
(1)CORDIC算法就是通过伪旋转来简化计算,期间需要注意与圆坐标系旋转之间的关系。
(2)旋转模式就是从X轴上一点,伪旋转到某个角度的坐标点的过程,该模式下可计算cosz和sinZ。
(3)向量模式就是从某个角度的坐标点伪旋转到X轴上一点的过程,该模式下可计算角度值。两个模式的旋转恰好相反
(4)FPGA的实现时注意数值与角度的量化标准
(5)目前只介绍了圆坐标系的CORDIC算法,延伸到线性坐标系或双曲线坐标系,都可以推导以及实现三角函数计算

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CORDIC算法FPGA的实现 的相关文章

  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • matlab矩阵中求子矩阵的通用方法

    我正在寻找一种 好 方法来在更大的矩阵 任意维数 中找到矩阵 模式 Example total rand 3 4 5 sub total 2 3 1 3 3 4 现在我希望这样的事情发生 loc matrixFind total sub 在
  • 将 3d 矩阵重塑为 2d 矩阵

    我有一个 3d 矩阵 n by m by t 在 MATLAB 中表示n by m一段时间内网格中的测量值 我想要一个二维矩阵 其中空间信息消失了 只有n m随着时间的推移测量t剩下 即 n m by t 我怎样才能做到这一点 你需要命令r
  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • 如何正确从表中删除 NaN 值

    在 Matlab 中阅读 Excel 电子表格后 不幸的是 我的结果表中包含了 NaN 例如这个 Excel 表格 将产生此表 其中出现额外的 NaN 列 我尝试使用以下代码片段删除 NaN measurementCells readtab
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • 禁止 MATLAB 自动获取焦点[重复]

    这个问题在这里已经有答案了 我有以下问题 在我的 MATLAB 代码中 我使用如下语句 figure 1 更改某些数据的目标数字 问题是 在此 MATLAB 之后 系统将焦点集中在具有该图形的窗口上 当我在后台运行一个大脚本并尝试在计算机上

随机推荐

  • Linux :: 权限篇【2】:详解文件操作权限表示方式!字符表示法 及 八进制表示法说明!

    系列文章说明 前言 本篇是 Linux 基本操作篇章的内容 笔者使用的环境是基于腾讯云服务器 CentOS 7 6 64bit 学习集推荐 C 入门到入土 学习合集 Linux 从命令到网络再到内核 学习合集 文章目录 系列文章说明 前言
  • 面向对象设计模式

    文章目录 一 创建型设计模式 1 1 单例 Singleton 1 2 原型 Prototype 1 3 工厂 Factory 1 3 1 简单工厂 1 3 2 工厂方法 1 3 3 抽象工厂 1 4 建造者 Builder 二 结构型设计
  • vue判断值是否为空以及弹出提示框

    if this checkedProjects length 0 alert 该项不能为空
  • xp系统sql服务器怎么找,SQL文件在winxp系统下怎么打开

    很多用户不知道SQL文件是什么 SQL文件怎么打开 我们存储数据时候经常会遇到SQL文件 如果你不知道WinXP系统SQL文件是什么以及怎么打开的话 那就赶紧看看小编整理的以下文章内容吧 SQL文件是什么 学习编程的同学可能都知道SQL是一
  • CTF_WEB(习题)

    一 bugku web cookie欺骗 https ctf bugku com challenges detail id 87 html 地址栏filename一看为base64 解密为keys php 尝试index php加密为bas
  • vue的请求封装和api接口的封装

    1 请求封装 1 创建utils文件夹 2 在此文件夹创建http js文件 3 在此文件夹引入axios import axios from axios 4 创建一个新的请求实例 const instance axios create b
  • web面试必问的题

    1 Vue双向数据绑定 2 虚拟dom和diff算法 3 组件通信 4 Vuex 5 Vue router 路由原理 路由守卫 路由传参 6 Vue声明周期 7 自定义指令 自定义过滤器 8 自定义组件 9 常用的指令 修饰符 10 vue
  • 动态规划题目总结

    基础题目 剑指 Offer 10 I 斐波那契数列 70 爬楼梯 剑指 Offer II 088 爬楼梯的最少成本 不同路径 II 带障碍 我一定会 卡特兰数 n个节点可以构成多少种搜索二叉树 分割三角形 排队买票 n对括号有多少种合理的表
  • C语言---函数指针

    前言 1 函数指针 顾名思义 就说函数的指针 2 我们学习Linux的时候 经常能够看到使用一个结构体 结构体中很多个成员 我们给这些成员赋于函数名 这样非常方便我们管理一个设备文件 3 本文将会详细介绍函数指针 函数指针介绍 函数指针原型
  • ue4项目运行还可以鼠标点击

    ue4项目运行还可以鼠标点击
  • 【第1篇】AlexNet:CNN开山之作

    文章目录 摘要 1 简介 2 数据集 3 架构 3 1 ReLU非线性 3 2 多GPU训练 3 3 局部响应归一化 3 4 重叠池化 3 5 整体架构 4 减少过拟合
  • http post 请求示例

    public static String post6 String URL String json String obj null 创建默认的httpClient实例 CloseableHttpClient httpclient HttpC
  • session 存储失败

    session 在服务器上储存失败 我的原因是 因为服务器环境是 centos 加 nginx 的所以 php fpm 文件的所属要改为nginx 要不然没办法写入
  • jsp使用cookie实现记住用户名和密码

    首先说一下实现的功能 用户打开注册页面 最下面有个记住用户名和密码的复选框 如果勾选上 则在登录页面会自动将用户名和密码赋值到文本框中 使用java中的cookie实现 下面就是代码 注册页面代码 reg jsp
  • 使用FL Studio四年后深度测评,我为什么选择FL Studio?

    相信大家或多或少的都有关注最近火出圈的电音综艺 超感星电音 各路制作人群雄齐聚 各放光彩 其中当之无愧被称为中国电子音乐第一人的Carta 其使用的编曲软件就是FL Studio 哪怕放眼全球 诸如Martin Garrix 小马丁 Bro
  • ROS multi-master——multimaster_fkie配置

    多主站ROS配置和mutimaster fkie ROS版本 kinetic 操作系统 Ubuntu 16 04 multimaster fkie github 1网络配置 1 1路由器 设置无线路由器并连接两台计算机 机器人 为这两台计算
  • iOS AFN-将token添加到请求头header中请求

    AFHTTPSessionManager manager AFHTTPSessionManager manager 调出请求头 manager requestSerializer AFJSONRequestSerializer serial
  • v-for中:key的必要性

    v for中要用key的原因是 key只能是字符串或者数字 key必须是唯一 key 作用 提高重排效率 就地复用 key可以标识列表中每个元素的唯一性 方便Vue高效地更新虚拟DOM key主要用于dom diff算法 diff算法是同级
  • Modbus Poll与Modbus Slave协议的两种连接方式说明:serial连接(串口连接)或者TCP连接

    Modbus的serial 串口 连接 1 安装虚拟串口VSPD 就能在一台电脑上模拟用串口连接的情况 虚拟串口安装软件 安装完成后 打开vspd虚拟串口软件 在Manage ports gt gt 选择添加First port 和 Sec
  • CORDIC算法FPGA的实现

    基于CORDIC算法FPGA的实现 CORDIC算法原理利用简单的移位就实现 主要用于三角函数 双曲线 指数 对数的计算 在以二进制操作为基础的FPGA硬件中就显得尤为重要 虽然现在的fpga有了集成IP核 但是对于其基本原理还是需要关注的