Saya berharap seseorang dapat meninjau kode saya di bawah ini dan memberikan petunjuk bagaimana mempercepat bagian antara tic dan toc. Fungsi di bawah ini mencoba menjalankan IFFT lebih cepat daripada fungsi bawaan Matlab karena (1) hampir semua bin koefisien fft adalah nol (yaitu bin 10
hingga 1000
dari bin 10M
hingga 300M
bukan nol), dan (2 ) hanya sepertiga bagian tengah dari hasil IFFT yang dipertahankan (sepertiga pertama dan terakhir dibuang -- jadi tidak perlu menghitungnya terlebih dahulu).
Variabel masukannya adalah:
fftcoef = complex fft-coef 1D array (10 to 1000 pts long)
bins = index of fft coefficients corresponding to fftcoef (10 to 1000 pts long)
DATAn = # of pts in data before zero padding and fft (in range of 10M to 260M)
FFTn = DATAn + # of pts used to zero pad before taking fft (in range of 16M to 268M) (e.g. FFTn = 2^nextpow2(DATAn))
Saat ini, kode ini membutuhkan waktu beberapa kali lipat lebih lama daripada pendekatan fungsi ifft
Matlab yang menghitung seluruh spektrum kemudian membuang 2/3
-nya. Misalnya, jika data input untuk fftcoef dan bins adalah 9x1
array (yaitu hanya 9
koefisien fft kompleks per sideband; 18
pts ketika mempertimbangkan kedua sideband), dan DATAn=32781534
, FFTn=33554432
(yaitu 2^25
), maka pendekatan ifft memerlukan waktu 1.6
detik sedangkan loop di bawah membutuhkan waktu lebih dari 700
detik.
Saya telah menghindari penggunaan matriks untuk membuat vektorisasi loop nn karena terkadang ukuran array untuk fftcoef dan bins bisa mencapai panjang 1000
pts, dan matriks 260Mx1K
akan terlalu besar untuk memori kecuali jika matriks tersebut dapat dipecah.
Setiap saran sangat dihargai! Terima kasih sebelumnya.
function fn_fft_v1p0(fftcoef, bins, DATAn, FFTn)
fftcoef = [fftcoef; (conj(flipud(fftcoef)))]; % fft coefficients
bins = [bins; (FFTn - flipud(bins) +2)]; % corresponding fft indices for fftcoef array
ttrend = zeros( (round(2*DATAn/3) - round(DATAn/3) + 1), 1); % preallocate
start = round(DATAn/3)-1;
tic;
for nn = start+1 : round(2*DATAn/3) % loop over desired time indices
% sum over all fft indices having non-zero coefficients
arg = 2*pi*(bins-1)*(nn-1)/FFTn;
ttrend(nn-start) = sum( fftcoef.*( cos(arg) + 1j*sin(arg));
end
toc;
end
length(bins)*(2*DATAn/3)
, lebih baik daripadaDATAn*lg(DATAn)
untuk pendekatan FFT jika2*length(bins)/3 > lg(DAtan)
(karena FFTW menangani ukuran transformasi non-kekuatan-2, saya mengabaikan bantalan nol). Untuk kasus 10 bin dan 2^25 titik keluaran, itu adalah '20/3 › 25', faktor potensial dari 3 peningkatan. Segera setelah Anda mencapai 75 koefisien FFT, Anda kehilangan keuntungan. Dan Anda harus mengkodekan algoritma dalam C dan memeliharanya. - person mtrw   schedule 25.01.2011