【发布时间】:2014-04-02 00:47:02
【问题描述】:
我编写了一个程序来使用 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(stream),等待缓冲区填充,调用 PaStopStream(stream),处理并重复。让流保持打开状态并在必要时调用回调函数似乎更有效。你告诉我!
感谢您的帮助,如果更多信息对您有帮助,请告诉我。
【问题讨论】:
标签: type-conversion fftw processing-efficiency portaudio