사인파에서 주파수를 감지하는 방법에 대한 지침이 필요합니다. 나는 DtoA 변환기를 통해 사인파를 생성했습니다. 이제 출력을 모니터하고 확인하기 위해 AtoD를 통해 해당 신호를 다시 보냅니다.사인파의 주파수 /주기 감지
나는 사인파의 주파수를 어떻게 감지 할 지 모르겠다. 분명히, 나는 사인파에서 마침표를 얻고 잡음을 보상하기 위해 히스테리시스를 적용해야합니다. 힌트를 주시면 감사하겠습니다. 감사.
사인파에서 주파수를 감지하는 방법에 대한 지침이 필요합니다. 나는 DtoA 변환기를 통해 사인파를 생성했습니다. 이제 출력을 모니터하고 확인하기 위해 AtoD를 통해 해당 신호를 다시 보냅니다.사인파의 주파수 /주기 감지
나는 사인파의 주파수를 어떻게 감지 할 지 모르겠다. 분명히, 나는 사인파에서 마침표를 얻고 잡음을 보상하기 위해 히스테리시스를 적용해야합니다. 힌트를 주시면 감사하겠습니다. 감사.
이것이 사인파에 관한 것이라면 제로 크로싱을 확인하고 제로 크로싱 사이의 평균 사이클을 몇 백 사이클 반복해서 계산하면 정확한 반주기 길이를 얻을 수 있습니다. 주파수를 계산하십시오.
(매우 간단) 의사 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&¤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);
될 수있다. 물론 이것은 매우 단순화되어 많은 보풀과 검사를 추가해야합니다.
0 신호에 오프셋이 없으면 +1 –
@ppeterka에게 감사드립니다. 나에게 의사 코드를 보여 주시겠습니까? 네가 할 수 없다면 나는 이해한다. 감사 – Snuff
Google을 사용해 보셨습니까? [사인파 주파수 탐지] (http://www.instructables.com/id/Arduino-Frequency-Detection/step3/Sine-Wave-Frequency-Detection/) – Mike
질문에 대한 답변은 여기에 있습니다. [DSP] (http://dsp.stackexchange.com) 사이트에 더 적합합니다. 그럼에도 불구하고 특정 주파수만을 찾고있는 경우 고속 푸리에 변환 또는 자기 상관 또는 Goertzel 알고리즘을 사용할 수 있습니다. –