Làm thế nào để thực hiện một Rubberband-Correction trên dữ liệu phổ?


8

Tôi cơ bản hiểu cách hoạt động của Rubberband / Baseline-Baseline.

  1. Phổ đã cho được chia thành (N) phạm vi.
  2. Các điểm thấp nhất trong mọi phạm vi được xác định.
  3. Đường cơ sở ban đầu được xây dựng từ những điểm đó.
  4. Bây giờ tất cả các điểm trên phổ được rút xuống bởi sự khác biệt giữa điểm thấp nhất trong phạm vi hiện tại và điểm thấp nhất trên đường cơ sở.

Tuy nhiên, có một số sắc thái mà tôi không biết cách xử lý. Ví dụ: nếu một trong các điểm chính xác nằm trên đường viền giữa hai phạm vi, v.v.

Thêm vào đó, tôi phải chứng minh được rằng thuật toán mà tôi đang viết là một thuật toán vững chắc và có thể được tham khảo bởi các công trình hoặc bài báo khoa học khác.

Nếu bất cứ ai có thể cho tôi một số tài liệu tham khảo tôi sẽ rất hài lòng.


Hoặc có thể ai đó biết một cách tốt hơn hoặc tương tự để phát hiện && sửa đường cơ sở.
チ ー ズ

Câu trả lời:


6

Điều này có thể dễ dàng thực hiện trong Rhoặc Python. Có sẵn các chức năng được kiểm tra tốt, vì vậy bạn không phải lo lắng về bất kỳ ranh giới hoặc sắc thái nào. Hơn nữa, cả hai đều miễn phí và phổ biến trong các nhà khoa học.

Giải pháp cho R

Có một gói đặc biệt để xử lý dữ liệu phổ, được gọi là hyperSpec . Việc hiệu chỉnh đường cơ sở của dây cao su đã được thực hiện ở đó (chức năng spc.rubberband). Tất cả các chi tiết được làm nổi bật trong tài liệu. Cách sử dụng khá đơn giản:

require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)

corrected <- spc - baseline

nhập mô tả hình ảnh ở đây

Giải pháp cho Python

Không có giải pháp bên ngoài nào (theo sự hiểu biết tốt nhất của tôi) cho python, nhưng bạn có thể sử dụng scipy.spatial.ConvexHullchức năng để tìm các chỉ số của tất cả các điểm tạo thành một thân lồi xung quanh quang phổ của bạn. Giả sử rằng phổ được chứa trong xymảng:

import numpy as np
from scipy.spatial import ConvexHull

def rubberband(x, y):
    # Find the convex hull
    v = ConvexHull(np.array(zip(x, y))).vertices

Mảng vchứa các chỉ số của các điểm đỉnh, được sắp xếp theo hướng CCW, vd [892, 125, 93, 0, 4, 89, 701, 1023]. Chúng ta phải trích xuất một phần vtăng dần, ví dụ 0 0101023.

    # Rotate convex hull vertices until they start from the lowest one
    v = np.roll(v, -v.argmin())
    # Leave only the ascending part
    v = v[:v.argmax()]

    # Create baseline using linear interpolation between vertices
    return np.interp(x, x[v], y[v])

Bây giờ đường cơ sở đã được sửa như thế này:

y = y - rubberband(x, y)

Câu trả lời hay, và song ngữ, quá! :-)
Peter K.

1

Có thể có nhiều kỹ thuật. Ý tưởng của bạn có vẻ tốt với tôi

Hai ý tưởng khác:

  1. Thực hiện FFT dữ liệu của bạn và lọc ra các tần số thấp nhất. Điều này cũng loại bỏ các điều chế cơ bản. Chắc chắn bạn phải tìm đúng chiều rộng bộ lọc bằng tay hoặc từ một phỏng đoán có giáo dục từ dữ liệu.

  2. Sử dụng các hàm Cosine với nhiều bước sóng dài và thực hiện khớp tuyến tính với dữ liệu của bạn. Bạn cũng có thể loại bỏ các đỉnh thông qua một bộ lọc đơn giản hoặc bằng cách cân các điểm dữ liệu với cường độ tín hiệu của chúng.


1

Giải pháp trong python sử dụng thuật toán Modpoly và Imodpoly.

Thư viện Python để sửa / xóa đường cơ sở. Nó có thuật toán Modpoly và IModploy có thể trả về kết quả đã sửa cơ bản khi bạn nhập các giá trị ban đầu dưới dạng danh sách python hoặc chuỗi gấu trúc và chỉ định mức độ đa thức. Cài đặt thư viện như pip install BaselineRemoval. Dưới đây là một ví dụ

from BaselineRemoval import BaselineRemoval    
input_array=[10,20,1.5,5,2,9,99,25,47]
polynomial_degree=2

baseObj=BaselineRemoval(input_array,polynomial_degree)
Modpoly_output=baseObj.ModPoly()
Imodpoly_output=baseObj.IModPoly()

print('Original input:',input_array)
print('Modpoly base corrected values:',Modpoly_output)
print('IModPoly base corrected values:',Imodpoly_output)

Original input: [10, 20, 1.5, 5, 2, 9, 99, 25, 47]
Modpoly output: [-1.98455800e-04  1.61793368e+01  1.08455179e+00  5.21544654e+00
  7.20210508e-02  2.15427531e+00  8.44622093e+01 -4.17691125e-03
  8.75511661e+00]
Imodpoly output: [-0.84912125 15.13786196 -0.11351367  3.89675187 -1.33134142  0.70220645
 82.99739548 -1.44577432  7.37269705]

0

[EDIT 2018/03/24] Kể từ khi có câu trả lời, một số cách sử dụng trên dữ liệu phổ đã được ghi lại

Nếu các đỉnh phổ của bạn tương đối tốt và gần như dương trên đường cơ sở với hành vi tần số thấp hơn, tôi khuyên bạn nên thử BEADS (Ước tính cơ sở và khử nhiễu w / Sparsity) , một thuật toán dựa trên độ thưa thớt của dữ liệu và soome của các dẫn xuất của nó. Nó hoạt động tốt với dữ liệu sắc ký. Mã Matlab có sẵntrang BEADS tập hợp mã R hoặc C ++ và các cách sử dụng đã biết . Ở đây bạn có thể tìm thấy các cách sử dụng cho phổ Raman, phổ thiên hà siêu âm, phổ hấp thụ tia X (XAS), nhiễu xạ tia X (XRD) và các phép đo XAS / XRD kết hợp.

Sắc ký với đường cơ sở mô phỏng

Đường cơ sở và tiếng ồn đã được sửa

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.