[英]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.