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?