我只需要一些关于如何从正弦波中检测频率的指导。我通过DtoA转换器产生了正弦波。现在,我将该信号放回AtoD以监视和验证输出。
我不知道如何检测正弦波的频率。显然,我应该从正弦波中获得周期,并应用滞后来补偿噪声。任何提示都是非常感谢的。谢谢。
发布于 2012-11-27 20:56:11
如果这只是关于正弦波,我会检查零交叉,并计算几百个周期的零交叉之间的平均时间,这将给出准确的半周期长度,由此,你可以计算频率。
(“零”可能不是微不足道的,因为大多数uC只有0-Vdd范围的模数转换器输入,所以在这种情况下,零可能恰好是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&¤tSample<=zero) || (lastSample<zero&¤tSample>=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是要测量的周期数,零是正弦波的直流偏移量,ticksFreq是CPU的频率,这是可用的最精确时间。当然,这是非常-非常简单的,需要添加大量的错误和检查。
https://stackoverflow.com/questions/13584644
复制相似问题