2014-02-28 3 views
2

PortAudio를 사용하여 오디오 스트림을 열고, FFTW3 라이브러리를 사용하여 데이터 버퍼링 및 FFT를 수행하는 프로그램을 작성했습니다. 전체 프로그램에서 FFT 데이터가 처리되고 사용자가 중지 할 때까지 프로그램이 반복됩니다. 과정이 지속적으로 반복과 속도이기 때문에더 효율적인 int double - PortAudio, FFTW - C/C++

/* Create left and right array -- int to double */ 
    k = 0; 
    for (i=0; i<data.maxFrameIndex*2; i++) { 
     myData.inL[k] = data.recordedSamples[i]; // myData is type double 
     i++; 
     myData.inR[k] = data.recordedSamples[i]; 
     k++; 
    } 

을 : 나는 PortAudio 및 FFTW 함께 작업을 얻을 수 있었던 유일한 방법은 PortAudio 데이터를 변환하는 것이었다과 같은 두 배로 (16 비트 INT, paInt16 서명) 꽤 긴급하게, 나는 누군가가 더 효율적인 전환 방법에 관한 아이디어를 갖고 있는지 궁금해했다. 또는 더 바람직하게는 전혀 변환하지 않았다. FFTW는 입출력 버퍼를 미리 할당하고 FFT 계획을 작성해야하므로 필자의 원래 생각은 PortAudio에 입력 버퍼의 주소를 지정하는 것이지만 PortAudio에는 이중 입력 유형이 없습니다.

나는 오디오를 녹음하는보다 효율적인 방법을 찾고 있습니다. 현재 프로세스는 PaStartStream (stream)을 호출하고, 버퍼가 채워지기를 기다리며, PaStopStream (stream)을 호출하고, 처리하고 반복합니다. 스트림을 열린 채로두고 필요에 따라 콜백 함수를 호출하는 것이 더 효율적으로 보입니다. 당신이 말해!

도움을 주셔서 감사합니다. 더 많은 정보가 도움이 될 경우 알려 주시기 바랍니다.

답변

0

짧은 int를 double로 변환하면 매우 빠릅니다. 이걸 프로파일 했니? 그것이 병목 현상인지 아십니까?

Pa_ReadStream은 콜백을 사용하지 않고 원하는 것 이상일 수 있습니다. 그런 다음 버퍼를 채우고 제 위치에서 처리 할 수 ​​있습니다.