2009-08-30 5 views
1

이전에 물어 보았던 질문과 비슷한 질문을 드려 죄송합니다 (FFT Problem (Returns random results)). 그러나 피치 감지 및 자기 상관을 찾은 후 음조에 대한 코드를 찾았습니다 자기 상관을 이용한 검출.자기 상관은 마이크 입력 (고역 통과 필터 사용)을 사용하여 무작위 결과를 반환합니다.

나는 노래하는 사용자의 음조 탐지를 시도합니다. 문제는 임의의 결과가 계속 반환된다는 것입니다. http://code.google.com/p/yaalp/에서 C++로 변환 한 후 (아래) 수정 한 코드가 있습니다. 내 샘플 속도는 2048이고 데이터 크기는 1024입니다. 저는 사인파와 마이크 입력의 피치를 감지하고 있습니다. 사인파의 주파수는 726.0이며, 722.950820 (이는 괜찮습니다)이지만, 마이크의 피치를 약 100에서 약 1050 사이의 난수로 감지합니다.

나는 지금 하이 패스 필터를 사용하여 DC 오프셋을 제거하지만 작동하지 않습니다. 나는 그것을 올바르게하고 있는가? 그렇다면 그것을 해결하기 위해 무엇을 할 수 있을까? 어떤 도움이라도 대단히 감사하겠습니다! (고정)

감사합니다,

니얼.

편집 : 30hz의 컷오프가있는 고역 통과 필터를 구현하는 코드가 변경되었습니다 (What Are High-Pass and Low-Pass Filters?에서 누구나 고역 통과로 전환하여 저역 통과 필터를 변환하는 방법을 알 수 있습니까?)하지만 여전히 돌아오고 있습니다. 무작위 결과. 그것을 VST 호스트에 연결하고 VST 플러그인을 사용하여 스펙트럼을 비교하는 것은 불행히도 내게 옵션이 아닙니다.

수정 : 모든 도움을 주셔서 감사합니다.하지만 지금은 새로운 코드를 사용하여 작동하지 않습니다.

+1

BTW : 할당 된 메모리를 할당 취소 한 적이 없으므로 메모리 관리가 향상됩니다.하지만 알고 계시고 먼저 알고리즘을 실행하고 싶습니다. 그러나 그것에 대해 잊지 말아야합니다! – mmmmmmmm

+3

왜이 태그가 C++입니까? 이 코드는 C++이 아닙니다. – GManNickG

+0

거기에 하나의 C++ 라인이 없지만 Niall은이 방법을 좋아합니다. – gimpf

답변

0

난 당신의 코드에서 문제를보고하지 않는,하지만 난 C에서 더 잘하지만 난 문제를 찾기 위해 다음과 같은 노력하겠다고 : 데이터

  • 실행 어디 알려진의 결과 , 예. 입력으로 죄 (X) 작은 데이터 크기
  • 실행하여 함께 (예를 들면 2)

알려진 것들과 정확한 결과를 비교. 당신은 인터넷에서 그것들을 찾을 수 있어야합니다.

무작위적인 경우 : 동일한 입력, 다른 출력, 변수의 초기화에 약간의 버그가있을 수 있습니다. 디버거와 알려진 입력을 사용하여 모든 변수, 특히 배열의 모든 요소가 제대로 초기화되었는지 확인하십시오.

+0

사인파에서 입력하면 다소 정확한 결과가되지만 마이크에서 입력하면 약 100에서 약 1050의 결과가 무작위로 나타납니다. 그러나 마이크의 데이터가 정확한지 확인했습니다. – Niall

1

문제는 당신 findBestCandidates에() 함수 :이 함수 내부

당신은 '- 1 길이'까지 0에서 '입력'배열에 액세스 할 수 있습니다. detectPitchCalculation() 함수에서이 함수를 호출하면 'inputs'는 'results'이고 'length'는 'nHiPeriodInSamples'입니다. 그러나 'results'는 'nHiPeriodInSamples - nLowPeriodInSamples - 1'에만 할당되고 채워집니다. 'nLowPeriodInSamples'가 0보다 큰 경우 findBestCandidates() 함수에서 할당되지 않은 임의의 메모리에 액세스합니다!

편집 :

또 다른 버그는 detectPitchCalculation() 함수의 '결과'배열의 각 'nResolution'항목을 기입하지만, '입력'을 통해 findBestCandidates의 각 항목() 함수를 (액세스이다 논의).하지만 'nResolution = 1'로 detectPitchCalculation()을 호출하면 특정 문제가 설명되지 않으므로 조금 더 살펴 보겠습니다. 그러나 더 높은 해상도로 호출하면 문제가 될 수 있습니다.

+0

nHiPeriodInSamples를 nHiPeriodInSamples - nLowPeriodInSamples - 1로 변경했지만 여전히 마이크 입력에 대한 임의의 값을 반환합니다. – Niall

+0

길이가 'nHiPeriodInSamples - nLowPeriodInSamples'이므로 0부터 'nHiPeriodInSamples - nLowPeriodInSamples - 1'까지의 인덱스에 액세스 할 수 있으므로 '- 1'을 남겨 둡니다. 그러나 이것은 당신의 임의적 인 문제를 해결하지 않을 것입니다. 당신의 프로그램을 다시 한번 살펴 보겠습니다. – mmmmmmmm

2

저는 전문가가 아니지만 44100 (초당 샘플을 추측합니다)으로 샘플링하고 1024 개의 데이터 포인트를 사용하고 있습니다. 약 1/40th 초의 데이터로 작업하고 있습니다. 나는 당신이 선택한 곡에 따라 현재 피치가 많이 달라진다는 사실에 놀라지 않습니다. 음성의 평균 피치 또는 주 피치를 찾으려면 약 1 초의 데이터가 필요합니다.

+0

그러면 초당 샘플 수가 많아 지거나 정확도가 떨어질까요? – Niall

+2

@Nail : @Jens가 1024보다 많은 샘플을 필요로한다는 점에서 @Jens가 옳은 것처럼 보입니다. 실수하지 않으면 이전 질문에서 @avakar와 비슷한 표시가 나타납니다. http : // stackoverflow .com/questions/1351381/fft-problem-returns-random-results/1351398 # 1351398 –

1

44.1 kHz 샘플링 빈도에서 1024 샘플은 23 밀리 초 분량의 데이터에 불과합니다. 그것은 인간 가수의 피치를 계산하기에 단순히 데이터가 부족한 것이 아닌가?

나는 23 밀리 초 동안 지속될 수있는 소리는 아마도 내가 피치 조절을 많이하는 것은 아니라는 것을 의미한다. 나는 이런 종류의 측정이 더 오랜 기간에 걸쳐 이루어질 것으로 기대합니다.

+0

초당 더 많은 샘플이 더 정확한 결과를 제공합니까? – Niall

+1

내 사랑, 뭔가를 성문화하기 전에 최소한 이해하기 쉬운 글자가 있어야한다! 더 많은 샘플 -> 더 긴 시간; 초당 더 많은 샘플 : 동일한 양의 샘플에 대한 시간이 짧습니다. 주어진 샘플 양에 대해 초당 샘플 수가 적음 -> 더 많은 시간. – gimpf