我编写了一个程序来使用PortAudio打开音频流,获取数据缓冲区,并使用FFTW3库对这些数据进行FFT。在完整程序中,然后处理FFT数据并且程序重复直到用户停止。我能够让PortAudio和FFTW一起工作的唯一方法是将PortAudio数据(带符号的16位int,paInt16)转换为双倍:
/* 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++;
}
由于这个过程不断重复,速度非常迫切,我想知道是否有人对更有效的转换方法有所了解,或者更优选的是,根本没有转换。由于FFTW要求您预先分配输入/输出缓冲区并创建FFT计划,我最初的想法是给PortAudio提供输入缓冲区的地址,但PortAudio没有双输入类型。
我也在寻找一种更有效的录音方式。当前进程正在调用PaStartStream(流),等待缓冲区填充,调用PaStopStream(流),处理并重复。保持流打开并在必要时调用回调函数似乎更有效。你告诉我!
感谢您的帮助,如果有更多信息可以帮助我,请告诉我。
答案 0 :(得分:0)
将短整数转换为双精度将非常快。你有没有想过这个?你知道它是不是一个瓶颈?
Pa_ReadStream可能更符合您的要求,而不是使用回调。然后你可以填充缓冲区并将其处理到位。