确定不同频率的两个信号之间有效“相位差”的算法?

时间:2009-07-21 07:36:09

标签: algorithm language-agnostic signal-processing frequency

快速版:

如果我所拥有的唯一信息是每个上升沿发生的时间,我可以使用什么算法来确定具有不同频率的两个方波信号之间的“相位差”?

详细版本:

我正在开发一个嵌入式软件项目,我遇到了一个有趣的问题。我正在收集两个hall-effect speed sensors的数据,每个meshed gears and pulse signals都针对两个啮合齿轮中的一个,如下图所示:

Jaime

注意:
正如phase difference指出的那样,该图中的信号实际上具有相同的频率。真正的硬件在两个目标齿轮之间有几个齿轮传动级,其中一些通过轴而不是啮合齿连接,因此我最终得到两个具有不同频率的方波,并且比率他们之间仍然是一个常数。我想简化图表来解决问题,但看起来我把它简化得太多了! 的 /注意

速度传感器输出方波信号,其频率与每个档位的转速成正比。当单齿轮齿的前缘(和后缘)经过传感器时,会出现方波的上升(和下降)边缘。

我知道每个齿轮上有多少齿,根据这些信息,我能够根据方波信号的频率准确测量每个齿轮的转速。

为了测量频率,我将每个速度传感器信号连接到嵌入式控制器上的高速捕获定时器引脚。捕获定时器自动检测方波信号的上升沿,加载一个寄存器,其值表示转换发生的时间,并触发中断。每个信号的捕获点在图中以黄色显示。中断服务程序如下所示:

struct
{
    long previousTime;
    int frequency;
}
sensors[2];

void CaptureTimer_Interrupt(int channel, long transitionTime)
{
    long timeDifference = transitionTime - sensors[channel].previousTime;
    sensors[channel].frequency = CONVERSION_FACTOR / timeDifference;
    sensors[channel].previousTime = transitionTime;
}

我想做什么:

我希望能够检测到这两个方波信号的相对时序的微小差异。由于缺乏更好的术语,我称之为“相位差”。如果这两个信号的频率完全相同,那么这很简单,{{3}}将是正确的术语。

这就是我所得到的:如果我要在很长一段时间内记录这两个信号,然后人为地减慢(或“拉伸”)高速(蓝色)信号16倍/ 9,它将具有与较低速度(红色)信号完全相同的频率,并且这两个信号将具有一些可测量的相位差,即红色信号中断和蓝色信号中断之间的时间差。我想计算相同的时间差(或等价的东西),而不必长时间记录信号。嵌入式控制器的资源有限,因此不能选择存储过去转换时间的大型数组。

有没有人遇到过这个?实际项目有几个这样的齿轮和传感器安排,所以我正在寻找一个优雅的算法,我可以重用。提前谢谢!

6 个答案:

答案 0 :(得分:2)

整体信号,即添加红色和蓝色时得到的信号,相位长度为蓝色的16倍,红色信号的9倍。您可以测量每第16个蓝色和每第9个红色上升侧翼之间的时间差。

我想你要测量的是齿轮的磨损。我认为如果没有均匀的牵引力,这种测量可能会受到齿轮公差的影响(引入噪音)。

答案 1 :(得分:2)

由于我们在谈论“阶段”,因此测量两个波形相互加强时出现的“节拍”似乎是合理的。

这样的事情,也许是:

void cog_phase_monitor2( int cog, int t )
{
    static int last_a, last_b, last_beat, last_beat_delta = 0;;
    int beat = 0;
    if( cog == 1 ) {
        if( t - last_b < 1 )
            beat = 1;
        last_a = t;
    }
    if( cog == 2 ) {
        if( t - last_a < 1 )
            beat = 1;
        last_b = t;
    }
    if( beat ) {
        printf("**** delta beat %d \n",t-last_beat);
        if( last_beat_delta ) {
            if( last_beat_delta != t-last_beat ) {
                printf("!!!Warning beat just changed !!!\n");
                last_beat_delta = 0;
            }
        } else {
            last_beat_delta = t-last_beat;
        }
        last_beat = t;
    }

}

现在,如果我们将其插入到两个齿轮的模拟中,9个齿中的一个和16个齿中的一个,两个都以每秒10转的速度转动

B at 6 msecs
A at 11 msecs
B at 12 msecs
B at 18 msecs
A at 22 msecs
B at 24 msecs
B at 30 msecs
A at 33 msecs
B at 36 msecs
B at 42 msecs
A at 44 msecs
B at 48 msecs
B at 54 msecs
A at 55 msecs
B at 60 msecs
A at 66 msecs
B at 66 msecs
**** delta beat 66
B at 72 msecs
A at 77 msecs
B at 78 msecs
B at 84 msecs
A at 88 msecs
B at 90 msecs
B at 96 msecs
A at 99 msecs
B at 102 msecs
B at 108 msecs
A at 110 msecs
B at 114 msecs
B at 120 msecs
A at 121 msecs
B at 126 msecs
A at 132 msecs
B at 132 msecs
**** delta beat 66
B at 138 msecs
A at 143 msecs
B at 144 msecs
B at 150 msecs
A at 154 msecs
B at 156 msecs
B at 162 msecs
A at 165 msecs
B at 168 msecs
B at 174 msecs
A at 176 msecs
B at 180 msecs
B at 186 msecs
A at 187 msecs
B at 192 msecs
A at 198 msecs
B at 198 msecs
**** delta beat 66

现在,如果我们向其中一个齿轮添加1毫秒的延迟:

B at 6 msecs
A at 11 msecs
B at 12 msecs
B at 18 msecs
A at 22 msecs
B at 24 msecs
B at 30 msecs
A at 33 msecs
B at 36 msecs
B at 42 msecs
A at 44 msecs
B at 48 msecs
B at 54 msecs
A at 55 msecs
B at 60 msecs
A at 66 msecs
B at 66 msecs
**** delta beat 66
B at 72 msecs
A at 77 msecs
B at 78 msecs
B at 84 msecs
A at 88 msecs
B at 90 msecs
B at 96 msecs
A at 99 msecs
B delayed at 102 msecs
B at 103 msecs
B at 109 msecs
A at 110 msecs
B at 115 msecs
A at 121 msecs
B at 121 msecs
**** delta beat 55
!!!Warning beat just changed !!!
B at 127 msecs
A at 132 msecs
B at 133 msecs
B at 139 msecs
A at 143 msecs
B at 145 msecs
B at 151 msecs
A at 154 msecs
B at 157 msecs
B at 163 msecs
A at 165 msecs
B at 169 msecs
B at 175 msecs
A at 176 msecs
B at 181 msecs
A at 187 msecs
B at 187 msecs
**** delta beat 66
B at 193 msecs
A at 198 msecs
B at 199 msecs
B at 205 msecs

这似乎是一个充满希望的开端: - )

答案 2 :(得分:1)

我认为它比那更简单。

每轮16 * 9(大齿轮)的样品轮子都在它们开始的完全相同的位置。

所以你做的是以下几点:

  • 通过对大齿轮的采样选择任何时间点。在您对小齿轮进行采样之前,请测量一段时间。记住这个值。

  • 每个16 * 9的大齿轮采样(为什么这听起来可疑?)再次进行相同的测量并将其与基值进行比较。当时间开始转变时,你就遇到了问题。

[R

答案 3 :(得分:1)

我在查看硬件设置时遇到了一些麻烦。以及您尝试检测的行为。轴打滑?牙齿穿着?

在任何情况下,我都会编写一个模拟情况,这样我就可以得到一些,可能是夸大的结果,没有噪音来测试算法。

我将测试的算法将是以下变体:

Assign signal with lowest frequency to A

Time A’s rising edge. =>  Ta1

Time the next B rising edge . =>  Tb1

Calculate time Tb1 – Ta1    =>  dT1

Time next A’s rising edge. => Ta2

Time the next B rising edge. =>  Tb2

Calculate time Tb2 – Ta2    =>  dT2

Calculate second order difference  dT2 – dT1  => d2T1

Repeat precious steps to get another second order difference  => d2T2

If sign of d2T1 and d2T2 are different, 

repeat previous steps

else sign of d2T1 and d2T1 are same

    calculate third order difference  d2T2 – d2T2  =>  d3T1

Repeat previous steps to get another 3rd order difference  =>  d3T2

If d3T2 – d3T1 > max noise

    Raise alarm

答案 4 :(得分:0)

我认为最好的办法是创建所有牙齿对时间的X-Y图。你可以在每个齿轮上任意选择一颗牙齿为T = 0 ..

答案 5 :(得分:0)

我会在软件中实现两个锁相环。假设齿轮A的转数对应于齿轮B的b转。计算a和b m的最小公倍数:= lcm(a,b)。锁相PLLa带齿轮A(系数为m / a),PLLb带齿轮B(系数m / b)。然后两个PLL应具有相同的频率。因此,应易于检测相位差异。由于您有一个控制器,您只需计算两个锁相信号的卷积。然后,卷积函数的最大值会告诉您相位差。