Có một số phần cho câu trả lời này. Tôi dựa trên câu trả lời này dựa trên các đặc điểm của thuật toán FFT. Tôi không quen với việc triển khai LTSpice cụ thể, nhưng hành vi bạn báo cáo là chính xác những gì tôi mong đợi.
Việc triển khai FFT phổ biến nhất hoạt động dựa trên công suất nguyên gồm 2 điểm dữ liệu. Vì vậy, hầu hết các triển khai sẽ đệm 1.000.000 điểm dữ liệu của bạn lên tới 1.048.576 điểm dữ liệu và thực hiện FFT trên đó. Lưu ý rằng độ dài này không phải là số nguyên của sóng hình sin.
Có các phương pháp Biến đổi Fourier thay thế phân tách dữ liệu khác nhau. Chúng thường có tên là các phương thức Biến đổi Fourier rời rạc (DFT) và cả hai đều chậm hơn và phức tạp hơn đáng kể để thực hiện. Tôi gần như chưa bao giờ gặp chúng trong các ứng dụng thực tế. FFT là một triển khai DFT cụ thể yêu cầu số lượng điểm dữ liệu phải là công suất nguyên là 2 (hoặc đôi khi là công suất nguyên là 4).
Vì vậy, tôi giả định rằng LTSpice đang đệm dữ liệu của bạn lên tới 1.048.576 điểm dữ liệu, 48.576 giá trị dữ liệu được thêm vào ở cuối chứa một hằng số.
Bây giờ bạn có thể thấy vấn đề: bộ đệm của bạn gồm 1.048.576 mẫu có 1.000 sóng hình sin, mỗi mẫu là 1.000 mẫu, theo sau là 48.576 giá trị không đổi. Điều này không thể được biểu diễn bằng tổng sóng hình sin có tần số 1kHz. Thay vào đó, kết quả FFT hiển thị các giá trị tần số cao bổ sung cần thiết để tái tạo tín hiệu của bạn.
Để xác định xem đây có phải là sự cố không, hãy tạo bộ đệm gồm 1.048.576 mẫu có chứa sóng hình sin với chu kỳ 1.024 mẫu. Các tần số cao nên được giảm đáng kể về cường độ.
Bây giờ, như hiệu quả của việc áp dụng một cửa sổ:
Thuật toán FFT về mặt khái niệm 'bao bọc' dữ liệu, do đó, điểm cuối cùng của dữ liệu đầu vào được theo sau bởi điểm đầu tiên của dữ liệu đầu vào. Nghĩa là, FFT được tính như thể dữ liệu là vô hạn, được lặp lại theo vòng tròn, như một vectơ với chuỗi: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...
Gói này có thể dẫn đến một bước chuyển giữa điểm cuối cùng trong bộ đệm dữ liệu và điểm đầu tiên. Bước chuyển đổi này tạo ra kết quả FFT với sự đóng góp lớn (giả) từ tần số cao. Mục đích của một cửa sổ là để loại bỏ vấn đề này. Hàm cửa sổ chuyển về 0 ở cả hai đầu, vì vậy trong trường hợp của bạn, w [0] và w [999999] đều bằng không. Khi dữ liệu được nhân với cửa sổ, các giá trị trở thành số 0 ở đầu và cuối, do đó không có bước chuyển tiếp nào ở phần bọc.
Hàm cửa sổ bạn áp dụng làm thay đổi nội dung tần số của bộ đệm, bạn chọn một hàm thể hiện sự đánh đổi chấp nhận được. Một gaussian là một điểm khởi đầu tốt. Đối với bất kỳ ứng dụng thực tế nào mà bạn không thể kiểm soát chính xác nội dung tần số của dữ liệu, bạn sẽ phải áp dụng chức năng cửa sổ để loại bỏ bước chuyển ngụ ý do độ dài dữ liệu.
Các vấn đề còn lại:
Có một nguồn tiềm năng khác của nhiễu phổ tần số cao trong FFT. Hiệu ứng tăng theo chiều dài FFT và nó có thể là thứ bạn có thể thấy trong một số trường hợp tại 1.000.000 điểm dữ liệu.
Vòng lặp bên trong thuật toán FFT sử dụng các điểm xung quanh một vòng tròn trong mặt phẳng phức: e ^ (i * theta), trong đó thuật toán lặp lại 'theta' từ 0 đến 2 * pi theo các bước tinh xảo liên tiếp, lên đến số điểm trong FFT. Nghĩa là, nếu bạn tính toán FFT trên 1.048.576 mẫu, trong một trong các lần lặp của vòng lặp bên ngoài, vòng lặp bên trong sẽ tính toán e ^ (i * theta), trong đó theta = 2 * pi * n / N, trong đó N là 1.048.576 , lặp n từ 0 đến 1,048,575. Điều này được thực hiện bằng phương pháp rõ ràng là nhân liên tiếp với e ^ (i * 2 * pi / N).
Bạn có thể thấy vấn đề: khi N trở nên lớn, e ^ (i * 2 * pi / N) trở nên rất gần với 1 và nó được nhân N lần. Với điểm nổi chính xác kép, các lỗi nhỏ, nhưng tôi nghĩ bạn có thể thấy sàn nhiễu kết quả nếu bạn xem xét kỹ. Với điểm nổi chính xác đơn, tại 1.000.000 điểm dữ liệu, chính phép tính FFT tạo ra một mức nhiễu đáng kể.
Có các kỹ thuật thay thế cho điện toán e ^ (i * theta) để loại bỏ vấn đề này, nhưng việc thực hiện phức tạp hơn. Tôi chỉ phải tạo ra một triển khai như vậy một lần.