Инверсный фильтр
- 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)