检测正弦波的频率/周期

时间:2012-11-27 12:51:02

标签: c microcontroller avr sine atmega

我只需要一些关于如何从正弦波中检测频率的指导。我通过DtoA转换器生成正弦波。现在,我通过AtoD将信号反馈回来监控并验证输出。

我不知道如何检测正弦波的频率。显然,我应该从正弦波中获取周期并应用滞后来补偿噪声。 任何提示都非常感谢。谢谢。

1 个答案:

答案 0 :(得分:2)

如果这只是关于正弦波,我会检查零交叉点,并计算零交叉点之间的平均时间,持续几百个周期,这样可以给出准确的半周期长度,从中可以计算出频率。

(“零”可能不是微不足道的,因为大多数uC只有0-Vdd范围的ADC输入,因此在这种情况下为零可能恰好是Vdd / 2 ......)

(非常简单)伪代码可能是

const zero = 0; //or vdd/2 if that's the case
while(cyclesSoFar<enoughCycles) {
    currentSample=adcRead();
    //detect zero crossing (needs hysteresis added)
    if((lastSample>zero&&currentSample<=zero) || (lastSample<zero&&currentSample>=zero) ) {
        period = getTicks()-ticksAtLastCrossing; //might have to check for over/underflow to get correct value
        avgPeriod = avgPeriod * (cyclesSoFar)/(cyclesSoFar+1) + period/(cyclesSoFar+1);
        cyclesSoFar++;
    }
    lastSample = currentSample;
}
freq = ticksFreq/(avgPeriod*2);

其中:enoughCycles是要测量的周期数,零是正弦波的DC偏移量,ticksFreq是CPU的频率,可用的最精确时间。当然,这非常简单,需要添加大量的绒毛和支票。