Инверсный фильтр

From
Evgenij Masherov (2:5020/175.2)
To
Igor Rudym
Date
2002-12-24T14:22:29Z
Area
RU.ALGORITHMS
From: "Evgenij Masherov" <EMasherow@nsi.ru>

Tue Dec 24 2002 11:01, Igor Rudym wrote to All:

 
 IR> фомула следующая
 IR> W(w) = G(w)/K(w)

 IR> где  G = FFT(g); g = k*y;
 IR> y - начальный вектор, k - орератор преобразования (например смаза)

 IR> y(s) = FFT(W)    - восстановленый вектор (должен быть равен начальному)

 IR> реализую следующим образом:

 IR> CVector Restore(CVector g)
 IR> {
 IR>     CComplexVector G;
 IR>     CComplexVector W
 IR>     CVector k;
 IR>     CComplexVector K;
 IR>     CVector y;
 IR>     G = FFT(g);
 IR>     for(int s=0;s<N;s++) {
 IR>         //заполняем вектор k
 IR>         for(int x=0;x<N;x++)
 IR>             k[x] = Kfunc(x-s);
 IR>         K = FFT(k);
 IR>         //заполняем вектор W
 IR>         for(int omega=0;omega<N;omega++)
 IR>             W[omega] = G[omega]/K[omega];

 IR>         //обратное преобразование Фурье
 IR>         rW = RFFT(W);

 IR>         y[s] = rW[s];
 IR>     }
 IR>     return y;
 IR> }

 IR> Но это не работает! Даже когда k берется следующим образом:
 IR> k(x-s) = 1, если x-s=0 и 0, иначе.
 IR> (единичная матрица, в этом случае g = y)
 IR> Но в таком случае наблюдается интересная вещь:
 IR> Правильные значения находяться в позиции rW[0], но это только для
 IR> единичной матрицы k.
 IR> Нужное значение k:
 IR>     | 1/d, если -d<x-s<=0
 IR> k   {
 IR>     | 0 , иначе
 IR> где d - шаг смаза.

Это известные штуки, связанные с тем, что БПФ считает данные циклическими.
Нужно делать сие через свертку с наложением.

 IR> ... e-mail: riv@pisem.net

Евгений Машеров АКА СанитарЖеня

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)