6.16. Đường cong và tích phân

Các trang toán học đã đề cập đến các phép toán nhận mảng đầu vào và tạo ra mảng (hoặc vô hướng) đầu ra -- số học, phép rút gọn, phát (broadcasting). Trang này đề cập đến một lớp phép toán khác: các phép toán coi mảng là một hàm được lấy mẫu và đặt câu hỏi về bản thân hàm đó. Nội suy giữa các mẫu, khớp đường cong với chúng, tích phân dưới chúng, tích chập chúng với bộ đệm khác.

Tất cả các hàm này đều chấp nhận đầu vào ndarray và trả về một float vô hướng hoặc một ndarray kiểu float.

6.16.1. Nội suy

interp() thực hiện nội suy tuyến tính một chiều. xp là một mảng 1-D tăng đơn điệu của các giá trị độc lập; fp là các giá trị phụ thuộc tương ứng; x là điểm cần đánh giá hàm nội suy:

xp = np.array([0.0, 1.0, 2.0, 3.0])
fp = np.array([10.0, 20.0, 25.0, 30.0])
x  = np.array([0.5, 1.5, 2.5])

np.interp(x, xp, fp)
# array([15.0, 22.5, 27.5])

Ngoài phạm vi [xp[0], xp[-1]], kết quả được cắt theo fp[0]fp[-1] tương ứng; các từ khóa left=right= ghi đè các điểm biên đó.

Được dùng trên camera để ánh xạ lại bảng hiệu chỉnh sang các vị trí mẫu tùy ý -- bảng nhiệt độ-điện áp từ thermistor, đường cong đáp ứng điểm ảnh phi tuyến, tra cứu gamma theo từng kênh. Một lần gọi thư viện, một lần duyệt qua đầu vào, không có vòng lặp Python.

6.16.2. Khớp đa thức và đánh giá

polyfit() khớp một đa thức bậc deg với các điểm dữ liệu (x, y) bằng bình phương tối thiểu và trả về các hệ số (bậc cao nhất trước):

x = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([0.0, 1.1, 3.9, 9.1, 15.8])

coeffs = np.polyfit(x, y, 2)
# array([1.0, 0.0, 0.0])  (approximately)

Khi x bị bỏ qua, range(len(y)) được sử dụng -- hữu ích để khớp nhanh một đa thức với bộ đệm được lấy mẫu đều mà không có trục x liên kết:

np.polyfit(y, 2)

polyval() đánh giá đa thức có hệ số là p tại x. Đầu vào x có thể là một vô hướng (trả về float) hoặc một ndarray (trả về ndarray):

p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)

Cặp đôi tự nhiên là gọi polyfit một lần lúc hiệu chỉnh, lưu các hệ số, và gọi polyval để đánh giá đường cong kết quả mỗi khung hình. Bước đánh giá đa thức chỉ là một vài phép toán float trên mỗi mẫu, rất tiết kiệm ngay cả trên các camera nhỏ nhất.

6.16.3. Tích chập

convolve() trả về tích chập tuyến tính rời rạc đầy đủ của hai mảng 1-D. Chỉ chế độ full được triển khai; độ dài đầu ra là len(a) + len(v) - 1. Cắt lát kết quả để đạt hiệu ứng tương tự như các chế độ samevalidnumpy trên máy tính để bàn cung cấp:

a = np.array([1.0, 2.0, 3.0])
v = np.array([0.5, 0.5])

np.convolve(a, v)
# array([0.5, 1.5, 2.5, 1.5])

Hữu ích cho các bộ lọc FIR ngắn và nhân làm mịn (box, tam giác, gaussian) khi thiết lập chuỗi SOS là quá mức cần thiết. Thời gian chạy tỷ lệ với tích của hai độ dài mảng -- ổn với nhân ngắn nhưng nhanh chóng trở nên đắt hơn tích chập FFT với nhân dài.

6.16.4. Tích phân hình thang

trapz() tích phân một hàm được lấy mẫu bằng quy tắc hình thang ghép:

x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x)             # ~ 2.0

Truyền dx= khi khoảng cách mẫu đều và chỉ bước nhảy quan trọng; truyền x= khi các mẫu không được phân bố đều. Đây là lựa chọn đúng để tích phân dữ liệu cảm biến đã được thu thập, khi dạng giải tích không có sẵn.

Đối với dữ liệu mẫu đã được band-limited (ví dụ bộ đệm âm thanh sau bộ lọc chống aliasing), quy tắc hình thang hội tụ theo bình phương của số mẫu, có nghĩa là nhân đôi độ dài bộ đệm sẽ giảm sai số đi bốn lần.

Khi tích phân không phải là bộ đệm mẫu mà là một hàm Python mà ứng dụng có thể đánh giá tại các điểm tùy ý, thì một họ bộ giải khác mới là lựa chọn phù hợp.