【发布时间】:2012-11-07 14:13:14
【问题描述】:
我将信号的相位从 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)后得到最大值(电压),因为对于每次读取操作,我的设备都需要 100 毫秒的延迟。这太大了,我无法更改硬件,因此我想通过优化软件在 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 编程新手。谁能提供最佳算法的示例代码。
【问题讨论】:
-
您可以从仅测量 {0,90,180,270) 开始,然后在前 2 个值 {180,270} -> 225 之间的象限内插值。等:二分搜索。
-
你在做什么?可能有更好的方法来获得最大电压,需要的相位可能可以根据一些公式而不是使用简单的试验/错误来计算。
-
@wildplasser 我相信您的评论是正确的方法,您应该将其发布为答案。
-
可能会有所不同吗?我的意思是你已经测量了它并打印了表明你认为它是稳定的值。那么为什么需要搜索整个域(0..360)?
-
顺便说一下,for 循环中的 (i=0;i<=360;i+=10)。您应该只检查 0-360,您目前正在检查 0-370。
标签: c interpolation binary-search polar-coordinates