CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [bcb] Szybka transformacja Fouriera
Strona 1 z 2

[bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 16:35
przez kubawodzu
Witam
błagam o pomoc
potrzebuje kod Szybka transformacja Fouriera 2-wymiarowej. Potrzebuje to do mojego programu do pracy dyplomowej który mam oddac w piątek a promotor stwierdził że dobrze by było jakby bylo:D czyli jednym słowem potrzebuje wstawić do swojego programu Szybka transformacja Fouriera.
Mogą być jakieś podpowiedzi
Błagam.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 17:09
przez Cyfrowy Baron
Implementacja FFT (FFTW) w języku C/C++ w Visual Studio

Co prawda dla Visula Studio, ale język ten sam, więc nie będzie problemów. Ja z algorytmów jestem kiepski więc nie rozgryzę tego.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 17:36
przez kubawodzu
ja wiem że dla VS jest szczególnie jak się podepnie biblioteki. Ja w borlandzie z 5 dni próbowałem podpiąć OpenCV aby mi działało i się nie udało. Dlatego cały program mam ręcznie napisany, każda najmniejsza czynność :X Heh a istnieje jakaś możliwość abym napisał to w Visualu potem podpoił pod borlanda i podczas wymaganej czynności aby zrobiła się fft i odesłała wynik do borlanda:X
kurde muszę kombinować i to na "chama" bo chce się obronić teraz. Szukałem jakiś "gotowych kodów" w necie dla fft ale ciężko. są w c dość przystępne ( o ile to może się nazywać przystępne bo ja ich nie rozumiem). może da się do borlanda jakoś kod z c podpiąć jako biblioteka. odwołać się do niej wysłać to co potrzeba odebrać wynik i będzie hulać??

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 18:12
przez Cyfrowy Baron
Z Visuala nie podepniesz bo biblioteki nie będą pasować. Z c możesz przepisać na c++, nie powinno być problemu.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 19:50
przez polymorphism
Dlaczego nie podepnie? Tam są jakieś DLL-ki do ściągnięcia, włącznie z tym jak wygenerować biblioteki importów dla nich na podstawie plików .def w IDE borlanda. Oczywiście trzeba jeszcze ściągnąć nagłówki i odpowiednio ustawić ścieżki.

--- dodane ---

Chyba wystarczy jeden nagłówek do tych bibliotek -> szukać fftw3.h

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 21:02
przez Cyfrowy Baron
Próba wygenerowania plików lib w oparciu o pliki def kończy się niepowodzeniem:


Invalid character in DEF file



Gdy zmieniłem wpis w pliku libfftw3-3.def z: LIBRARY libfftw3-3.dll na LIBRARY "libfftw3-3.dll", udało się utworzyć plik libfftw3-3.lib.
W ten sam sposób należałoby postąpić z plikami: libfftw3f-3.def; libfftw3l-3.def - zmiana wpisu trzeba po prostu ująć nazwę biblioteki w cudzysłowy.

użyłem polecenia:

KOD text:     UKRYJ  
implib libfftw3-3.lib libfftw3-3.def


polymorphism napisał(a):Chyba wystarczy jeden nagłówek do tych bibliotek -> szukać fftw3.h


Tylko jeden jest dostępny.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 21:41
przez polymorphism
Tylko jeden jest dostępny.

I chyba więcej nie trzeba, bo zawiera definicje dla trzech precyzji -> float, double i long double (na jedną DLL-kę przypada jedna z wymienionych precyzji).

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 21:42
przez kubawodzu
ha :D jestem debilem :D
oki 1 etap zakończony. Wcześniej tez próbowałem się z tym bawić ale implib mi nie działał. zmieniałem jego zgodność pod xp ale dalej nie działał. ale skoro mówicie że działa to dodałem jeszcze 254 kolory i udało się go odpalić. mam już lib.
teraz aby borland go widział mam:
wczytać do mojego projekt
#include fftw3.h
i będzie działać??

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 21:46
przez polymorphism
Bibliotekę LIB musisz dodać do projektu (add to project lub coś w tym stylu).

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: środa, 12 września 2012, 23:25
przez kubawodzu
dlaczego mi wywala
[Linker Error] Unresolved external '_fftw_plan_dft_2d' referenced from ??
coś pominąłem??
oki pominąłem -a.
teraz pytanie z innej beczki jak pod winda 7 uruchomić implib. od 6 godzin próbuje go włączyć (na virtualu xp tez się sypie).
Raz mi sie udało a teraz za Chiny ludowe:x.
cała noc a ja próbuje program uruchomić :X

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: czwartek, 13 września 2012, 04:57
przez Cyfrowy Baron
Może problem bierze się z tego, że uruchamiasz ten program w środowisku 64-bitowym. Ze swej strony mogę tylko podesłać tobie te biblioteki LIB.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: czwartek, 13 września 2012, 23:26
przez kubawodzu
dzięki niestety nie podeszły mi. ale uruchomiłem swojego starego kompa no i lib się zrobiło ale reszta nie :/


Chyba udało mi się to zrobić FFT 2d oraz dolnoprzepustowy filtr. Jednak mam problem ponieważ nie wyświetla mi rezultatu. Uważam że źle wprowadzam dane do tablicy FFT
pod cv wygląda to tak:
KOD cpp:     UKRYJ  
in[k][0] = ((uchar*)(img1->imageData + i * img1->widthStep))[j];
in[k][1] = 0.;
 


ja nie mam cv więc rozwiązałem to jakoś inaczej ale niestety nie wydaje wartości

inne metody wprowadzania danych wywalały mi blad w kompilatorze w "double[*]{*]"

Jak to można inaczej zapisać?
mój kod:
KOD cpp:     UKRYJ  
void __fastcall TForm1::FFTW(TObject *Sender)
{
fftw_complex* in, * dft;
fftw_plan plan_f, plan_i;
int i, j, k, w, h, N;
int outwidth;

//wczytanie parametrów
w = Bufor->Picture->Bitmap->Width;
h = Bufor->Picture->Bitmap->Height;
N = w * h;
outwidth = w/2+1;
//alokacja pamieci
in   = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
dft  = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
  ProgressBar1->Max =  Obraz->Picture->Bitmap->Width;

plan_f = fftw_plan_dft_2d(w, h, in, dft, FFTW_FORWARD, FFTW_ESTIMATE);

for (i = 0, k = 0; i < h; i++)
    {
        for (j = 0; j < w; j++, k++)
        {
            in[k][0] = Obraz->Picture->Bitmap->Canvas->Pixels[((Obraz->Picture->Bitmap->Canvas->Pixels[ i][j] + i * Obraz->Picture->Bitmap->Width))][j]; // <----
            in[k][1] = 0.;
                        ProgressBar1->Position = i;
        }
    }
         ProgressBar1->Position = 0 ;
  fftw_execute(plan_f);

//filtr dolnoprzepustowy
 LowPass(dft,outwidth,h,3);
// fft odwrotna
plan_i = fftw_plan_dft_2d(w, h, dft, in, FFTW_BACKWARD, FFTW_ESTIMATE);
  fftw_execute(plan_i);
wczytanie wartości po filtracji
for (i = 0, k = 0; i < h; i++)
    {
        for (j = 0; j < w; j++, k++)
    Wynik->Picture->Bitmap->Canvas->Pixels[((Wynik->Picture->Bitmap->Canvas->Pixels[i][j] + i * Wynik->Picture->Bitmap->Width))][j] = dft[k][0]; // <----
 fftw_destroy_plan(plan_f);
  fftw_destroy_plan(plan_i);
    fftw_free(in);
    fftw_free(dft);
 }}
LowPass(fftw_complex *outp, int outwidth, int height, int spacing)
{


    int w,h;
    float fh,fw,f;

    float invcutx = 1.0 / (2.0*(float)(spacing)*outwidth);
    float invcuty = 1.0 / (2.0*(float)(spacing)*height);

    for (h=0; h < height/2; h++) {

        {
            fh = float(h)*invcuty;
            fh *= fh;
            for (w = 0; w < outwidth; w++) {
                fw = float(w)*invcutx;
                fw *= fw;
                f = 1/(1 + fh + fw);
                outp[w][0] *= f;
                outp[w][1] *= f;
            }
        }

        outp += outwidth;
    }

    for (h=height/2; h < height; h++) {

        {
            fh = float(height-h-1)*invcuty;
            fh *= fh;
            for (w = 0; w < outwidth; w++) {
                fw = float(w)*invcutx;
                fw *= fw;
                f = 1/(1 + fh + fw);
                outp[w][0] *= f;
                outp[w][1] *= f;
            }
        }

        outp += outwidth;
    }

}
 

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: niedziela, 16 września 2012, 19:47
przez kubawodzu
spróbuje jeszcze raz OpenCV wgrać tym razem na win xp. może się uda. a jak nie:X nie ma jakiejś metod aby uzyskać Imagedata w borland?

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: niedziela, 16 września 2012, 20:15
przez polymorphism
Jeśli to Imagedata ma oznaczać po prostu pamięć z danymi opisującymi kolory poszczególnych pikseli, to TBitmap ma właściwość ScanLine, dzięki której masz bezpośredni dostęp do bufora bitmapy.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: niedziela, 16 września 2012, 21:48
przez kubawodzu
a o tego jak się można dostać widthStep??