Tôi nên sử dụng dữ liệu nào để kiểm tra triển khai FFT và độ chính xác nào tôi mong đợi?


14

Tôi tham gia với nỗ lực triển khai thuật toán FFT và tò mò không biết lời khuyên được đề xuất cho dữ liệu thử nghiệm đầu vào sẽ sử dụng - và tại sao! - và độ chính xác để mong đợi.

Trong các bài kiểm tra đầu vào, tôi đã tìm thấy một hướng dẫn nhỏ trong các bài đăng cũ của Usenet mà tôi sẽ đăng dưới dạng câu trả lời, nhưng đó chỉ là đề xuất của một người mà không có nhiều lời biện minh - Tôi không tìm thấy bất cứ điều gì giống như một câu trả lời chắc chắn.

Về độ chính xác, Wikipedia nói rằng lỗi phải là O (e log N), nhưng kỳ vọng hợp lý về mặt tuyệt đối là gì?

Chỉnh sửa để thêm: Các thử nghiệm thực tế ở dạng tôi đã lưu trữ các mảng dữ liệu đầu vào và dữ liệu đầu ra "tham chiếu" được tính toán trước để so sánh, vì vậy tôi không nhất thiết cần một cái gì đó với giải pháp dạng đóng.

Câu trả lời:


12

Nếu bạn muốn xác minh tính chính xác của thuật toán FFT , theo nghĩa là nó thực hiện chức năng mong muốn có các thuộc tính đã biết của biến đổi Fourier rời rạc , thì bạn có thể sử dụng phương pháp được đề xuất trong:

Ergün, Funda. (1995, tháng 6). Kiểm tra các hàm tuyến tính đa biến: Khắc phục nút cổ chai máy phát. Trong Proc. Ngày thứ hai mươi bảy. Biểu tượng ACM. Lý thuyết tính toán . (tr. 407444).

Bài viết trên được các nhà sản xuất FFTW tham khảo là phương pháp lựa chọn của họ để xác minh rằng việc triển khai FFT cụ thể thực hiện những gì cần làm. Kỹ thuật đề xuất chắt lọc chức năng thành ba thành phần chính được xác minh bằng các thử nghiệm riêng biệt:

  • Độ tuyến tính: Các DFT (cùng với biến đổi anh em họ khác của nó trong gia đình Fourier) là một toán tử tuyến tính , vì vậy cho tất cả các giá trị của , phương trình sau phải giữ:một1,một2,x1[n],x2[n]

FFT(một1x1[n]+một2x2[n])= =một1FFT(x1[n])+một2FFT(x2[n])
  • DFT của xung đơn vị: Tín hiệu miền thời gian bằng hàm delta Kronecker được áp dụng cho đầu vào của thuật toán FFT và đầu ra được kiểm tra theo DFT đã biết của hàm xung đơn vị (nó biến đổi thành giá trị không đổi trong tất cả đầu ra thùng). Nếu thuật toán FFT cung cấp IFFT, nó có thể được kiểm tra ngược lại để cho thấy rằng nó mang lại hàm xung đơn vị một lần nữa.

  • Thời gian thay đổi: Hai bộ dữ liệu được áp dụng cho đầu vào của thuật toán FFT; sự khác biệt duy nhất giữa hai trong miền thời gian là sự thay đổi thời gian không đổi. Dựa trên các đặc tính đã biết của DFT, điều này sẽ ảnh hưởng đến sự dịch pha tuyến tính đã biết giữa các biểu diễn miền tần số của hai tín hiệu, trong đó độ dốc của sự dịch pha tỷ lệ thuận với sự dịch chuyển thời gian.

Các tác giả của bài báo khẳng định rằng các thử nghiệm này là đủ để xác nhận tính đúng đắn của việc thực hiện FFT. Tôi đã không sử dụng kỹ thuật này trong quá khứ, nhưng nó có vẻ hợp lý và tôi sẽ tin tưởng các tác giả của FFTW (người đã sản xuất một phần mềm miễn phí tuyệt vời) như các cơ quan đáng tin cậy về cách tiếp cận tốt đối với vấn đề xác nhận.


Cảm ơn! Các tác giả có gợi ý nào cho các giá trị của a1, a2, x1 [n] và x2 [n] để sử dụng trong phép thử tuyến tính không (hoặc họ có khẳng định rằng điều này phần lớn không quan trọng)? Và, đối với vấn đề đó, cho các tập dữ liệu sẽ sử dụng cho bài kiểm tra dịch chuyển thời gian?
Brooks Moses

3
Khi thực sự đọc bài báo, tôi có thể trả lời câu hỏi của riêng mình: Các tác giả không mô tả cách người ta thực hiện kiểm tra tuyến tính, mà thay vào đó giả định rằng người ta đã làm nó đủ để chứng minh rằng nó đúng với "hầu hết các đầu vào". Ngoài ra, bài viết này là mô tả một bằng chứng về tính chính xác giả định số học chính xác; nó không mô tả một phương tiện để mô tả lỗi số trong một chương trình gần đúng (vì nhất thiết là kết quả của việc sử dụng số học chính xác hữu hạn).
Brooks Moses

Tôi sẽ tiếp tục và đánh dấu điều này là được chấp nhận, bởi vì đó chắc chắn là câu trả lời tốt nhất cho đến nay - nhưng tôi vẫn rất quan tâm đến các câu trả lời khác bao gồm bộ dữ liệu đầu vào thử nghiệm nào sẽ sử dụng (và tại sao) hoặc chi tiết về độ chính xác dự kiến . Cảm ơn!
Brooks Moses

2
Có hai thành phần thực sự cho câu hỏi của bạn về việc xác nhận thuật toán FFT: xác nhận tính chính xác của nó và đo lường độ chính xác của nó. Câu trả lời của tôi chỉ giải quyết đầu tiên. Thật khó để đưa ra bất kỳ tuyên bố nào về độ chính xác số lượng để mong đợi, bởi vì nó vốn phụ thuộc vào việc thực hiện. Loại số học (ví dụ: cố định so với dấu phẩy động), cấu trúc được sử dụng để thực hiện thuật toán, độ dài FFT (tức là số giai đoạn được sử dụng để phân tách vấn đề), mọi phím tắt được thực hiện để cải thiện tốc độ thực thi, v.v. yếu tố và rất khó để khái quát.
Jason R

Điểm tốt; Tôi có lẽ nên hỏi những câu hỏi riêng biệt.
Brooks Moses

5

Như đã đề cập trong câu hỏi, tôi đã tìm thấy một tập hợp các đề xuất trong các bài đăng comp.dsp Usenet được lưu trữ ( http://www.dsprelated.com/showmessage/71595/1.php , đăng bởi "tdillon"):

A.Single FFT tests - N inputs and N outputs
 1.Input random data
 2.Inputs are all zeros
 3.Inputs are all ones (or some other nonzero value)
 4.Inputs alternate between +1 and -1.
 5.Input is e^(8*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 6.Input is cos(8*2*pi*i/N) for i = 0,1,2, ...,N-1.
 7.Input is e^((43/7)*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 8.Input is cos((43/7)*2*pi*i/N) for i = 0,1,2, ...,N-1.

B.Multi FFT tests - run continuous sets of random data
 1.Data sets start at times 0, N, 2N, 3N, 4N, ....
 2.Data sets start at times 0, N+1, 2N+2, 3N+3, 4N+4, ....

Các chủ đề cũng đề nghị thực hiện hai sin, một với biên độ lớn và một với biên độ nhỏ.

Như tôi nói trong câu hỏi chính, tôi không chắc đây có phải là một bộ câu trả lời đặc biệt hay không, hoặc nếu nó rất đầy đủ, nhưng tôi đang đặt ở đây để mọi người có thể bỏ phiếu và nhận xét về nó.


1
Điều gì sẽ "1. Nhập dữ liệu ngẫu nhiên" tiết lộ?
Dilip Sarwate

1
@DilipSarwate: Kiểm tra Fuzz có thể hữu ích để phát hiện sự cố. Và, tùy thuộc vào loại đầu vào tiếng ồn (giả sử, nhiễu hồng hoặc nhiễu trắng), có thể hữu ích trong việc kiểm tra phân phối năng lượng tổng thể như mong đợi.
smokris

2
@Dilip - "Thử nghiệm khói" fft của tôi là ifft (fft (Random_ ware)) ~ = Random_ ware.
hotpaw2

@ hotpaw2 Vậy "công cụ ngẫu nhiên" có nghĩa là bạn chỉ thấy một loạt các số dường như không phù hợp với bất kỳ mẫu nào như hình sin? hoặc bạn kiểm tra đầu ra để xem nếuN các số có thể được coi là "ngẫu nhiên", ví dụ: lấy đầu vào là Gaussian phức tạp CN(0,1) và sau đó làm một bài kiểm tra giả thuyết để xem nếu (với, nói, 99% độ tin cậy) biểu đồ phân tán của đầu ra FFT trông giống như một biểu đồ phân tán sẽ được lấy từ N CN(0,1)mẫu ngẫu nhiên?
Dilip Sarwate

2
@Dilip: Tôi là một anh chàng phần cứng. Tôi muốn một cái gì đó có thể thay đổi tỷ lệ phần trăm cao của tất cả các bit trong tất cả các số nhân và CSA.
hotpaw2
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.