iPhone 용 Demetri의 Pitch Detector 프로젝트를 구현했으며 두 가지 문제를 해결했습니다. 1) 어떤 종류의 배경 소음이라도 바나나를 읽는 주파수를 보내고 2) 낮은 주파수의 소리는 올바르게 핏치 않고 있습니다. 나는 조정에 내 기타를 시도하고 높은 문자열 일 동안 - 튜너가 제대로iPhone에서 FFT를 사용하여 배경 잡음을 무시하고 낮은 피치를 찾습니다.
피치 감지 코드는 RIOInterface.mm에 위치하고 있으며, 이런 식입니다 낮은 E.을 ... 식별 할 수
// get the data
AudioUnitRender(...);
// convert int16 to float
Convert(...);
// divide the signal into even-odd configuration
vDSP_ctoz((COMPLEX*)outputBuffer, 2, &A, 1, nOver2);
// apply the fft
vDSP_fft_zrip(fftSetup, &A, stride, log2n, FFT_FORWARD);
// convert split real form to split vector
vDSP_ztoc(&A, 1, (COMPLEX *)outputBuffer, 2, nOver2);
라고 Demetri는 다음과 같이 '지배적 인'주파수를 결정하기 위해 계속 : 시작하기
float dominantFrequency = 0;
int bin = -1;
for (int i=0; i<n; i+=2) {
float curFreq = MagnitudeSquared(outputBuffer[i], outputBuffer[i+1]);
if (curFreq > dominantFrequency) {
dominantFrequency = curFreq;
bin = (i+1)/2;
}
}
memset(outputBuffer, 0, n*sizeof(SInt16));
// Update the UI with our newly acquired frequency value.
[THIS->listener frequencyChangedWithValue:bin*(THIS->sampleRate/bufferCapacity)];
, 나는 내가 저역 통과 필터를 적용 할 필요가 믿고 ...하지만 나는 FFT 전문가 아니에요하지 vDSP 함수에서 반환 된 데이터에 대해 정확히 어디서 어떻게 처리해야하는지 에스. 낮은 주파수에서 코드의 정확도를 높이는 방법을 모르겠습니다. 지배적 인 주파수를 결정하는 다른 알고리즘이있는 것처럼 보이지만, Apple Accelerate 프레임 워크가 반환 한 데이터를 사용할 때 올바른 방향으로 걷어차기를 찾으십시오.
UPDATE :
프레임 워크가 실제로 어떤 윈도우 기능이 가속화 할 수 있습니다. I 설정 I는 다음 vDSP_ctoz 기능 전에
vDSP_vmul(outputBuffer, 1, window, 1, transferBuffer, 1, windowSize);
를 삽입하여 적용이
windowSize = maxFrames;
transferBuffer = (float*)malloc(sizeof(float)*windowSize);
window = (float*)malloc(sizeof(float)*windowSize);
memset(window, 0, sizeof(float)*windowSize);
vDSP_hann_window(window, windowSize, vDSP_HANN_NORM);
같은 기본 창. 그런 다음 나머지 코드를 outputBuffer 대신 'transferBuffer'를 사용하도록 변경합니다. 그러나 지금까지 최종 피치 추측에는 큰 변화가 없었습니다.
내가 몇 년 전이 물건을 가지고 노는 것을 기억하는 두 가지 사실 : 미리 결정된 양에서 원시 입력 데이터를 빼는 것만으로 배경 음향에 대한 스켈치 레벨을 설정할 수 있습니다 (그림에서 확인할 때까지는 추측 할 수 있음). 좋은 알고리즘을 벗어남), 0보다 낮은 값을 0으로 설정하고 주파수를 낮추면 어떤 이유로 기억이 안나고 소리가 큰만큼 등록하지 않으므로 비교하기 전에 저주파수 볼륨을 기하 급수적으로 확장해야합니다 더 높은 우세 주파수. –
FFT를하기 전에 적절한 창 기능을 적용하지 않는 것 같습니다. 따라서 파워 스펙트럼에 인공물이 많아서 피치 감지에서 어떤 종류의 시도도 엉망이 될 것입니다. –
다음은 비슷한 대답으로 거의 중복되는 질문입니다 : http://stackoverflow.com/questions/4227420/matlab-missing-fundamental-from-an-fft – hotpaw2