2015-02-08 2 views
2

Я совершенно не знаком с рамкой vdsp, и я стараюсь учиться, создавая. Моя цель для сигнала, который будет обработан следующим образом:Обработка звука с ускорением и vDSP_desamp()

  1. сотого порядка Полосовой FIR
  2. даунсамплинга фактором: 2

Из того, что я мог понять из документации Apple, функция vDSP_desamp() это то, что я ищу (он может делать оба шага в одно и то же время, верно?)

Как я могу использовать это правильно?

Вот мои мысли: Дано AudioBufferList *audio и массив коэффициентов фильтра filterCoeffs с длиной [101]:

vDSP_desamp((float*)audio->mBuffers[0].mData, 2, &filterCoeffs, (float*)audio->mBuffers[0].mData, frames, 101); 

это было бы правильное использование метода? Нужно ли мне реализовать круговой буфер для этого процесса? Любое руководство/направление/указатель на что-то прочитанное было бы очень желанным. спасибо

ответ

1

Чтение документации, vDSP_desamp() действительно представляет собой сложную прореживание и операцию FIR. Совместная работа - это хорошая идея, так как она уменьшает доступ к памяти, и есть возможности для устранения большого количества вычислений.

Предполагается, что FIR-фильтр был переработан с (P-1)/2 групповой задержкой. Следствием этого является то, что для расчета C(n) функция должна иметь доступ к A(n*I+p)

Где (используя терминологию документации):

`A[0..x-1]`: input sample array 
`C[0..n-1]`: output sample array 
`P`: number of filter coefficients 
`I`: Decimation factor 

Очевидно, что если вы передаете буфер CoreAudio к этому, он будет работать от конца буфера на 200 входных выборок. В лучшем случае, уступая 100 образцам мусора, а в худшем случае SIGSEGV.

Итак, простой ответ НЕТ. Вы не можете использовать только vDSP_desamp().

варианты:

  • Соберите образцы необходимые в буфер, а затем вызвать vDSP_desamp() для N выходных отсчетов. Это связано с копированием образцов из двух буферов CoreAudio. Если вы беспокоитесь о задержке, вы перепрограммируете FIR для использования 100 предыдущих образцов, иначе они могут поступать из следующего буфера.

  • Используйте vDSP_desamp() за то, что вы можете сделать, и рассчитать более сложный случай, когда фильтр обертывается над двумя буферами.

  • два вызова vDSP_desamp() - один с легкими случае, а другим с собранным входным буфером, где образцы обертывают соседнего CoreAudio буфера

Я не понимаю, как вы можете использовать круговой буфер Решите эту проблему: у вас все еще есть случай, когда буфер обертывается, и все равно нужно скопировать все образцы в него.

Это скорее зависит от размера звуковых буферов, представленных CoreAudio. Моя догадка заключается в том, что для небольших буферов и небольшой длины фильтра vDSP_desamp(), возможно, не стоит того, но вам нужно будет точно измерить.

Когда я реализовал подобные вещи в прошлом на iOS, я обнаружил, что ручная дециметровая и фильтровальная операциябыла довольно незначительной в великой схеме вещей и не беспокоила дальнейшую оптимизацию ,

+0

Спасибо за разъяснение! Думаю, я тоже пойду с ручным решением. – Kaitis

Смежные вопросы