2012-11-27 4 views
0

사인파에서 주파수를 감지하는 방법에 대한 지침이 필요합니다. 나는 DtoA 변환기를 통해 사인파를 생성했습니다. 이제 출력을 모니터하고 확인하기 위해 AtoD를 통해 해당 신호를 다시 보냅니다.사인파의 주파수 /주기 감지

나는 사인파의 주파수를 어떻게 감지 할 지 모르겠다. 분명히, 나는 사인파에서 마침표를 얻고 잡음을 보상하기 위해 히스테리시스를 적용해야합니다. 힌트를 주시면 감사하겠습니다. 감사.

+1

Google을 사용해 보셨습니까? [사인파 주파수 탐지] (http://www.instructables.com/id/Arduino-Frequency-Detection/step3/Sine-Wave-Frequency-Detection/) – Mike

+1

질문에 대한 답변은 여기에 있습니다. [DSP] (http://dsp.stackexchange.com) 사이트에 더 적합합니다. 그럼에도 불구하고 특정 주파수만을 찾고있는 경우 고속 푸리에 변환 또는 자기 상관 또는 Goertzel 알고리즘을 사용할 수 있습니다. –

답변

2

이것이 사인파에 관한 것이라면 제로 크로싱을 확인하고 제로 크로싱 사이의 평균 사이클을 몇 백 사이클 반복해서 계산하면 정확한 반주기 길이를 얻을 수 있습니다. 주파수를 계산하십시오.

(매우 간단) 의사 UC (0-Vdd에 범위 ADC 입력을 가지고 대부분의 단지, 그래서 제로 경우에이 Vdd에 /이 될 일이 하듯이 "제로"... 사소한되지 않을 수 있습니다) enoughCycles 사이클의 수를 측정하는 것, 제로 DC는 사인파의 오프셋이고, ticksFreq는 CPU, 가능한 가장 정확한 시간 주파수 :

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); 

될 수있다. 물론 이것은 매우 단순화되어 많은 보풀과 검사를 추가해야합니다.

+0

0 신호에 오프셋이 없으면 +1 –

+0

@ppeterka에게 감사드립니다. 나에게 의사 코드를 보여 주시겠습니까? 네가 할 수 없다면 나는 이해한다. 감사 – Snuff