IFFT pomocí FFTW – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

IFFT pomocí FFTW – C / C++ – Fórum – Programujte.comIFFT pomocí FFTW – C / C++ – Fórum – Programujte.com

 

JakubD0
Duch
8. 11. 2014   #1
-
0
-

Ahoj, měl bych další dotaz k použití FFTW, viz pokračování tohoto:

http://programujte.com/forum/vlakno/28193-pouziti-fftw3/.

Snažím se napsat Matlabovskou fci hilbert 

(http://www.mathworks.com/help/signal/ref/hilbert.html

v C++ a narazil jsem na problém při výpočtu inverze FFT. Do tohoto kroku jsem měl výsledky stejné jako Matlab (výpočet fft, výpočet vektoru h -> modifikace vstupního vektoru pro ifft), ale u výpočtu inverze se mi již výsledky rozchází - pravděpodobně neumím správně použít nastavení nebo něco opomíjím - bohužel moje angličtina je velice chabá a co se týče DSP a td nemám moc žádné zkušenosti.

Na vstupu mam sice realna data, ty si ale prevedu na complexni s imag. casti 0. Jedna se o jednorozměrné double pole s 59 999 prvky. 

Můj zdrojový kód:

vector<fftw_complex> in;
vector<fftw_complex> out;

in.reserve(size);
out.reserve(size);
    
for (int i = 0; i < size; i++)
{
    in[i][0] = data[i];
    in[i][1] = 0;
}

// FFT
fftw_plan plan = fftw_plan_dft_1d(size, &in[0], &out[0], FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan);
out[0][1] = 0;
fftw_destroy_plan(plan);

// H
vector<double> h(size, 0);
if (2*floor(size/2) == size)
{
   // even
   h[0] = 1;
   h[size/2] = 1;
   for (int i = 1; i < size/2; i++)
   {
       h[i] = 2;
   }
} 
else
{
   // odd
   h[0] = 1;
   for (int i = 1; i < (size+1)/2; i++)
   {
       h[i] = 2;
   }
}

// IFFT
in.clear();
in.reserve(size);
for (int i = 0; i < size; i++)
{
    out[i][0] *= h[i];
    out[i][1] *= h[i];
}

plan = fftw_plan_dft_1d(size, &out[0], &in[0], FFTW_BACKWARD, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);

Dokazal by nekdo poradit co muze byt spatne?

Nahlásit jako SPAM
IP: 46.13.92.–
vitamin+8
Grafoman
8. 11. 2014   #2
-
0
-

#1 JakubD
std::vector interne uchovava 3 hodnoty, alokovane pole(pointer na data), velkost alokovaneho pola ( capacity() ) a pocet prvkov(size()). Metoda rezerve() len zvysuje kapacitu, nevytvara konkretne prvky. Na pridanie prvku do vectora s pouziva push_back/emplace_back/insert/... alebo konstruktor  std::vector(pocet_prvkov, defaultna_hodnota). Metoda clear() vola destructory na vsetky prvky ktore boly pridane cez push_back/emplace_back/insert/... ale nemeni kapacitu(capacity()), len nastavy pocet prvkov(size()) na 0 a zavola destructory.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
JakubD0
Duch
8. 11. 2014   #3
-
0
-

#2 vitamin
Díky za vysvětlení :). Bohužel zde problém není, zkoušel jsem i předělat do ne-vectorového řešení, a stále špatný výstup po posledním výpočtu.

Nahlásit jako SPAM
IP: 46.13.92.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 100 hostů

Podobná vlákna

Mazani pomoci $get — založil tribalcz

PrintScreen pomocí C++ — založil Hanzis

Pole pomoci new — založil pepk

Struktura s pomoci new — založil Hlavinka

Anketa pomocí session — založil MaxDJs

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý