Разбираюсь с реализацией режекторного фильтра для входных IQ сигналов (notch filter), пытаюсь понять, как именно происходит удаление пиков спектра. Если вопрос не по теме форума, может быть, подскажете, куда лучше обратиться?
Разбираюсь вот по этой реализации —
https://github.com/pabr/leansdr/blob/master/src/leansdr/sdr.h
Как я понял, происходит следующее:
Находим индекс ДПФ (бин m), для которого самая большая амплитуда. Для этого бина вычисляем все N отсчетов комплексной гармоники: cos(2pinm/N) и sin(2pinm/N).
Пусть входному отсчету (re, im) соответствует отсчет гармоники (s.re, s.im). Вычисляем комплексные значения:
bb = (re * s.re + im * s.im, -re * s.im + im * s.re);
estim = (bb.re * k + estim.re * (1-k), bb.im * k + estim.im * (1-k));
sub = (estim.re * s.re – estim.im * s.im, estim.re * s.im + estim.im * s.re);
out = (re – sub.re, im – sub.im);
С estim в первом приближении вроде понятно, это фильтр первого порядка для входных отсчетов bb. Значение k определяет скорость затухания после частоты срезы. С out тоже вроде понятно, тут убираем пиковое значение.
После ряда математических операций, если я всё правильно понял, выходит, что estım — это результат применения фильтра с импульсной характеристикой h(k) = alfa * (1 – alfa)^k. Что это даёт — не знаю.
Вопрос: что означают указанные формулы для вычисления bb и sub? Где можно почитать теорию применительно к тому, как на с++ написать режекторный фильтр? И вообще, теорию режекторного фильтра применительно к IQ сигналам. Каким образом, «на пальцах», указанные вычисления удаляют пик спектра?