![](/img/trans.png)
[英]How do I perform a narrowing conversion from double to float safely?
[英]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.