2010-10-18 43 views
6

Tôi hiện đang triển khai FFT hai chiều cho dữ liệu đầu vào thực sử dụng opencl (cụ thể hơn là chuyển đổi 2D nhanh bằng FFT, vì vậy tôi chỉ cần một cái gì đó hoạt động đủ để áp dụng convolution). FFT 2D được thực hiện bằng cách sử dụng FFT 1D trên các hàng và sau đó là FFT 1D trên các cột.Hiệu quả 2D FFT trên dữ liệu đầu vào thực?

Để làm điều này hiệu quả hơn, tôi đang cố gắng sử dụng các đối xứng của FFT với đầu vào thực để có thể tính toán các FFT nhỏ hơn. Tôi thấy rằng tôi có thể kết hợp hai hàng thành một, sử dụng thành phần đầu tiên là thành phần thực, thứ hai là thành phần tưởng tượng, thực hiện FFT 1D đầu tiên trên hàng kết quả và sau đó sử dụng các thuộc tính đối xứng để xây dựng kết quả của FFT 1D của cá nhân hàng từ đó. Vì vậy, những gì tôi đang làm về cơ bản như sau:

Hãy để fg là các hàng từ ma trận.

  1. Xây dựng x = f + i * g
  2. Transform để có được F(x) = F(f) + i * F(g)
  3. Sử dụng đối xứng để giải nén F(f)F(g) từ F(x)

tôi không thể tuy nhiên chỉ đầu vào kết quả trực tiếp vào 2 1D FFT, bởi vì trong trường hợp đó, tôi sẽ không biến đổi toàn bộ ma trận, mà thay vào đó là hai submatric. Tuy nhiên việc trích xuất dữ liệu giữa các phép biến đổi có nghĩa là lưu trữ nhiều dữ liệu hơn (n/2+1 các mục cần thiết để biểu thị kết quả của một FFT 1D trên đầu vào thực) hoặc kết hợp các phần tử tại chỉ mục 0 và chỉ mục n/2 vào một phần tử. các số được đảm bảo là có thật) và sử dụng cùng một lượng lưu trữ nhưng phải tạo ra một trường hợp spcial cho nó trong convolution của tôi.

Vì tôi cố gắng sử dụng lại bộ đệm càng nhiều càng tốt (do RAM hạn chế khả dụng trên gpu), việc sử dụng nhiều bộ nhớ hơn không phải là giải pháp tốt. Hơn nữa thuật toán của tôi không được trang bị để làm việc trên ma trận mà không phải là sức mạnh của 2/bội số của 16 (thay đổi từ hạt nhân để hạt nhân). Tôi thà tránh giới thiệu các trường hợp đặc biệt, vì những người sẽ làm cho hạt nhân của tôi phức tạp hơn làm tổn thương hiệu quả (Tôi đã gặp rắc rối để giảm thiểu số lượng đăng ký được sử dụng bởi mỗi hạt nhân). Vì vậy, câu hỏi của tôi là nếu có một cách tiếp cận thanh lịch cho vấn đề này, có nghĩa là một trong đó sẽ làm việc mà không cần sử dụng bộ nhớ nhiều hơn hoặc các trường hợp đặc biệt cho các yếu tố nhất định? Không.

Lý tưởng nhất là tôi muốn có thể thực hiện toàn bộ FFT mà không chia tách dữ liệu kết hợp của tôi ở giữa FFT, nhưng tôi không chắc chắn rằng có thể.

+3

Điều này sẽ sớm được phát hành trong bìa mềm? –

+0

Bạn có thực sự cần phải làm một FFT phức tạp? Chắc là không. – phkahler

+0

câu hỏi hay, tôi đã gặp vấn đề gần như tương tự trong khi làm fft để phát hiện steganography. nhưng tôi đã không nhận ra sau đó ... rằng stackoverflow tồn tại;/ – dfens

Trả lời

2

Hmmm ... tài liệu tham khảo hai của tôi là:

http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM http://images.apple.com/acg/pdf/FFTapps_20090909.pdf

Tôi nghĩ rằng cam kết đến một dữ liệu "Hermitian" cấu trúc, với 0 và n/2 giá trị đóng gói vào yếu tố đầu tiên là con đường để đi, như chuyển tiếp/nghịch đảo và ẩn sĩ cấu trúc sẽ làm việc ra tốt hơn.

Bằng cách đó, bạn có rUnWrap (FFT (n/2, Even (x) + i * Odd (x))) = rFFT (x) và riFFT có thể hoạt động trên mảng "hermitian", tạo ra pair of arrays Even và Odd, một lần nữa cho cấu trúc ban đầu.

Cũng có các mẫu khác có thể được thực hiện, nhờ đó mảng gốc được chia thành 4 n/2xn/2 mảng, bắt nguồn từ (0,0), (0,1), (1,0) , (1,1) và sau đó gói lên ở cuối, bằng cách sử dụng một radix-4 vượt qua ... có lẽ đó là tốt hơn cho bộ nhớ GPU ... Tôi không biết.

alan

Các vấn đề liên quan