2013-02-21 2 views
0

프로젝트에 FftPitchDetector.cs를 추가했지만 사용 방법을 잘 모르겠습니다.C#에서 FftPitchDetector 구현

내 코드 : 나는 내 PitchDetect.DetectPitch (XXXXXX, XXXXXXXXXXX)을 넣어해야 매개 변수

private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) 
     { 

      if (waveWriter == null) return; 

      byte[] buffer = e.Buffer; 

      float sample32 = 0; 
      int bytesRecorded = e.BytesRecorded; 
      float[] floats = new float[buffer.Length]; 


      waveWriter.Write(buffer, 0, bytesRecorded); 

      for (int index = 0; index < e.BytesRecorded; index += 2) 
      { 

       short sample = (short)((buffer[index + 1] << 8) | 
             buffer[index + 0]); 
       sample32 = sample/32768f; 
       sampleAggregator.Add(sample32); 
      } 
      floats = bytesToFloats(buffer); 

      FftPitchDetector PitchDetect = new FftPitchDetector(sample32); 
      **PitchDetect.DetectPitch(XXXXXX, XXXXXXXXXXX);** 

      } 

     private static float[] bytesToFloats(byte[] bytes) 
     { 
      float[] floats = new float[bytes.Length/2]; 
      for (int i = 0; i < bytes.Length; i += 2) 
      { 
       floats[i/2] = bytes[i] | (bytes[i + 1] << 8); 
      } 

      return floats; 
     } 

; ??

어떻게 FFTPitchDetector.cs를 사용하여 입력 주파수를 얻을 수 있습니까?

감사합니다.

+1

여기서 'FftPitchDetector.cs' 어디에서? 링크를 제공하는 데주의를 기울이시겠습니까? – Pete

+0

https://hg01.codeplex.com/voicerecorder/rev/bb6af2fb777c 2.1 2.53 –

답변

1

이 코드의 작동 방식을 설명하는 첨부 문서를 작성했으며 here에 액세스 할 수 있습니다. 기본적으로 배열의 샘플을 전달하고, 배열에 몇 개의 샘플이 있는지 나타내는 숫자 (배열의 길이와 같지 않을 경우)를 전달합니다. 주파수를 Hz로 반환합니다. 그러나이 코드는 음표를 선택하려고 시도하는 것이므로 자동 조율 효과를 위해 음높이를 조절할 수있는 양을 계산할 수 있으므로 특정 범위의 값만 찾고 실제로 반환하지 않을 수도 있음을 기억하십시오 들어오는 신호에서 가장 큰 주파수.

+0

나는이해야 할 노력했다 때까지 '** PitchDetect.DetectPitch (수레, 8820),' 오류 : IndexOutOfRangeException이 포인팅 : fftBuffer [p1 ++] = fftBuffer [p2]; SmbPitchShift.cs 에 이 시도 : 'PitchDetect.DetectPitch (플로트, 8821) ' 오류 : IndexOutOfRangeException이 가리키는 : N ( 'fftBuffer [N * 2 = 버퍼 [N-inFrames * 창이 프레임); in FftPitchDetector.cs 이 문제를 해결하는 방법? –

+0

FFT의 경우, 전달하는 샘플 수는 2의 거듭 제곱이어야합니다. SampleAggregator가 수행하는 작업 중 하나입니다. 한 번에 1024 개 샘플을 일괄 처리합니다. –

+0

설명 한 내용에 대한 그림을 얻을 수 없으며 코드를 설명하고 코드에서 설명하겠습니까? 위 코드에서 수정하면 더 좋을 수 있습니다. 저는 오디오 프로그래밍을 처음 접했고, 프로젝트를 빨리 끝내야 할 때가 있습니다. 현재 상황에서 작동하는 대신 사용하는 방법에 대해 자세히 알고 싶습니다. 프로젝트를 제출 한 후에이 내용을 더 잘 이해할 것입니다. 왜냐하면이 모든 것이 매우 흥미 롭기는하지만 그래도 프로젝트를 제 시간에 제출해야합니다. 불편을 끼쳐 드려 죄송합니다. Btw, 정말 멋지다! :디 –