我目前正在开发一个应用程序,其中音频样本的帧在以下回调中处理。
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次,最有效的方法是什么。
答案 0 :(得分:2)
上述功能是double
还是double*
?
后一种情况总是需要将所有channelData复制到double
缓冲区,反之亦然。
如果您真的想要一种有效的方法,则需要(复制并)更改有问题的函数以使float*
整数为double*
如果函数只需double
,则不需要显式转换。
答案 1 :(得分:2)
不,将浮动转换为double和back将不会执行gain() - 函数所期望的操作。增益函数需要指向一个双精度数组的指针,没有任何数量的强制转换会这样做。
你能做的最好的事情就是替换gain() - 函数。我只想使用你包含的“演示代码”(内部for循环)。
如果您需要调用增益(双*) - 函数,您可以执行以下任一操作:
创建一个大小为malloc(buffer.getNumSamples()*sizeof(double))
的第二个缓冲区并手动复制它们(memcpy不起作用,因为它不会在每个浮点数之间生成四个零字节)。
[hack]:只需使用你拥有的缓冲区,但是将每一个浮点数设置为0,然后将另一个浮点符号扩展为此缓冲区。这有效地减少了您拥有的样本数量,但开销很小。