我将信号的相位从0度改变到360度,以获得最大电压值.因为如果我改变信号的相位,电压也会改变.我有找到最大值的代码.
void Maxphase(float *max,unsigned int *index) { *max = 0.0; float value; unsigned int i,data; for (i=0;i<=360;i++) { phaseset(i); delay_ms(100); data = readvalue(); value = voltage(mux1); if(value > *max) //find max value { *max = value; //max voltage *index = i; } } }
从上面的代码我得到38秒(360 * 100)后的最大值(电压),因为对于每次读取操作,我的设备需要100ms延迟.这太大了,我无法改变硬件因此我希望通过优化软件在2到3秒内获得最大值.
然后我尝试了以下代码.
void Maxphase(float *max1,unsigned int *index1) { max = 0.0; float value; unsigned int i,j,data; for (i=0;i<=360;i+=10) { phaseset(i); delay_ms(100); data = readvalue(); value = voltage(mux1); if(value > max) //find max value { max = value; //max voltage index = i; } } *max1=max; *index1=index; for (i=*index1-9;i<=*index1+9;i+=1) { j=i; phaseset(j); delay_ms(100); data = readvalue(); value = voltage(mux1); if(value > *max1) //find max value { *max1 = value; //max voltage *index1 = i; } } }
我把时间从45秒减少到7秒.我将迭代次数减少到了360到54(54 * 100).我希望将其缩短7秒到2秒.
任何人都可以用更好的算法帮助我,我可以在2秒内从(0到360)获得最大值.
我通过改变相位使用范围测量了电压值.我在下面写了它如何随相位变化电压.
Phase (degree) voltage(max) 0 0.9mv 45 9.5mv 90 9.0mv 135 0.9mv 180 292mv 225 601mv 270 555mv 315 230mv 360 0.9mv
我是C编程的新手.任何人都可以提供最佳算法的示例代码.
解决方法
Golden section search可能就是你追求的目标.它很有效,但仍然非常简单.
如果你想要更快更复杂的东西,你可以使用Brent’s method.