簡體   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