Cố định lượng giác điểm cho các ứng dụng nhúng


9

Tôi cần thực hiện các phép biến đổi xoay (và khác) trong một ứng dụng nhúng, yêu cầu các hàm sin () cos () và tan (). Tôi biết bạn có thể sử dụng các bảng tra cứu và đó là giải pháp duy nhất tôi có thể tìm thấy khi thực hiện nghiên cứu của riêng mình, nhưng có một thư viện trig điểm cố định tốt ngoài đó không?

Tôi đang nghĩ đến việc sử dụng vỏ não M3 cho ứng dụng, vì vậy tôi muốn tránh xa điểm nổi càng nhiều càng tốt để giữ cho các ứng dụng nhanh chóng.


Hai suy nghĩ: Một cách thực hiện nguyên thủy truyền thống của phép quay là thuật toán CORDIC. Bạn cũng có thể xem liệu nhà cung cấp của bạn hiện có cung cấp Cortex M4 cạnh tranh với M3 mà bạn đang xem xét hay không.
Chris Stratton

4
Tại sao bạn không muốn sử dụng bảng tra cứu? Điều đó làm việc rất tốt cho tội lỗi và cos. Làm tội lỗi và cos theo thuật toán sẽ mất nhiều thời gian hơn. Ưu điểm duy nhất có thể là ít không gian bộ nhớ chương trình được sử dụng, nhưng điều đó có thực sự quan trọng trong ứng dụng của bạn không?
Olin Lathrop

@OlinLathrop, tôi muốn biết những gì người khác đã tìm thấy: có lẽ một số cách hiệu quả để giải quyết vấn đề nhanh chóng với ít lỗi trong khi tiết kiệm dung lượng bộ nhớ tồn tại mà tôi chưa tìm thấy? Từ những gì tôi biết (và tôi có thể sai), vấn đề lớn nhất để giải thuật toán với các thư viện chuẩn là tất cả các phép toán được thực hiện trong dấu phẩy động, và không có FPU mà tất cả phải được thực hiện bằng số, rất kém hiệu quả. .. Rắc rối lớn nhất với các bảng tra cứu là: tôi cần chính xác đến mức nào? Và nếu req chính xác đó thay đổi, tôi vẫn sẽ có đủ bộ nhớ chương trình chứ?
Bob

Bạn cần chính xác đến mức nào? Một bảng tra cứu kích thước khiêm tốn là khá đủ cho hầu hết các nhu cầu sin / cos nhúng. Với 1025 mục trong bảng, bạn có được độ phân giải 4096 góc. Tại thời điểm đó, interoplation tuyến tính cung cấp cho bạn độ chính xác tốt giữa các mục trong bảng. Dường như có rất nhiều huyền thoại không chính xác về tra cứu hình sin. Xem câu trả lời của tôi tại Electronics.stackexchange.com/a/16516/4512 để biết thêm chi tiết.
Olin Lathrop

Tôi nghe thấy những gì bạn đang nói, và tôi hiểu ý tưởng của bảng tra cứu cho hàm sin, nhưng nếu tôi bị giới hạn mã (các dự án luôn lấp đầy không gian mã), có cách nào xử lý gọn hơn không? Đó là lý do tại sao tôi hỏi: có rất nhiều người tài năng ngoài kia đóng góp, và tôi muốn biết liệu họ có tìm thấy điều gì tốt hơn không.
Bob

Câu trả lời:


6

Một cách tiếp cận tốt để thực hiện lượng giác trong các ứng dụng nhúng là sử dụng các xấp xỉ đa thức cho các hàm bạn cần. Mã này nhỏ gọn, dữ liệu bao gồm một vài hệ số và các hoạt động duy nhất cần có là nhân và cộng / trừ. Nhiều hệ thống nhúng có hệ số nhân phần cứng, cho hiệu năng tốt.


1
Có ai đã phát hành phiên bản này trong C được tối ưu hóa cho các ứng dụng nhúng không sử dụng hướng dẫn dấu phẩy động chưa? Lỗi cao ở hai bên của phép tính gần đúng đa thức cho phép sử dụng các thủ thuật để sử dụng các đa thức khác nhau cho các phân đoạn khác nhau để giảm lỗi hoặc một số mẹo khác ...
Bob

1
Generic C không hỗ trợ trực tiếp các kiểu dữ liệu và hoạt động của điểm cố định không nguyên, do đó tối ưu hóa cho loại dữ liệu này có xu hướng khá cụ thể về nền tảng. Ví dụ, hầu hết các DSP đều hỗ trợ kiểu dữ liệu phân đoạn điểm cố định trực tiếp trong phần cứng của chúng. Từ C, bạn truy cập thông qua các thư viện độc quyền.
Dave Tweed


Generic C đang có được sự hỗ trợ thông qua kiểu dữ liệu _Fract, nhưng hầu hết các cài đặt vi điều khiển đều có thư viện dành riêng cho nhà cung cấp. Tôi sử dụng libmathq15 cho tất cả các nhu cầu điểm cố định của mình. Đã làm công việc cho đến nay.
hơi tăng

_Fractlà một mảnh tào lao IMHO; Tôi ghét thực tế rằng nó đã được "tiêu chuẩn hóa" bởi ủy ban C. Nó buộc bạn phải sử dụng Q15 hoặc Q31 cho mọi thứ, điều này không có ý nghĩa trong nhiều tình huống và khiến bạn bị mắc kẹt mà không có sự giúp đỡ cho những tình huống đó.
Jason S

3

Bạn có phản đối việc sử dụng các thư viện Cortex điểm cố định cho việc này không?

q31_t arm_sin_q31 (q31_t x)
Xấp xỉ nhanh với hàm sin lượng giác cho dữ liệu Q31.

từ:

CMSIS-DSP: Bộ sưu tập thư viện DSP với hơn 60 Hàm cho các loại dữ liệu khác nhau: điểm cố định (phân đoạn q7, q15, q31) và điểm nổi chính xác đơn (32 bit). Thư viện có sẵn cho Cortex-M0, Cortex-M3 và Cortex-M4.

Nó sử dụng bảng tra cứu với phép nội suy bậc hai, nhưng nó khá nhanh. Bạn có thể điều chỉnh nó để nội suy tuyến tính cho tốc độ nhanh hơn nhưng nhiều lỗi hơn.

Cũng lưu ý rằng ngay cả Cortex M4 cũng không nhất thiết phải có FPU. Tôi đã thấy họ được gọi là "M4F" nếu họ làm như vậy.

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.