Cách tính toán hiệu quả chỉ các hệ số thấp của FFT không đệm


14

Tôi đã có một thuật toán không đệm một chuỗi thành 4N, thực hiện FFT và chỉ sử dụng điểm N tần số thấp nhất trong số 4N được tạo.

Điều này có vẻ như rất nhiều công việc lãng phí, bất kỳ ý tưởng làm thế nào điều này có thể được thực hiện nhanh hơn?


@Dipip. Tôi sẽ sử dụng các thư viện FFTW hoặc IMKL. Tất nhiên tôi có thể sử dụng thư viện Kissfft của mình, nhưng nó bắt đầu ở một bất lợi về tốc độ so với những người khác
Mark Borgerding

2
Tôi đã xóa bình luận mà bạn đã trả lời vì tôi muốn nói về việc giảm tần số nhưng thay vào đó lại viết số thập phân theo thời gian. Nhưng nhìn vào sơ đồ bướm ở đây. Nếu bạn viết một số mã cho hai giai đoạn đầu tiên cho -FFT để tính đến số lượng lớn các số 0 và bỏ qua các phép nhân tương ứng, thì bạn có thể gọi chương trình con thư viện FFT 4 lần cho các N -FFT trong đó các vectơ đầu vào là "đầy đủ". Tất nhiên, bạn chỉ cần N / 4 kết quả đầu ra từ mỗi lệnh gọi chương trình con. 4N4NN/4
Dilip Sarwate

Câu trả lời:


2

Nếu bạn chỉ có một vài thùng thì những điều sau đây có thể rất hiệu quả đối với bạn:
1. Đơn giản chỉ cần thực hiện DFT của mỗi tần số bạn cần.
2. Sử dụng thuật toán Goertzel cho từng tần số trong câu hỏi.


Mark cho biết anh ta cần thùng trong số 4 N , vì vậy 1) dường như không phải là một lựa chọn hợp lý. Thuật toán Goertzel có các ưu điểm như tính toán trực tuyến khi dữ liệu được nhận, lưu trữ nhỏ, v.v., nhưng cần 2 phép nhân N + 4 mỗi thùng, trong khi mỗi thùng được tính như một phép đánh giá đa thức thông qua quy tắc của Horner chỉ cần N nhân. Do đó, 2) dường như cũng không phải là một lựa chọn đặc biệt hợp lý. N4N2N+4N
Dilip Sarwate

Bạn nói đúng, trong khi đọc câu hỏi tôi bằng cách nào đó đã bỏ lỡ các chi tiết. Trong khi tôi đang trả lời tôi đã nghĩ, "Gee, thật tuyệt khi biết anh ấy muốn bao nhiêu thùng ..." Đoán tôi nên đọc lại câu hỏi trước khi trả lời.
Jacob

2

Không đệm đến chiều dài 4X, tính toán FFT dài hơn, và sau đó chỉ sử dụng các thùng 1/4 dưới cùng tạo ra kết quả gần như giống hệt với phép nội suy Sinc của FFT có độ dài ban đầu.

Vì vậy, chỉ cần sử dụng độ dài FFT ban đầu và nội suy bằng hạt nhân nội suy 3 pha với độ rộng cửa sổ phù hợp.


0

Không đệm trong miền thời gian cung cấp cho bạn giải pháp tần số cao hơn nhưng không có thông tin mới, do đó, nó cung cấp về cơ bản nội suy trong miền tần số. Tùy thuộc vào bản chất của tín hiệu của bạn và độ chính xác cần thiết, bạn có thể có được các điểm tần số bổ sung với FFT thường xuyên của N điểm và thực hiện phép nội suy phù hợp (tuyến tính, spline, pchip, chân, v.v.).


x(z)=i=0N1xizixiN1Nαn,0nN1α=exp(j2π/N)NNXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N)N

β4=αx(β4k)x(β4k)=x(αk)

Tôi nghi ngờ sẽ khó thực hiện phép nội suy đàng hoàng nhanh hơn so với thực hiện FFT lớn hơn.
Mark Borgerding

Giả sử bạn có tốc độ mẫu 128 điểm FFT và 12800Hz. Một FFT 128 điểm cho các giá trị ở 0Hz, 100Hz, 200 Hz, 300Hz, v.v ... Điều mà phần đệm bằng 0 làm là tăng độ phân giải tần số lên 0 Hz, 25Hz, 50 Hz, 100Hz, v.v. Đối với tôi về mặt toán học, bạn cần phải thực hiện phép nội suy tròn theo thứ tự thứ 128. Điều đó chắc chắn không đáng bận tâm nhưng tùy thuộc vào ứng dụng và độ chính xác yêu cầu nội suy bậc thấp hơn nhiều sẽ đủ tốt
Hilmar
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.