如何从float执行转换 - >双 - >在c ++中处理音频缓冲区时浮动

时间:2011-03-10 12:55:08

标签: c++ audio audio-streaming

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

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参数是float精度。我是否需要以某种方式将channelData从float转换为double,然后在处理后从double转换为float,或者我错过了一个技巧。

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

2 个答案:

答案 0 :(得分:2)

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

如果函数只需double,则不需要显式转换。

答案 1 :(得分:2)

不,将浮动转换为double和back将不会执行gain() - 函数所期望的操作。增益函数需要指向一个双精度数组的指针,没有任何数量的强制转换会这样做。

你能做的最好的事情就是替换gain() - 函数。我只想使用你包含的“演示代码”(内部for循环)。

如果您需要调用增益(双*) - 函数,您可以执行以下任一操作:

  • 创建一个大小为malloc(buffer.getNumSamples()*sizeof(double))的第二个缓冲区并手动复制它们(memcpy不起作用,因为它不会在每个浮点数之间生成四个零字节)。

    < / LI>
  • [hack]:只需使用你拥有的缓冲区,但是将每一个浮点数设置为0,然后将另一个浮点符号扩展为此缓冲区。这有效地减少了您拥有的样本数量,但开销很小。