Тема: БПФ или FFT
Показать сообщение отдельно
  #7  
Старый 06.03.2012, 00:37
Сергей Викторович Сергей Викторович вне форума
Прохожий
 
Регистрация: 29.02.2012
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Что то ведь нашёл, может доработать "напильником"?
а можно сторонние файлы с расширением .pas как то к проекту добавить?
Можно ответить : можно или нельзя. Если можно сам попробую найти как.
Есть 2 файла с расширением .pas вроде как выполняющих БПФ, а что с ними делать пока не могу разобратся

вот один

Код:
unit fft;
interface
uses Math, Ap, Sysutils;

procedure FastFourierTransform(var a : TReal1DArray;
     nn : Integer;
     InverseFFT : Boolean);

implementation

procedure FastFourierTransform(var a : TReal1DArray;
     nn : Integer;
     InverseFFT : Boolean);
var
    ii : Integer;
    jj : Integer;
    n : Integer;
    mmax : Integer;
    m : Integer;
    j : Integer;
    istep : Integer;
    i : Integer;
    isign : Integer;
    wtemp : Double;
    wr : Double;
    wpr : Double;
    wpi : Double;
    wi : Double;
    theta : Double;
    tempr : Double;
    tempi : Double;
begin
    if InverseFFT then
    begin
        isign := -1;
    end
    else
    begin
        isign := 1;
    end;
    n := 2*nn;
    j := 1;
    ii:=1;
    while ii<=nn do
    begin
        i := 2*ii-1;
        if j>i then
        begin
            tempr := a[j-1];
            tempi := a[j];
            a[j-1] := a[i-1];
            a[j] := a[i];
            a[i-1] := tempr;
            a[i] := tempi;
        end;
        m := n div 2;
        while (m>=2) and (j>m) do
        begin
            j := j-m;
            m := m div 2;
        end;
        j := j+m;
        Inc(ii);
    end;
    mmax := 2;
    while n>mmax do
    begin
        istep := 2*mmax;
        theta := 2*Pi/(isign*mmax);
        wpr := -2.0*sqr(sin(0.5*theta));
        wpi := sin(theta);
        wr := 1.0;
        wi := 0.0;
        ii:=1;
        while ii<=mmax div 2 do
        begin
            m := 2*ii-1;
            jj:=0;
            while jj<=(n-m) div istep do
            begin
                i := m+jj*istep;
                j := i+mmax;
                tempr := wr*a[j-1]-wi*a[j];
                tempi := wr*a[j]+wi*a[j-1];
                a[j-1] := a[i-1]-tempr;
                a[j] := a[i]-tempi;
                a[i-1] := a[i-1]+tempr;
                a[i] := a[i]+tempi;
                Inc(jj);
            end;
            wtemp := wr;
            wr := wr*wpr-wi*wpi+wr;
            wi := wi*wpr+wtemp*wpi+wi;
            Inc(ii);
        end;
        mmax := istep;
    end;
    if InverseFFT then
    begin
        I:=1;
        while I<=2*nn do
        begin
            a[I-1] := a[I-1]/nn;
            Inc(I);
        end;
    end;
end;


end.
Ответить с цитированием