Бахурин Сергей » 22 окт 2021, 11:57
Во-первых огромнейшее спасибо за очень ценные замечания. Алгортим для нецелых k довольно интересный. Надо будет дописать замечания по этому поводу. И очень редко встречаются такие исчерпывающие комментарии!
Но тем не менее, есть у меня одно такое большое НО!
Смотрите действительно если добавить в вектор входного сигнала 0, то, как вы верно сказали все заколосится:
X = filter(b_opp, a_opp, [s 0]);
А теперь представим: идет поток данных на вход рекурсвного фильтра (скажем фильтр реализован в FPGA и вся схема работает синхронно как конвейер, т.е. каждый такт на входе появляется новый отсчет, и на выходе фильтра отсчет данных).
Каждые N отсчетов на выходе получается одно значение спектра с точностью до фазы.
Теперь для того чтобы строку X = filter(b_opp, a_opp, [s 0]) реализовать, нужно каким то образом пропустить N+1 первый отсчет и впихнуть вместо него 0. Т.е. мы должны потерять N+1 отсчет данных из потока, потому что для оценки согласно приведенной строки, размерность вектора s стала уже не N а N+1. Все это видится как-то кривенько. Почему я не могу подать на вход фильтра поток и каждые N тактов получать выход DFT?
При этом в структуре приведенны в моей статье ничего пропускать (или впихивать дополнительный ноль) не придется, каждые N тактов на выходе будет корректный отсчет спетра.
При этом надо заметить, что умножение выхода фильтра из моей статьи на сайте на коррекцию exp(-j*2*pi*k) также возвращает валидное значение для дробного k, проверил через интерполяционную формулу Дирихле, а также с функцией
goertzel_non_integer_k(x,k) из статьи Лайноса. Тогда при целых k этот корректор вырождается в 1 и перестает влиять.
[b][color=#FF0000]Во-первых огромнейшее спасибо за очень ценные замечания. Алгортим для нецелых k довольно интересный. Надо будет дописать замечания по этому поводу. И очень редко встречаются такие исчерпывающие комментарии![/color][/b]
Но тем не менее, есть у меня одно такое большое НО!
Смотрите действительно если добавить в вектор входного сигнала 0, то, как вы верно сказали все заколосится:
X = filter(b_opp, a_opp, [s 0]);
А теперь представим: идет поток данных на вход рекурсвного фильтра (скажем фильтр реализован в FPGA и вся схема работает синхронно как конвейер, т.е. каждый такт на входе появляется новый отсчет, и на выходе фильтра отсчет данных).
Каждые N отсчетов на выходе получается одно значение спектра с точностью до фазы.
Теперь для того чтобы строку X = filter(b_opp, a_opp, [s 0]) реализовать, нужно каким то образом пропустить N+1 первый отсчет и впихнуть вместо него 0. Т.е. мы должны потерять N+1 отсчет данных из потока, потому что для оценки согласно приведенной строки, размерность вектора s стала уже не N а N+1. Все это видится как-то кривенько. Почему я не могу подать на вход фильтра поток и каждые N тактов получать выход DFT?
При этом в структуре приведенны в моей статье ничего пропускать (или впихивать дополнительный ноль) не придется, каждые N тактов на выходе будет корректный отсчет спетра.
При этом надо заметить, что умножение выхода фильтра из моей статьи на сайте на коррекцию exp(-j*2*pi*k) также возвращает валидное значение для дробного k, проверил через интерполяционную формулу Дирихле, а также с функцией
goertzel_non_integer_k(x,k) из статьи Лайноса. Тогда при целых k этот корректор вырождается в 1 и перестает влиять.