Интерполяция sinc

Все что касается фильтрации
Pavia
Сообщения: 38
Зарегистрирован: 25 апр 2011, 18:45

Интерполяция sinc

Сообщение Pavia »

Собственно хочется увидеть код.
Насколько я понимаю sinc делается в во временной области.
Мой вот но он явно с ошибкой, а где не пойму.

Код: Выделить всё

   dT:=1/FactorSize;
    For j:=0 to NewLength-1 do
     begin
     sr:=0;
     For i:=-32767 to 32768-1 do    {массив word поэтому 32767 далее сума будет менее 1}
      sr:=sr+SinC(Round(dt*j+i))*InA[Round(dt*j+i) mod OldLength]; {Метод SinC предпологает циклтичность}
     end;
     OutA[j]:=Round(sr{*1/65536});
    end;

mks
Сообщения: 16
Зарегистрирован: 18 окт 2010, 11:04

Re: Интерполяция sinc

Сообщение mks »

Вы говорите о интерполяции с помощью ряда Котельникова ?

Pavia
Сообщения: 38
Зарегистрирован: 25 апр 2011, 18:45

Re: Интерполяция sinc

Сообщение Pavia »

На википедии теорему Котенькова переврали.
Это не по теореме Котенькова, а по теореме Найквиста.

Наконец то сделал. Может кому надо.

Код: Выделить всё

procedure InterpolationSinC(var OutA:TArraySmallint;InA:TArraySmallint);
var
 i,j,k:integer;
 dT,F,T, sr:Real;
 FactorSize:Real;
 OldLength,NewLength:integer;
begin
{Переписать через FFT}
OldLength:=Length(InA);
NewLength:=Length(OutA);
if (OldLength=0) then exit;

FactorSize:=(NewLength-1)/(OldLength-1);
dT:=1/FactorSize;
For j:=0 to NewLength-1 do
  begin
  sr:=0;
  F:=0;
  For k:=-32767 to 32767 do    {массив word поэтому 32767 далее сума будет менее 1}
      begin
      I:=round(j*dt+K);
      T:=(j*dt-I);
      sr:=sr+SinC(Pi*T)*InA[((I mod OldLength)+OldLength) mod OldLength]; {Метод SinC предпологает циклтичность}
      F:=F+(SinC(Pi*T));
      end;
  if sr>32767	 then OutA[j]:=32767
     else if sr<-32768	 then OutA[j]:=-32768
       else  OutA[j]:=Round(sr/F);
  end;
end;

Ответить