更高效的int to double - PortAudio,FFTW - C / C ++
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更高效的int to double - PortAudio,FFTW - C / C ++相关的知识,希望对你有一定的参考价值。
我编写了一个程序来使用PortAudio打开音频流,获取数据缓冲区,并使用FFTW3库对这些数据进行FFT。在完整程序中,然后处理FFT数据并且程序重复直到用户停止。我能够让PortAudio和FFTW一起工作的唯一方法是将PortAudio数据(带符号的16位int,paInt16)转换为double,如下所示:
/* 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(流),处理并重复。保持流打开并在必要时调用回调函数似乎更有效。你告诉我!
感谢您的帮助,如果有更多信息有益,请告诉我。
将短整数转换为双精度将非常快。你有没有想过这个?你知道这是不是一个瓶颈?
Pa_ReadStream可能更符合你的需求,而不是使用回调。然后你可以填充缓冲区并将其处理到位。
以上是关于更高效的int to double - PortAudio,FFTW - C / C ++的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to Entities 无法识别方法 Double Round(Double, Int32, System.MidpointRounding) 方法
如何更改snakeyaml中的隐式类型(int to double)
将 NSNumber 更改为 Int/Double 后的错误
.build_release/lib/libcaffe.so: undefined reference to `cv::VideoCapture::set(int, double)'