2013-09-21 3 views
3

프로젝트에 을 설정하려고하고 실제로 상황에 대한 명확한 그림을 얻지 못했습니다 ... 기본적으로 Audio Units에서 데이터를 가져옵니다. 장치의 마이크. 그런 다음 해당 데이터에 FFT을 보내고 자합니다. 이것은 내가 지금까지 이해하고있는 것입니다 : 나는 데이터를 위해 원형 버퍼를 셋업해야한다. 채워진 각 버퍼에서 Hann window을 적용한 다음 FFT을 수행합니다. 그러나, 나는 여전히 중첩에 대한 도움이 필요하다. 보다 정확한 결과를 얻으려면, 나는 windowing을 사용하고 있기 때문에 이것을 expecially 사용해야한다는 것을 이해합니다. 그러나, 나는이 아무것도 찾을 수 없습니다 ... 가 여기에 지금까지 (피치 검출에 사용) 한 내용은 다음과 같습니다Apple의 Accelerate 프레임 워크, FFT, Hann 윈도우 잉 및 겹치기 사용

// Setup ------------- 
UInt32 log2N   = 10; // 1024 samples 
UInt32 N    = (1 << log2N); 
FFTSetup FFTSettings = vDSP_create_fftsetup(log2N, kFFTRadix2); 
COMPLEX_SPLIT FFTData; 
FFTData.realp   = (float *) malloc(sizeof(float) * N/2); 
FFTData.imagp   = (float *) malloc(sizeof(float) * N/2); 
float * hannWindow = (float *) malloc(sizeof(float) * N); 

// create an array of floats to represent a hann window 
vDSP_hann_window(hannWindow, N, 0); 

// FFT Time ---------- 
// Moving data from A to B via hann window 
vDSP_vmul(A, 1, hannWindow, 1, B, 1, N);         

// Converting data in B into split complex form 
vDSP_ctoz((COMPLEX *) B, 2, &FFTData, 1, N/2); 

// Doing the FFT 
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Forward); 

// calculating square of magnitude for each value 
vDSP_zvmags(&FFTData, 1, FFTData.realp, 1, N/2); 

// Inverse FFT 
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Inverse); 

// Storing the autocorrelation results in B 
vDSP_ztoc(&FFTData, 1, (COMPLEX *)B, 2, N/2); 

vDSP_Length lastZeroCrosssing; 
vDSP_Length zeroCrossingCount; 
vDSP_nzcros(B, 1, N, &lastZeroCrossing, &zeroCrossingCount, N); 

// Cleanup ----------- 
vDSP_destroy_fftsetup(FFTSettings); 
free(FFTOutput.realp); 
free(FFTOutput.imagp); 
free(hannWindow); 

어디 내가 중복 방법을 포함 할 것이다? 또한 모든 코드 스 니펫이 환영받을 것입니다. 감사합니다

UPDATE :

이 프로젝트의 최종 목표는 그래서 가능한 한 정확한 결과를 필요로 가능한 한 실시간에 가까운 오디오의 지문을 수행하는 것입니다 - 따라서 중복을. 이 목적을 위해 실제로 모든 부분을 역으로 정리할 수 있다고 생각합니다.

답변

1

실제로는 이 필요하지 않습니다. 일반적으로은 겹칠 필요가 있습니다. 일반적으로 프레임은 겹쳐서 시간 축에서 더 높은 해상도를 제공합니다. 스펙트로 그램을 음모를 꾸미거나 노트 시작 시간을 예측할 수 있습니다. 덜 복잡하기 때문에 지금은 중복되지 않고 코드를 작동시킨 다음 나중에 시간 축에서 더 높은 해상도가 필요한지 여부를 결정할 수 있습니다.

당신이 다음 중복 추가 하시겠습니까 결정하는 경우 다음과 같이 두 개의 완전한 버퍼를 처리합니다 각각의 새로운 버퍼 다음 이전 버퍼의 덩어리 (예 : 50 %)을 저장해야합니다

    새로운 버퍼의 이전 완충액 + 50 %의 제
  • 프로세스 마지막 50 %
  • 프로세스 새로운 버퍼 100 %
  • 당 다른 오버랩 다음 반복

새로운 버퍼의 마지막 50 % 저장

  • 비슷한 논리가 적용됩니다.

    특정 지점을 초과하여 중복이 증가하면 해상도가 거의 향상되지 않아 필요한 처리 대역폭이 크게 증가하므로 역효과가 발생할 수 있습니다.

  • +0

    질문에 대한 업데이트를 참조하십시오. 감사합니다 –

    +0

    확인 - 겹치는 방법에 대한 내 대답의 마지막 부분을 참조하십시오. –

    +0

    샘플 속도를 일반적인 44.1KHz 대신 약 16kHz로 낮추려고합니다. 이렇게하면 처리 대역폭을 크게 늘리지 않고도 더 큰 겹침을 추가 할 수 있습니다. 어쨌든 이것을 시도하고 어떻게되는지 알려줄 것입니다. –