Hiện vật trong FFT


10

Gần đây tôi nhận ra rằng FFT không hoàn hảo. Có nghĩa là nếu tôi lấy tín hiệu và sau đó lấy FFT, rồi thực hiện FFT ngược, đầu ra kết quả không chính xác như đầu vào. Đây là một hình ảnh để cho bạn thấy những gì tôi có nghĩa là:FFT không phải lúc nào cũng hoạt động

Tôi nghĩ rằng hình ảnh là khá tự giải thích. Tín hiệu IFFT chỉ là một biến đổi nghịch đảo của "phổ FFT" và âm mưu "Khác biệt" là sự khác biệt giữa tín hiệu IFFT và tín hiệu gốc ( ).IFFT - Original

Rõ ràng có một số đồ tạo tác, mặc dù chúng thực sự nhỏ. Tôi muốn biết lý do tại sao chúng xảy ra ở nơi đầu tiên. Đây có phải là do cửa sổ hữu hạn của biến đổi fourier? Hay vì một cái gì đó trong thuật toán FFT?

Lưu ý: Biểu đồ này có 32 điểm, nhưng tôi đã kiểm tra với 100, 1000, 1024, 256 và 64 điểm và luôn có phần dư này trong sự khác biệt về cường độ tương tự ( hoặc ).10-1610-15


4
Tất cả các phép toán có độ chính xác giới hạn đều có những lỗi này, không chỉ các FFT.
endolith

Câu trả lời:


16

Sự khác biệt bạn thấy là do lỗi số ở định dạng dấu phẩy động. Tất cả các thao tác cần thiết để thực hiện FFT và FFT nghịch đảo chỉ có thể được thực hiện với độ chính xác hữu hạn và bạn đã cho thấy kết quả của độ chính xác hữu hạn này trong âm mưu bên phải thấp hơn của bạn.


Sẽ có một tình huống mà lỗi này có thể nổ tung vượt quá độ chính xác của dấu phẩy động?
Kitchi

6
Và chỉ để xác nhận câu trả lời của @ MattL: và có 53 bit mantissa trong các số dấu phẩy động có độ chính xác kép. Vì vậy, lỗi làm tròn mà bạn đang thấy chỉ nằm ở 2 bit cuối cùng. Đó là tốt như nó được. 10-162-53
Logic lang thang

@Kitchi: có, có nhiều tình huống lỗi số có thể là một vấn đề lớn, ngay cả ở định dạng dấu phẩy động. Ma trận đảo ngược sẽ là một trong nhiều ví dụ. Tất cả phải làm với số điều kiện .
Matt L.

1
@MattL. - Tuyệt vời! Cảm ơn đã tham khảo.
Kitchi

7

Nói chung, một số không thể được trình bày chính xác ở dạng kỹ thuật số. Một lỗi được giới thiệu. Nếu bạn ở Matlab, bạn có thể viết eps theo lệnh, nó sẽ cung cấp cho bạn một số.

EPS, không có đối số, là khoảng cách từ 1.0 đến số chính xác kép lớn hơn tiếp theo, đó là EPS = 2 ^ (- 52).

Lỗi bạn thấy trong cốt truyện của mình nằm trong phạm vi được trả về bởi eps (đó là 2 ^ (- 52)).

Mặc dù bạn mong đợi các giá trị thực trong đầu ra của mình từ IFFT, bạn có thể thấy rằng phần ảo của mình không chính xác bằng không. Điều tương tự.

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.