繁体   English   中英

在C ++中处理音频缓冲区时,如何从float-> double-> float执行转换

[英]How can I perform conversion from float -> double -> float when processing an audio buffer in c++

我目前正在开发一个应用程序,其中在以下回调中处理音频样本的帧。

void Eav07AudioProcessor::processBlock (AudioSampleBuffer& buffer)
{

    for (int channel = 0; channel < getNumInputChannels(); ++channel)
    {
        float* channelData = buffer.getSampleData (channel);        

        // ..do something to the data...
        DoSomeHeavyweightDSPon(&channelData[0]); // in the header, DoSomeHeavyweightDSPon(double data[somebignumber])
    }
}

将代替上面的增益过程的函数期望channelData是双精度的。 channelData参数为浮点精度。 我是否需要在处理后以某种方式将channelData从float转换为double,然后从double转换为float,还是我错过了一个窍门。

如果必须进行显式转换,考虑到此方法每秒被调用100次,最有效的方法是什么。

提到的功能是double还是double*吗? 后一种情况总是需要将所有channelData复制到一个double缓冲区中,反之亦然。 如果您确实想要一种有效的方法,则需要(复制并)更改有问题的函数以将float*double*

如果函数仅使用double ,则不需要显式转换。

不可以,将float转换为double并返回将不会达到gain()函数所期望的。 增益函数需要一个指向double数组的指针,并且没有大量的强制转换可以做到这一点。

您可以做的最好的事情是替换gain()函数。 我只会使用您包含的“演示代码”(内部for循环)。

如果需要调用gain(double *)函数,则可以执行以下任一操作:

  • 创建一个大小为malloc(buffer.getNumSamples()*sizeof(double))的第二个缓冲区,然后手动复制它们(memcpy无法正常工作,因为它不会在每个float之间生成您需要的四个零字节)。

  • [hack]:仅使用您拥有的缓冲区,但是将第二个浮点数设置为0,然后用符号将另一个浮点数扩展到该浮点数中。 这样可以有效地将您拥有的样本数量减半,但开销却很小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM