Разбираюсь с реализацией режекторного фильтра для входных 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 сигналам. Каким образом, «на пальцах», указанные вычисления удаляют пик спектра?
P> bb = (re * s.re + im * s.im, -re * s.im + im * s.re);
P> estim = (bb.re * k + estim.re * (1-k), bb.im * k + estim.im * (1-k));
P> sub = (estim.re * s.re – estim.im * s.im, estim.re * s.im + estim.im * s.re);
P> out = (re – sub.re, im – sub.im);
P>
P>Вопрос: что означают указанные формулы для вычисления bb и sub? Где можно почитать теорию применительно к тому, как на с++ написать режекторный фильтр? И вообще, теорию режекторного фильтра применительно к IQ сигналам. Каким образом, «на пальцах», указанные вычисления удаляют пик спектра?
Тут вроде всё очевидно. Вот смотри пусть у тебя есть вектор a и орт s.
мы хотим убрать компоненту s из a. a это a0*s+a1*ns где ns ортогонален s, т.е. (ns,s)=0
r=a-(a,s)*s
где (a,s) это скалярное произведение. только вместо скалярного произведения используется сглаженное значение
e=e*q+(a,s)*(1-q)
r=a-(e*s)*s
Конкретнее:
a=(re,im) s=(re,im) e=estim=(re,im) r=out=(re,im) — комплексные числа
bb = <a|s> = conj(a)*b
e = e*(1-k) + k*bb
sub = e*s
out = a — sub
где: k=1-exp(ln(th)/n)
n-длинна истории, th=1e-3 порог (например шум к полезному сигналу),т.е. вклад за n шагов упадет до th.
Если s периодический сигнал то n должно быть порядка периода, например n=7*T
Здравствуйте, kov_serg, Вы писали:
_>Тут вроде всё очевидно.
Спасибо! С листком бумаги пересчитал все формулы, всё сошлось, разобрался. Без этой информации я бы еще долго голову ломал, чтобы свести всё воедино. В литературе такого лаконичного объяснения не попадалось.
P>Спасибо! С листком бумаги пересчитал все формулы, всё сошлось, разобрался. Без этой информации я бы еще долго голову ломал, чтобы свести всё воедино. В литературе такого лаконичного объяснения не попадалось.
Здравствуйте, Sharov, Вы писали:
S>Попробовали бы спросить у какого-нибудь DeepSeek.
Ответ выше не хуже и даже лучше. Четко, ясно, кратко — не убавить, не прибавить. Дипсик обычно еще воды много наливает в свой ответ.
Здравствуйте, Vzhyk2, Вы писали:
V>Ответ выше не хуже и даже лучше. Четко, ясно, кратко — не убавить, не прибавить. Дипсик обычно еще воды много наливает в свой ответ.
Согласен. Попробовал ChatGPT — лучше, чем ничего, но хуже ответа из этой темы. Хотя с помощью уточняющих вопросов, при отсутствии другой информации, в качестве помощника вполне можно использовать.