Khi nào cần xem xét điểm nổi gấp đôi (64 bit) cho Âm thanh


12

Khi tổng hợp và xử lý âm thanh trên các bộ xử lý hiện đại, khi nào người ta sẽ xem xét sử dụng một cái gì đó ngoài điểm nổi chính xác (32 bit)? Rõ ràng, âm thanh đến và đi ra thế giới thực là 16/24 bit, vì vậy tôi chỉ nói về độ chính xác của tín hiệu (cả chính âm thanh và những thứ như hệ số bộ lọc) trong phần mềm.

Giả sử:

  • CPU / DSP có hỗ trợ điểm nổi phần cứng cho cả độ chính xác đơn và kép
  • Ưu tiên là âm thanh chất lượng, hiệu suất không cao. Ví dụ, độ chính xác kép sẽ được xem xét nếu nó cung cấp chất lượng (cảm nhận) tốt hơn.

Câu trả lời:


9

Đĩa đơn phao của IEEE chỉ cung cấp khoảng 24 bit mantissa. Nhưng nhiều thuật toán DSP / lọc (biquad IIR có cực / số gần vòng tròn đơn vị, v.v.) yêu cầu nhiều hơn 24 bit mantissa cho các sản phẩm tính toán trung gian (bộ tích lũy, v.v.), để có kết quả cuối cùng chính xác đến gần 16 hoặc 24 bit. Đối với các loại thuật toán này, các bộ tích phân nguyên có tỷ lệ 32, 40 và 48 bit thường được sử dụng với các DSP không có FPU.

Nhưng trên nhiều triển khai bộ xử lý hiện tại (đối với PC, điện thoại thông minh, v.v.), FPU có độ chính xác kép nhanh hơn nhiều so với cố gắng sử dụng số nguyên có tỷ lệ 32 hoặc 64 bit khi thuật toán của bạn cần có hơn 24 bit sản phẩm trung gian.

Để ngăn chặn bộ đệm dữ liệu, dữ liệu thô có thể ở dạng số nguyên ngắn hoặc số chính xác đơn, trong khi chỉ hạt nhân tính toán cục bộ hơn mới có thể sử dụng định dạng độ phân giải cao hơn. Nhưng nếu bạn đang chia sẻ kết quả tính toán trung gian giữa các mô-đun DSP, giao thức trao đổi giữa các mô-đun cũng có thể được hưởng lợi từ một bus hoặc định dạng dữ liệu có độ phân giải cao hơn (hơn 24 bit).


Đây là loại thông tin tôi đã theo sau. Tôi sẽ chấp nhận câu trả lời này nếu bạn có thể vui lòng cung cấp một ví dụ cụ thể về trường hợp yêu cầu độ chính xác kép để làm cho bộ lọc hoạt động, nghĩa là nó sẽ nghe có vẻ tệ (hoặc ít nhất là khá bình thường) với độ chính xác duy nhất, nhưng trơn tru như bơ với độ chính xác gấp đôi.
dùng1849104

Ngoài ra, chính xác những gì bạn có nghĩa là bằng cách làm dơ bẩn bộ nhớ cache? Bạn có nghĩa là có gấp đôi số lượng dữ liệu đi qua sẽ khiến mọi thứ chậm lại khủng khiếp?
dùng1849104

Một ví dụ đã được đưa ra, IIR với các cực / số không gần vòng tròn đơn vị. Nếu có bộ đệm, thuật toán và bộ dữ liệu hoạt động phù hợp với bộ đệm này có thể nhanh hơn đáng kể so với bộ đệm.
hotpaw2

9

CPU / DSP có hỗ trợ điểm nổi phần cứng cho cả độ chính xác đơn và kép.

Nó thực sự phụ thuộc vào loại hỗ trợ mà bạn đang nói về. Trên x86, khi sử dụng các hướng dẫn dấu phẩy động kiểu x87, bạn có được độ chính xác bên trong 80 bit và cùng thời gian xử lý - cho dù bạn đang làm việc với độ chính xác đơn hay kép.

Nhưng khi sử dụng các hướng dẫn SIMD, bạn có thể hoàn thành công việc gấp hai lần bằng cách sử dụng số float 32 bit so với số float 64 bit. Đó là một vấn đề lớn.

Một điều nữa cần tính đến là bộ nhớ - sử dụng độ chính xác gấp đôi chia cho hai lượng dữ liệu phù hợp với mức bộ nhớ cache nhanh nhất.

Khi tổng hợp và xử lý âm thanh trên các bộ xử lý hiện đại,

Nó sẽ đi xuống loại tổng hợp và xử lý bạn làm. Nếu nó liên quan đến các bộ lọc IIR (hoặc nói chung là bất cứ thứ gì có biến trạng thái và / hoặc phản hồi), bạn có thể dễ dàng tự bắn vào chân mình (sự không ổn định hoặc độ chính xác thấp do cắt ngắn hệ số) với 32 bit, nếu bạn không nghĩ quá nhiều về những gì bạn đang làm Một số cấu trúc liên kết bộ lọc hoạt động hoàn hảo với 32-bit.

Trong mọi trường hợp, đó là một vấn đề chính xác về số - về chất lượng, sẽ không có bất kỳ sự khác biệt về nhận thức nào. Hãy nhớ rằng thật kỳ cục khi mong đợi một chuỗi âm thanh phần cứng có độ chính xác hơn 20 bit (giả sử bo mạch được định tuyến hoàn hảo và tất cả các bộ phận đều lý tưởng, chúng tôi vẫn đang chạy trong giới hạn của tiếng ồn Johnson!) - và độ chính xác này phần lớn được bao phủ bởi các phao chính xác đơn. Đường dẫn tín hiệu trên bàn trộn cao cấp có 50 op-amps, riêng lẻ có một số bậc biến dạng lớn hơn so với nhiễu lượng tử hóa của các phép toán số học trên các phao chính xác đơn.


Nó sẽ là an toàn để nói rằng việc sử dụng chính xác duy nhất với các chỉ lệnh SIMD sẽ luôn luôn cung cấp cho bạn khoảng gấp đôi hiệu suất so với độ chính xác gấp đôi?
dùng1849104

Vì tôi không còn có thể chỉnh sửa nhận xét trước đó: Tôi chưa bao giờ có cơ hội (trực tiếp) sử dụng bất kỳ bộ hướng dẫn SIMD nào. Có thể chỉ cần sử dụng độ chính xác duy nhất và có được hiệu suất gấp đôi? Hay thực tế có cản trở?
dùng1849104

6

Bạn cần biết các yêu cầu về số của thuật toán của bạn và chọn độ chính xác cho phù hợp.

Vì vậy, hãy làm toán ở đây: Điểm nổi 32 bit có mantissa 24 bit và số mũ 8 bit. Điều này cung cấp cho bạn khoảng 150 dB tín hiệu cho tỷ lệ nhiễu trong phạm vi động khoảng 1540 dB. Đó là rất nhiều cho hầu hết mọi thứ âm thanh. Độ chính xác gấp đôi mang lại cho bạn khoảng gấp đôi.

Mỗi thuật toán có các yêu cầu nhất định về độ chính xác số. Nếu được thiết kế đúng tất cả các thuật toán âm thanh mà tôi biết chỉ làm tốt với điểm nổi 32 bit. "Thiết kế đúng" là từ khóa ở đây. Ví dụ, băng tần thứ 6 truyền từ 40-200 Hz được lấy mẫu ở mức 44,1kHz được triển khai dưới dạng trực tiếp từ bộ lọc bi-quad II IIR thực sự sẽ có một số vấn đề nhiễu ở 32 bit. Tuy nhiên, nó hoạt động hoàn toàn tốt như bộ lọc chuyển tiếp mẫu II hoặc bộ lọc trực tiếp I.

Nếu bạn thử mở rộng một phần của bộ lọc thông dải tương tự bằng cách sử dụng chức năng Residuez () của Matlab, bạn sẽ nhận được kết quả xấu ngay cả với độ chính xác gấp đôi. Một lần nữa, các yêu cầu về số của thuật toán đối với dữ liệu đầu vào cụ thể đó vượt quá độ chính xác gấp đôi. Chìa khóa để khắc phục điều này không phải là mù quáng tăng độ chính xác, mà là sử dụng thuật toán tốt hơn để thay thế.

Cuối cùng, hãy xem điều gì làm cho độ nổi (32 bit hoặc 64 bit) dễ bị tổn thương: Bạn có dải động cực lớn, tức là bạn có thể giảm tín hiệu xuống 200dB, khuếch đại 500dB, giảm lại 300dB và bạn kết thúc chính xác nơi bạn bắt đầu gần như không mất gì về độ chính xác. Vì vậy, đó không phải là nó. Điểm nổi có vấn đề khi thêm các số có kích thước rất khác nhau. Có một điểm khi thêm một số nhỏ sẽ không tạo ra sự khác biệt nào, tức là bạn nhận được 1 + dx = 1. Con số "dx" này là khoảng 1,2e-7 cho điểm nổi 32 bit và 2,2e-16 cho 64 bit. Nếu thuật toán của bạn bao gồm cộng hoặc trừ các số cách xa nhau về độ lớn, bạn có thể gặp vấn đề.

Một ví dụ điển hình cho điều này là bộ lọc Direct Form II đã đề cập trước đó: Bộ lọc From II trực tiếp (xem ví dụ: https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) về cơ bản tính toán các biến trạng thái bằng cách lọc đầu vào với chức năng chuyển chỉ cực đầu tiên và sau đó lọc với các số không để tạo đầu ra. Bây giờ nếu các cực gần với vòng tròn đơn vị, hàm truyền chỉ cực sẽ rất, rất lớn. Vì vậy, biến trạng thái có thể lớn hơn nhiều so với đầu vào (lớn hơn 80db đến 100dB) và tổng các biến trạng thái với đầu vào tạo ra rất nhiều nhiễu.

Giải pháp ở đây là chuyển đến bộ lọc Mẫu II chuyển đổi hoặc Mẫu I trực tiếp. Phân tích cho thấy các biến trạng thái không thể lớn hơn đầu vào / đầu ra sau đó có thể là 12dB hoặc khoảng đó, do đó, sự không phù hợp cường độ không xảy ra ở vị trí đầu tiên.


2

Có hai lợi ích để tăng độ chính xác gấp đôi so với độ chính xác đơn: tăng phạm vi và độ phân giải tốt hơn. Tôi sẽ rất ngạc nhiên nếu phạm vi tăng sẽ tạo ra bất kỳ sự khác biệt trong ứng dụng của bạn. Nếu có, có thể có điều gì đó không đúng với tỷ lệ của bạn.

Nếu có một cải tiến, nó sẽ nằm trong độ phân giải. Độ phân giải tốt hơn có nghĩa là tiếng ồn lượng tử hóa ít hơn . Tuy nhiên, trừ khi nhiễu lượng tử hóa gần bằng với tất cả các nguồn nhiễu khác của bạn, tuy nhiên, nó có thể sẽ không tạo ra bất kỳ sự khác biệt nào. Bạn có thể thực hiện một số phân tích về mức độ nhiễu và tín hiệu của bạn để có ý tưởng về mức độ nhiễu đến từ lỗi lượng tử hóa, nhưng bạn sẽ không thực sự biết chắc chắn liệu nó có tạo ra sự khác biệt hay không cho đến khi bạn thực hiện nó với cả hai và xem nếu nó làm cho một sự khác biệt.


2

Nếu bạn đang làm việc với âm thanh tổng hợp trải qua nhiều quá trình xử lý giữa tạo và kết xuất (chuyển đổi thành số nguyên 16/24 bit), thì bạn sẽ được lợi khi làm việc với độ chính xác số tốt nhất mà máy của bạn có.

Nó cũng quan trọng để phân biệt cơ bản giữa số nguyên và số dấu phẩy động. Điểm nổi chính xác kép (64 bit) khác với số nguyên 64 bit và thậm chí bạn có thể làm việc với các số nguyên có độ chính xác tùy ý trong phần mềm, tùy thuộc vào các công cụ phần mềm bạn sử dụng. Điều đó sẽ rất quan trọng nếu bạn phải ghi lại âm thanh thay vì tạo ra chúng (theo như tôi biết, chuyển đổi AD luôn lưu âm thanh được lấy mẫu ở định dạng số nguyên).

Tôi không thể hoàn toàn chắc chắn về điều đó, nhưng nếu bạn tạo ra âm thanh của mình ở điểm nổi, các tạo tác phổ biến hơn rất có thể sẽ không xuất hiện theo định nghĩa và bạn có thể xử lý nó với "chất lượng âm thanh" hơn nhiều. Có lẽ bạn thậm chí có thể tạo các mẫu âm thanh chỉ sau khi bạn đã áp dụng một số hiệu ứng cho chính bộ tạo. Khoảnh khắc duy nhất khi bạn thực sự giới thiệu bất kỳ tạo phẩm tiềm năng nào là khi bạn chuyển đổi nó thành đầu ra ở một số định dạng tệp số nguyên, chẳng hạn như .WAV chẳng hạn.

Trên thực tế, vì hầu hết các máy đều có độ chính xác "gấp đôi" (64 bit) hiện tại, tôi không thấy lý do nào để hoạt động với 32 bit nữa ...

Mong rằng sẽ giúp!


3
"Tôi không thấy lý do để làm việc với 32 bit nữa ..." trừ khi bạn sử dụng SIMD!
pichenettes
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.