2014-11-03 5 views
0

부분 사인파의 피크를 형성하는 8 개의 데이터 포인트가 있습니다. 방정식을 구하기 위해 이것들을 맞추려고합니다. 따라서 데이터 포인트 사이에있는 진정한 최대 위치를 발견합니다. 코딩은 C로 진행됩니다. 알고리즘에 대한 정보가 있거나 이상적으로 샘플 코드를 작성한 사람이 있습니까?부분 사인 데이터 적합 코드 C

+0

데이터 및 제약 조건 (예 : 모든 데이터가 90도 5도 이내)을 추가하면 도움이됩니다. 일반적인 형태는'y = A * sin (B * x + C) + D'이다. A, B, C, D의 한계를 아는 것이 도움이됩니다. – chux

+0

데이터 포인트가 x 방향으로 동일 간격으로 배치되어 있습니까? – chux

+0

예 - x 축에 균등하게 간격을 두었습니다. –

답변

1

제공하여 samplevalues는 "무게"로 samplevalues를 보는 시도하고 "무게 중심"을 계산할 수있는, 즉이 감소 샘플 뒤에 증가하는 "혹"을 형성 :

float cog = 0f; 
for (i=0; i<num_samples; ii+) { 
    cog += i * samples[i]; 
} 
cog /= num_samples; 

나 ' 과거에도 비슷한 경우에 사용했습니다.

참고 :이 구성표는 사용 된 샘플 세트에 단일 피크가 포함되어있는 경우에만 작동하며 질문 문구를 사용하면 확실하다고 생각했습니다. 샘플 값이 증가하거나 감소하는 경우 "흥미로운"샘플 범위를 선택하고 설명 된대로 피크 위치를 계산하여 모니터링을 통해 관심 위치를 쉽게 찾을 수 있습니다.

실제 목표가 입력 신호의 사인파 위상 또는 주파수를 결정하는 것이라면, 신호를 사인파의 참조 세트와 상관시키는 것이 훨씬 더 낫습니다 (즉, 푸리에 변환).

+0

위 코드대로 작동하지 않지만 아이디어가 마음에 들었고 테스트로 진행할 것입니다. –

+0

여러 피크 값이 비슷할 경우 작동하지 않습니다 –

+0

아마 " 오프닝 발언 "은 충분히 명확하지 않지만 제공되는 코드는 해당 피크 주변에 분산 된 샘플 세트가 주어지면 단일"고비 "또는"피크 "의 서브 샘플 위치를 추정합니다. 각 피크를 찾아 그 주변의 샘플 세트를 선택하는 것은 다른 곳에서 수행된다고 가정합니다 –

2

데이터 포인트가 모두 최대 값에 가까워서 웨이브 y = A*sin(B*x + C) + D은 cos (x) = (1.0 - x * x/2! + ...)의 처음 2 항과 매우 유사한 포물선으로 근사 될 수 있습니다.

따라서 8 개 데이터 포인트에 가장 적합한 포물선을 찾아 최대 값을 계산하십시오. C- Peak detection via quadratic fit

Google 예제가 많이 있습니다. Example