vDSP Biquad Удаление переходных сигналов Swift - PullRequest
1 голос
/ 07 августа 2020

Я использую Apple Accelerate Framework, biquad-функцию vDSP https://developer.apple.com/documentation/accelerate/1450838-vdsp_biquad?language=objc#parameters для имитации функции sosfilt питонов. Я выполнил всю фильтрацию, но заметил, что у меня есть переходные сигналы, которые я пытаюсь удалить. В python это делается путем нахождения начальных условий из sosfilt_zi https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.sosfilt_zi.html#scipy .signal.sosfilt_zi и умножения на первый элемент данных, которые фильтруются. Я следил за этим удивительным примером реализации функции Matlab Filtfilt () в Java.

Когда я распечатываю начальные условия в python, используя sosfilt_zi , я получение двух значений для каждого раздела (я использую каскад второго порядка), поэтому у меня всего четыре значения.

Однако в одноканальной функции biquad для iOS они просят (2 * M) + 2 для задержки. Я предполагал, что начальные условия связаны с задержкой и что это то, что мне нужно будет изменить, чтобы настроить свой сигнал и удалить переходный процесс.

Определение функции для параметра задержки для биквадратной функции in iOS - «Массив значений с одинарной точностью, инициализированный данными« прошлого »состояния прямой формы 1 для каждого раздела биквада. Длина массива должна быть (2 * M) + 2, где M - это количество секций. Для каждой секции m, Delay [2 m: 2 m + 1] представляет два задержанных входных значения для секции m и Delay [2 M: 2 M + 1 ] представляют два задержанных выходных значения фильтра. После выполнения этой функции этот массив содержит данные окончательного состояния фильтров. "

Если у меня 2 секции, то мой массив задержки должен выглядеть так:

[0: 1] - значение задержки на входе для раздела 0

[2: 3] - значение задержки на входе для раздела 1

[4: 5] - значение задержки на выходе

Изначально я установил задержку на массив из 6 нулей. Если выходные данные sosfilt_zi будут подходящими значениями для двух входных секций задержки, то как я могу найти значения задержанного выхода фильтра?

Кто-нибудь знаком с vDSP и можно удалить переходные сигналы или можно объяснить, как настроить значения задержки для каскадных секций второго порядка? Корректировка значений задержки - правильный ход, и как я могу получить эти значения в python?

Я думал, что мой массив задержки будет выглядеть (с использованием значений, показанных во второй ссылке ниже):

[0,72095219 -0,28358224] - раздел 0

[- 0,80004591 0,80004591] - раздел 1

Однако я не знаю, что это будет за результат, если это вообще правильно. Буду признателен за любую помощь! Я нашел очень мало документации или примеров по функции iOS biquad. Спасибо!

Полосовой фильтр Баттерворта - применяются начальные условия

Вывод sosfilt_zi - дает начальные условия

Результат Biquad Filter из iOS vDSP вверху и результат sosfilt с начальными условиями внизу

Задержки инициализируются

Biquad Функция

...