Tôi đã cố gắng tìm ra logic cho nhiệm vụ này và lên kế hoạch sử dụng gói nguồn KissFFT để thực hiện chuyển đổi phạm vi nhanh. Xin vui lòng cho tôi biết nếu điều này có vẻ đúng:
- Phân bổ một cấu trúc FFT, tức là.
kiss_fft_alloc(N,0,NULL,NULL)
Trong trường hợpN
là kích thước cửa sổ Tôi đang sử dụng. Bộ đệm đầu vào sẽ là một mảng cácN
phần tử của loạikiss_fft_scalar
. Bộ đệm đầu ra sẽ là một mảng cácN/2 + 1
phần tử của loạikiss_fft_cpx
. - Giải mã
N
(kích thước cửa sổ) số lượng mẫu PCM. - Đối với mỗi mẫu PCM, trung bình biên độ của mỗi kênh (các mẫu không dấu) và tỷ lệ từ 0 đến 2 (chia cho 65536.0), lưu kết quả vào bộ đệm đầu vào.
- Thực hiện cửa sổ (tức là Hanning) trên bộ đệm đầu vào.
- Thực hiện chuyển đổi Fourier nhanh trên bộ đệm đầu vào, lưu trữ vào bộ đệm đầu ra. Vì tôi đang sử dụng các giá trị thực làm đầu vào, tôi có thể sử dụng
kiss_fftr()
. - Đối với các
N/2
giá trị đầu ra, lấy độ lớn bình phương của dữ liệu được chuyển đổi và chuyển đổi các giá trị thành thang đo dB theo công thức sau:10 * log10 (re * re + im * im)
- Vẽ các
N/2
giá trị từ bước 6. - Hủy bỏ nửa đầu của bộ đệm đầu vào, giải mã các mẫu PCM tiếp theo (kích thước cửa sổ / 2) và thực hiện chia tỷ lệ và cửa sổ cho dữ liệu. Điều này sẽ trượt hiệu quả cửa sổ nhập và tránh phải làm lại toán trên các mẫu PCM đã xử lý.
- Lặp lại bước 5, lặp lại các bước này cho đến khi tất cả các mẫu được xử lý.
- Giải phóng bộ nhớ đã sử dụng từ
kiss_fft_alloc()
.
Có ý kiến cho rằng tôi trừ một giá trị khỏi cửa sổ nhập trước khi tôi thực hiện FFT, để giá trị DC kết quả có độ lớn bằng không. Tôi nên trừ trung bình hoặc trung bình từ dữ liệu đầu vào?
Ngoài ra, những điều tôi cần xem xét khi tôi chọn kích thước cửa sổ là gì? Bên cạnh đó, nó phải là một số chẵn theo hướng dẫn của KissFFT, có lợi ích gì khi sử dụng kích thước cửa sổ nhỏ, tức là. nó sẽ cung cấp cho một đồ thị tốt hơn? Tôi giả định rằng kích thước cửa sổ lớn làm giảm số lượng FFT phải được thực hiện, đó có phải là lợi ích duy nhất để sử dụng kích thước cửa sổ lớn?
Cuối cùng, khi tôi đến điểm mà dữ liệu đã sẵn sàng để vẽ, làm thế nào để tôi đi về âm mưu? Khi tôi làm việc với một số logic đồ thị dạng sóng trong quá khứ, tôi chỉ vẽ 3 giá trị cho mỗi pixel dọc theo -axis (biên độ cực tiểu, biên độ cực đại, biên độ RMS), nhưng tôi không biết tôi phải làm gì với dữ liệu phổ.
Cảm ơn bạn trước cho bất kỳ và tất cả các hướng dẫn bạn có thể cung cấp.