Как я могу выполнить преобразование из float -> double -> float при обработке аудио буфера в C ++ - PullRequest
2 голосов
/ 10 марта 2011

В настоящее время я разрабатываю приложение, в котором кадры аудиосэмплов обрабатываются с помощью следующего обратного вызова.

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 с раз в секунду.

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Нет, приведение поплавка к двойному и обратно не будет делать то, что ожидает функция gain (). Функция gain ожидает указатель на массив значений типа double, и никакое количество приведений не сделает этого.

Лучшее, что вы можете сделать, это заменить функцию gain (). Я бы просто использовал «демонстрационный код», который вы включили (внутренний цикл for).

Если у вас есть требование для вызова функции усиления (double *), вы можете сделать либо:

  • создайте второй буфер с размером: malloc(buffer.getNumSamples()*sizeof(double)) и скопируйте их вручную (memcpy не работает, потому что он не генерирует четыре нулевых байта, которые вам нужны между каждым числом с плавающей запятой).

  • [hack]: просто используйте буфер, который у вас есть, но установите для каждого второго числа с плавающей запятой значение 0, а затем знак расширяйте другой объект с плавающей точкой на этот. Это фактически уменьшает вдвое количество сэмплов, но накладных расходов очень мало.

2 голосов
/ 10 марта 2011

Указанная функция принимает double или double*?В последнем случае всегда требуется копировать все данные channelData в буфер double и наоборот после запуска функции.Если вы действительно хотите эффективный способ, вам нужно (скопировать и) изменить проблемную функцию, чтобы она взяла float* intead из double*

, если функция просто принимает double, явное преобразование не требуется.

...