Tôi muốn mở rộng nhận xét của mình và làm lại ví dụ mà bạn tham chiếu theo cách dễ hiểu hơn bản gốc và để giải thích tại sao fft
trả về các hệ số theo cách nó làm.
Để tham khảo, phần fft của ví dụ là:
Nx = size(x,2);
k = 2*pi/(b-a)*[0:Nx/2-1 0 -Nx/2+1:-1];
dFdx = ifft(1i*k.*fft(f));
d2Fdx2 = ifft(-k.^2.*fft(f));
Tôi đã thêm một phần khác của mã ngay bên dưới nó:
Nx = size(x,2);
k = 2*pi/(b-a)*(-Nx/2:Nx/2-1);
dFdxp = ifft(ifftshift(1i*k.*fftshift(fft(f))));
d2Fdx2p = ifft(ifftshift(-k.^2.*fftshift(fft(f))));
và bọc cả hai đoạn mã trong một tic; toc
thời gian suy nghĩ. Trong định dạng dễ đọc hơn, phương thức thứ hai sử dụng:
ckf = fftshift(fft(f));
ckdf = 1i*k.*ckf;
df = ifft(ifftshift(ckdf));
Sự khác biệt đầu tiên là ví dụ thứ hai có trực quan hơn nhiều k
. Đây là ưu điểm chính của ví dụ thứ hai, vì k bây giờ ở dạng mà chúng ta nghĩ về chúng. Trong dòng thứ hai và thứ ba tôi phải thêm fftshift
xung quanh cuộc gọi đến fft
, sau đó một cuộc gọi đến ifftshift
trực tiếp bên trong cuộc gọi đến ifft
. Các hàm bổ sung này gọi sắp xếp lại các hệ số từ những gì cần thiết cho máy tính để làm việc với chúng theo cách con người thường nghĩ về chúng.
Vấn đề với ví dụ thứ hai, là trong khi k
chúng ta trực quan hơn, điều này để lại các ma trận nội bộ để giải quyết và đảo ngược fft
trong các hình thức không thuận lợi. Vì vậy, hoặc chúng ta phải chuyển thứ tự với các cuộc gọi đến fftswitch
và ifftswitch
hoặc nó phải được mã hóa cứng vào các fft
chức năng. Điều này ít bị lỗi từ người dùng (giả sử họ không quen với các hoạt động của fft, như nhiều người), nhưng bạn phải trả giá trong thời gian chạy.
Như tôi đã nói trước đây, tôi đã thêm các cuộc gọi thời gian xung quanh hai khối để so sánh và chạy cho nhiều N. Kết quả thời gian là:
N = 1000, Ex1 = 0.000222 s, Ex2 = 0.007072 s
N = 10000, Ex1 = 0.001576 s, Ex2 = 0.003506 s
N = 100000, Ex1 = 0.023857 s, Ex2 = 0.034051 s
N = 1000000, Ex1 = 0.213816 s, Ex2 = 0.406250 s
N = 10000000, Ex1 = 4.555143 s, Ex2 = 7.102348 s
Như bạn có thể thấy, hành động chuyển đổi các giá trị qua lại làm chậm quá trình một cách đáng kể, đặc biệt là ở mức N thấp (nơi nó chậm hơn 30 lần). Đây chỉ là một ví dụ và máy tính của bạn có thể hiển thị các xu hướng hơi khác nhau tùy thuộc vào những thứ như tốc độ bộ nhớ, lõi / tốc độ xử lý, v.v. nhưng nó mang tính minh họa cho điểm. Lý do fft
có đầu ra khó hiểu là bởi vì nó đang tiết kiệm cho bạn một phần không cần thiết trong thời gian tính toán của bạn.