Чтение документации, 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, я обнаружил, что ручная дециметровая и фильтровальная операциябыла довольно незначительной в великой схеме вещей и не беспокоила дальнейшую оптимизацию ,
Спасибо за разъяснение! Думаю, я тоже пойду с ручным решением. – Kaitis