Tôi phải tính toán bao nhiêu cường độ Fourier trước khi FFT trở nên hiệu quả hơn DFT?


8

Tôi chỉ cần tính toán một số lượng nhỏ các thành phần Fourier tần số thấp của mảng 2 chiều phức tạp. Tôi sẽ tính toán các thành phần Fourier tương tự lặp đi lặp lại khi mảng đầu vào thay đổi. Rõ ràng, trong giới hạn mà tôi chỉ muốn một thành phần Fourier, sẽ nhanh nhất để xây dựng một ma trận DFT cung cấp cho thành phần mà tôi theo sau và nhân với ma trận đó nhiều lần.

Trong giới hạn khác, nếu tôi muốn tất cả các thành phần Fourier, sử dụng FFT sẽ nhanh hơn.

Tại thời điểm nào nó trở nên nhanh hơn để tính toán FFT của mảng và chỉ cần rút các thành phần mà tôi theo sau?

Nếu nó tạo ra sự khác biệt, trong tình huống cụ thể của tôi, mảng đầu vào sẽ giống như . Tôi đang sử dụng MATLAB, vì vậy điều đó có nghĩa là FFT của tôi được thực hiện bằng FFTW và phép nhân ma trận cho ma trận DFT được thực hiện thông qua bất kỳ thuật toán nhân ma trận nào mà MATLAB sử dụng dưới mui xe.256×256


2
Đầu tiên, chỉ là một lưu ý: DFT là phép biến đổi toán học và FFT là thuật toán nhanh để tính toán chúng, bởi DFT đối với tôi có nghĩa là bạn thực hiện trực tiếp biểu thức biến đổi phạm vi rời rạc. Thứ hai: Bạn không cần nghịch đảo? nếu vậy, bạn chỉ có thể thực hiện chuyển đổi cho các yếu tố mà bạn cần.
fcruz

Vâng, tôi nhận thức được sự khác biệt giữa DFT và FFT. Có lẽ cách mà tôi đã sử dụng các thuật ngữ không phổ biến ngoài tôi và các đồng nghiệp của tôi. Những gì bạn nói về cơ bản là chính xác: Tôi sử dụng thuật ngữ "DFT" để chỉ một số tính toán trực tiếp của một hoặc nhiều hệ số Fourier. FFT, trong khi hiệu quả, bị giới hạn ở tần số tính toán từ DC đến hai lần tần số Nyquist, với khoảng cách mẫu là 1 / N trong đó N là kích thước của mảng. Nói chung, một DFT có thể tính toán một tập hợp con của các tần số này, hoặc thậm chí tần số trung gian (k / N cho k không nguyên), nhưng không hiệu quả.
Colin K

@fcruz: Ngoài ra, "thực hiện chuyển đổi chỉ cho các yếu tố mà tôi cần" chính xác là câu hỏi này là gì. Tôi đang hỏi có bao nhiêu yếu tố tôi có thể tính toán bằng một DFT trước khi đơn giản là nhanh hơn để thực hiện toàn bộ FFT và sau đó loại bỏ các giá trị mà tôi không cần. Câu trả lời mà RCompton đưa ra dường như khá chính xác về điểm này.
Colin K

Câu trả lời:


9

17.

Rất nhiều và rất nhiều công việc đã đi vào triển khai fft tốt và không chắc bạn sẽ có thể vượt trội hơn một thư viện fft tốt. Ví dụ: fftw "tự động điều chỉnh chính nó cho máy của bạn, bộ nhớ cache, kích thước bộ nhớ, số lượng thanh ghi và tất cả các yếu tố khác thường không thể tối ưu hóa chương trình cho nhiều máy" trong trang này .

Bạn đúng rằng có những tình huống sẽ nhanh hơn khi chỉ tính toán một vài sản phẩm chấm nhưng nó sẽ phụ thuộc rất nhiều vào hệ thống.

Một thử nghiệm:

EDU>> n = 256^2;
EDU>> x = randn(n,1);
EDU>> d = randn(1,n); %really, you should take a row from the output of the dftmtx command. But dftmtx(n) won't fit on my laptop...
EDU>> tic;d*x;toc; %time to compute a single frequency from the dft matrix
Elapsed time is 0.000225 seconds.
EDU>> tic;fft(x);toc; %time to compute the entire fft
Elapsed time is 0.003909 seconds.

Vì vậy, khi có 4096 điểm dữ liệu tính toán, toàn bộ fft chỉ mất ~ 17 lần so với tính toán một sản phẩm chấm đơn.


1
"17." ban đầu là gì trong bài viết của bạn?
shuhalo

2
Đó là câu trả lời :) Tôi đã chạy thử nghiệm trên máy của chính mình và kết quả tôi đã đồng ý với điều này, ít nhiều, cho đến khi kích thước mảng đầu vào đạt 64 hoặc ít hơn. Câu trả lời nói chung không rõ ràng, đó là lý do tại sao tôi chưa chấp nhận nó (ví dụ: thực sự không cần phải sản xuất dftmtx (256 ^ 2)!), Nhưng tôi sẽ sớm thôi không ai khác bấm chuông.
Colin K

4

Thay vào đó, bạn có thể xem xét sử dụng Thuật toán Goertzel để tính toán trực tiếp các thành phần tần số bạn quan tâm.


+1. Chắc chắn là một gợi ý tốt. Tuy nhiên, thật ngạc nhiên, thuật toán goertzel có trong Bộ công cụ xử lý tín hiệu Matlabs rất chậm. Nó tệ hơn DFT và FFT cho bất kỳ sự kết hợp nào của kích thước mảng đầu vào và số lượng giá trị đầu ra mà tôi có thể kiểm tra.
Colin K

1
Tôi nghi ngờ rằng trong khi một số trường hợp thuật toán có thể hiệu quả hơn về mặt tính toán trong một số trường hợp, thì việc triển khai Matlab được viết bằng Matlab thuần túy, trong khi FFT và ma trận nhân được sử dụng trong DFT đều được viết bằng C.
Colin K

Trong trường hợp của Goertzel alg., Một cuộc thảo luận về hiệu quả thuật toán của nó so với FFT đã được đề cập trong phần bài giảng này của khóa học tín hiệu thời gian rời rạc tại MIT.
fcruz

Việc thực hiện một cách khéo léo thuật toán Goertzel có thể dẫn đến kết quả không chính xác, do đó cần có sự quan tâm. Người ta có thể xem xét sử dụng thay vì sửa đổi được đề xuất bởi Christian Reinsch. Xem ví dụ như cuộc thảo luận trong Bulirsch / Stoer .
JM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.