Có hợp lệ để tăng biên độ (và có lẽ là chất lượng FFT) bằng cách đơn giản nhân rộng dữ liệu không?


10

Tôi đang sử dụng phiên bản "KISS FFT" của Mark Borgerding. Nó chấp nhận một mảng các giá trị đầu vào điểm cố định 16 bit và tạo ra mảng kết quả float 32 bit.

Tôi đã phát hiện ra rằng nếu biên độ đầu vào thấp, nhiều giá trị kết quả thả nổi bằng 0, nhưng nếu tôi chỉ đơn giản chia tỷ lệ các đầu vào (bằng cách nói, hệ số 16) thì ít giá trị đầu ra bằng 0 và do đó đầu ra dường như chứa chi tiết hơn (Không phải nó quan trọng cho mục đích của tôi, nhưng để thống nhất, sau đó tôi chia các giá trị float kết quả cho cùng một hệ số tỷ lệ.)

Dù sao, điều này có vẻ hiệu quả, về mặt tạo ra kết quả khi trước đây tôi chỉ nhận được một bộ đệm gồm hầu hết các số không, nhưng tôi tự hỏi liệu có lý do nào đó có thể không phải là một cách tiếp cận hợp lệ.

(Lưu ý rằng phương pháp này có nghĩa là có nhiều "độ thô" / độ chi tiết hơn cho dữ liệu, và đặc biệt, tiếng ồn ở mức độ thấp thường có mặt là không. Tôi gần như tự hỏi liệu có nên khôn ngoan khi tiêm không một số nhiễu mức thấp để thay thế các giá trị 0 trong đầu vào.)


"Tôi gần như tự hỏi liệu có nên khôn ngoan khi đưa ra một số nhiễu mức thấp để thay thế các giá trị 0 trong đầu vào hay không." = en.wikipedia.org/wiki/Dither
endolith

Câu trả lời:


7

Đây có thể là một cách tiếp cận hợp lệ. Bạn đang quan sát một vấn đề rất thực tế thường phát sinh khi sử dụng số học điểm cố định (nghĩa là số nguyên) (mặc dù nó cũng có thể xảy ra trong dấu phẩy động). Khi định dạng số mà bạn đang sử dụng để thực hiện các phép tính không đủ độ chính xác để thể hiện toàn bộ phạm vi giá trị có thể phát sinh từ các tính toán của bạn, một số hình thức làm tròn được yêu cầu (ví dụ: cắt ngắn, làm tròn đến gần nhất và như vậy trên). Điều này thường được mô hình hóa như một lỗi lượng tử hóa phụ gia cho tín hiệu của bạn.

Tuy nhiên, đối với một số kết hợp thuật toán và sơ đồ làm tròn, khi cường độ của tín hiệu đầu vào rất thấp, có thể nhận được những gì bạn quan sát thấy: một số lượng lớn đầu ra bằng không. Về cơ bản, ở đâu đó trong chuỗi các hoạt động, các kết quả trung gian đang trở nên đủ nhỏ để không phá vỡ ngưỡng cần thiết để định lượng đến mức khác không. Giá trị sau đó được làm tròn thành 0, thường có thể truyền về phía trước tới đầu ra. Kết quả là, như bạn đã lưu ý, một thuật toán tạo ra nhiều số không đầu ra.

Vì vậy, bạn có thể khắc phục điều này bằng cách nhân rộng dữ liệu? Đôi khi (có rất ít kỹ thuật hoạt động mọi lúc!). Nếu tín hiệu đầu vào của bạn bị giới hạn về độ lớn với giá trị dưới thang đo đầy đủ của định dạng số (số nguyên có chữ ký 16 bit chạy từ -32768 đến +32767), thì bạn có thể chia tỷ lệ tín hiệu đầu vào để sử dụng đầy đủ hơn phạm vi có sẵn cho nó Điều này có thể giúp giảm thiểu ảnh hưởng của lỗi vòng, vì cường độ của bất kỳ lỗi vòng nào trở nên nhỏ hơn so với tín hiệu đáng quan tâm. Vì vậy, trong trường hợp tất cả các kết quả đầu ra của bạn được làm tròn thành số không trong thuật toán, điều này có thể giúp ích.

Khi một kỹ thuật như vậy có thể làm tổn thương bạn? Tùy thuộc vào cấu trúc tính toán của thuật toán, việc tăng tín hiệu đầu vào lên có thể khiến bạn bị tràn số. Ngoài ra, nếu tín hiệu chứa nhiễu nền hoặc nhiễu có cường độ lớn hơn lỗi vòng của thuật toán, thì chất lượng của những gì bạn nhận được ở đầu ra sẽ bị giới hạn bởi môi trường, không phải lỗi được đưa vào tính toán.


Tôi đang sử dụng một kỹ thuật năng động để nhân rộng có vẻ hoạt động khá tốt. Và, như may mắn sẽ có, các quá độ cực đoan được coi là tiếng ồn và bị cắt bớt, do đó, việc cắt đôi khi không phải là một vấn đề. Bạn có nghĩ rằng nó hợp lệ để "giải trừ" đầu ra bằng cách chia cho hệ số tỷ lệ của đầu vào không?
Daniel R Hicks

1

Cách dễ nhất và chứng minh ngu ngốc nhất để giải quyết vấn đề này là chuyển đổi dữ liệu thành dấu phẩy động TRƯỚC FFT và sử dụng FFT dấu phẩy động. Nhược điểm duy nhất của phương pháp này là bạn có thể tiêu thụ nhiều bộ xử lý và bộ nhớ hơn. Vì đầu ra của bạn là điểm nổi dù sao, có lẽ có rất ít sự khác biệt thực tế.


Tôi đã được bàn giao dự án này với thuật toán FFT hiện tại đã có, và tôi miễn cưỡng làm quen với nó vào thời điểm này. Và đây là tất cả những gì đang diễn ra trên một chiếc điện thoại, trong thời gian thực, vì vậy hiệu năng chắc chắn là một vấn đề.
Daniel R Hicks

Hiểu. Bạn có biết nếu nội bộ FFT là cố định hoặc dấu phẩy động? Nếu nó được sửa, bạn cần lo lắng về việc cắt, tràn và tràn
Hilmar

Các tài liệu và bình luận là đặc biệt trong sự vắng mặt của nó, nhưng tôi thấy rất nhiều ints trong mã và vài phao và đôi quý giá. Nó dường như bao gồm khung #ifdef thô để chuyển từ 16 bit sang 32 bit hoặc float, nhưng khung rõ ràng đã bị vô hiệu hóa từ lâu.
Daniel R Hicks

Một iPhone (CPU ARM + NEON) có thể thực hiện FFT nổi nhanh hơn (thông qua khung Tăng tốc) so với FFT số nguyên trong C.
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.