正弦波から周波数を検出する方法についてのガイダンスが必要です。DtoAコンバーターを介して正弦波を生成しました。今、私はその信号をAtoDに戻し、出力を監視および検証しています。
正弦波の周波数を検出する方法がわかりません。どうやら、私は正弦波から周期を取得し、ノイズを補償するためにヒステリシスを適用することになっています。ヒントは大歓迎です。ありがとう。
正弦波から周波数を検出する方法についてのガイダンスが必要です。DtoAコンバーターを介して正弦波を生成しました。今、私はその信号をAtoDに戻し、出力を監視および検証しています。
正弦波の周波数を検出する方法がわかりません。どうやら、私は正弦波から周期を取得し、ノイズを補償するためにヒステリシスを適用することになっています。ヒントは大歓迎です。ありがとう。
これが正弦波のみに関するものである場合は、ゼロ交差をチェックし、数百サイクルのゼロ交差間の平均時間を計算します。これにより、正確な半周期の長さが得られ、そこから周波数を計算できます。
(ほとんどの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&¤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);
ここで、十分なサイクル数は測定するサイクル数、ゼロは正弦波の DC オフセット、そして ticksFreq は CPU の周波数であり、利用可能な最も正確な時間です。もちろん、これは非常に単純化されたものであり、多くの綿毛とチェックを追加する必要があります。