Witam.
Przeczytałem tematy związane z tą tematyką i nadal jestem trochę w niepewny.
Chcę się upewnić, czy dobrze rozumuję.
Chcę napisać własną funkcję w języku C realizującą FFT.
Funkcja ma być uniwersalna, żebym mógł ją sobie przenosić na różne uC.
Na początek, nie musi być szybka, byle by zadziałała.
Ulepszaniem zajmę się potem.
A więc co wiem i co mam:
-Korzystam z książki prof. Tomasza Zielińskiego "Cyfrowe przetwarzanie sygnałów ..."
-symulację przeprowadzam w programie MATLAB
Ale muszę to robić w taki sposób, żeby kod później łatwo można było przenieść do funkcji w języku C na dowolny uC.
I teraz jak ja to rozumuję: (radix-2)
FFT jest to szybsza wersja DFT, ponieważ redukuje liczbę mnożeń zespolonych.
1.Najpierw muszę "przemieszać" próbki sygnału wejściowego w buforze, czyli te tzw motylki.
Algorytm znam, wystarczy tylko wykonać odbicie lustrzane bitów indeksu tablicy.
A więc dla 8 punktowej transformaty kolejność próbek w buforze po przemieszaniu ma być:
0
4
2
6
1
5
3
7
Dalej:
Teraz muszę wykonać N/2 dwupunktowych DFT.
I teraz czy dobrze rozumuję?
Dwupunktowe DFT mają być wykonane kolejno w tym przypadku dla próbek:
a-> (0,4)
b-> (2,6)
c-> (1,5)
d-> (3,7)
i teraz z każdej tej pary otrzymam po 2 wartości zespolone tak?
Czyli w sumie 4 wartości, 2 rzeczywiste i 2 urojone?
W języku C nie mogę zapisywać liczb urojonych tak jak w matlabie a więc muszę to zrealizować programowo w postaci 2 buforów, jeden na część wartość rzeczywistą a drugi na urojoną lub poprzez jeden bufor(tablicę) dwuwymiarową.
Załóżmy że mam osobne bufory:
real_x[N];
imag_x[N];
I teraz moje pytanie, jak wpisać wyniki tych czterech dwupunktowych DFT do tych buforów?
Dla DFT->a
real_x(0)=real1; imag_x(0)=imag1;
real_x(1)=real2; imag_x(1)=imag2;
Dla DFT->b
real_x(2)=real1; imag_x(2)=imag1;
real_x(3)=real2; imag_x(3)=imag2;
Dla DFT->c
real_x(4)=real1; imag_x(4)=imag1;
real_x(5)=real2; imag_x(5)=imag2;
Dla DFT->d
real_x(6)=real1; imag_x(6)=imag1;
real_x(7)=real2; imag_x(7)=imag2;
W taki sposób?
Ok, jeśli tak to mam teraz 2 bufory 8 elementowe z kolejno ułożonymi wynikami 4 kolejnych dwupunktowych DFT.
Mam widma, ale teraz muszę je połączyć w jedno widmo.
Jest algorytm:
Ale tego już właśnie chyba nie do końca rozumiem;
Znowu zamiana miejsc, ok, da się zrobić, nie ma problemu.
Ale na niektórych strzałkach widać tu -1 albo np Wn² itd.
Są to jakieś wpsółczynniki przez które mam mnożyć te próbki na tych odpowiednich im przejściach?
Jeśli już potem połączę widma w jedno widmo, otrzymam 2 bufory z wartościami rzeczywistymi i urojonymi.
Potem tylko zrobić z tego moduł, czyli w pętli:
buff[i]=sqrt(real_x(i)^2 + imag_x(i)^2)
??
Pokazałem tu pewien algorytm, jak ja to ruzumuję.
Chciałbym, aby mi ktoś odpowiedział czy dobrze myślę i ewentualnie jeśli się mylę to gdzie.
Przeczytałem tematy związane z tą tematyką i nadal jestem trochę w niepewny.
Chcę się upewnić, czy dobrze rozumuję.
Chcę napisać własną funkcję w języku C realizującą FFT.
Funkcja ma być uniwersalna, żebym mógł ją sobie przenosić na różne uC.
Na początek, nie musi być szybka, byle by zadziałała.
Ulepszaniem zajmę się potem.
A więc co wiem i co mam:
-Korzystam z książki prof. Tomasza Zielińskiego "Cyfrowe przetwarzanie sygnałów ..."
-symulację przeprowadzam w programie MATLAB
Ale muszę to robić w taki sposób, żeby kod później łatwo można było przenieść do funkcji w języku C na dowolny uC.
I teraz jak ja to rozumuję: (radix-2)
FFT jest to szybsza wersja DFT, ponieważ redukuje liczbę mnożeń zespolonych.
1.Najpierw muszę "przemieszać" próbki sygnału wejściowego w buforze, czyli te tzw motylki.
Algorytm znam, wystarczy tylko wykonać odbicie lustrzane bitów indeksu tablicy.
A więc dla 8 punktowej transformaty kolejność próbek w buforze po przemieszaniu ma być:
0
4
2
6
1
5
3
7
Dalej:
Teraz muszę wykonać N/2 dwupunktowych DFT.
I teraz czy dobrze rozumuję?
Dwupunktowe DFT mają być wykonane kolejno w tym przypadku dla próbek:
a-> (0,4)
b-> (2,6)
c-> (1,5)
d-> (3,7)
i teraz z każdej tej pary otrzymam po 2 wartości zespolone tak?
Czyli w sumie 4 wartości, 2 rzeczywiste i 2 urojone?
W języku C nie mogę zapisywać liczb urojonych tak jak w matlabie a więc muszę to zrealizować programowo w postaci 2 buforów, jeden na część wartość rzeczywistą a drugi na urojoną lub poprzez jeden bufor(tablicę) dwuwymiarową.
Załóżmy że mam osobne bufory:
real_x[N];
imag_x[N];
I teraz moje pytanie, jak wpisać wyniki tych czterech dwupunktowych DFT do tych buforów?
Dla DFT->a
real_x(0)=real1; imag_x(0)=imag1;
real_x(1)=real2; imag_x(1)=imag2;
Dla DFT->b
real_x(2)=real1; imag_x(2)=imag1;
real_x(3)=real2; imag_x(3)=imag2;
Dla DFT->c
real_x(4)=real1; imag_x(4)=imag1;
real_x(5)=real2; imag_x(5)=imag2;
Dla DFT->d
real_x(6)=real1; imag_x(6)=imag1;
real_x(7)=real2; imag_x(7)=imag2;
W taki sposób?
Ok, jeśli tak to mam teraz 2 bufory 8 elementowe z kolejno ułożonymi wynikami 4 kolejnych dwupunktowych DFT.
Mam widma, ale teraz muszę je połączyć w jedno widmo.
Jest algorytm:
Ale tego już właśnie chyba nie do końca rozumiem;
Znowu zamiana miejsc, ok, da się zrobić, nie ma problemu.
Ale na niektórych strzałkach widać tu -1 albo np Wn² itd.
Są to jakieś wpsółczynniki przez które mam mnożyć te próbki na tych odpowiednich im przejściach?
Jeśli już potem połączę widma w jedno widmo, otrzymam 2 bufory z wartościami rzeczywistymi i urojonymi.
Potem tylko zrobić z tego moduł, czyli w pętli:
buff[i]=sqrt(real_x(i)^2 + imag_x(i)^2)
??
Pokazałem tu pewien algorytm, jak ja to ruzumuję.
Chciałbym, aby mi ktoś odpowiedział czy dobrze myślę i ewentualnie jeśli się mylę to gdzie.