拉曼強度不看你有多少「量」,看散射截面。一個強散射(尤其共振增強)的成分會佔走絕大部分訊號,把弱散射的次成分蓋掉——這是混合物判讀最常見的陷阱。用三種食用藍色料當教材把它講清楚,並示範怎麼把被蓋掉的成分找回來。
這次把靛藍(Indigo carmine / E132)加進來當第三個參考。它與 CuPc、FCF 的峰位不同,強峰在 ~1580 cm⁻¹。注意右上角標的散射強度 k:CuPc 設為強散射者(k=8),靛藍與 FCF 為弱散射者。
混合光譜是各純光譜依「濃度 × 散射強度」加權疊加。f 是次成分的質量分率;決定它在圖上多明顯的,是 f·k_minor 相對於 (1−f)·k_major。當 k_major ≫ k_minor,次成分要占很高的質量才看得見。
從純靛藍往下,逐步混入 CuPc。靛藍的診斷峰(綠色帶:1250、1580 cm⁻¹)隨含量下降很快就消失在 CuPc 的指紋裡——即使它在 30% 質量時仍存在,肉眼已幾乎看不到。
如果知道主成分是什麼,就能把它扣掉:用最小平方縮放主成分參考、相減,殘差裡次成分的峰會重新現身。這是「已知參考」的解混;若參考未知,則用盲解混(NMF / MCR-ALS)。
最小平方縮放主成分參考後相減,殘差顯露次成分。最簡單、最直覺,前提是知道主成分。
用參考庫解非負最小平方,估各成分的訊號貢獻。scipy.optimize.nnls。得到的是訊號分率,要換質量需散射強度校正。
只有一批混合光譜、不知純成分時,用非負矩陣分解同時解出「純光譜」與「濃度」。
放大被主峰肩部藏住的弱峰、壓低寬背景。Savitzky–Golay 微分即可。
共振增強看雷射波長:換激發波長或用 SERS,可以改變誰被增強,讓原本被蓋住的成分跳出來。
有一系列已知比例的混合(見 mixture library),可建 PLS 模型直接由光譜預測含量——接你既有的 PLS 教學。
# 差譜:扣除縮放後的主成分 scale = mix @ cupc / (cupc @ cupc) residual = mix - scale * cupc # 殘差裡看次成分 # NNLS 解混(已知參考庫) from scipy.optimize import nnls R = np.column_stack([cupc, indigo]) # 參考當欄 abund, _ = nnls(R, mix) # 非負訊號貢獻 sig_frac = abund[1] / abund.sum() # 訊號分率(≠質量) # 盲解混(參考未知) from sklearn.decomposition import NMF W = NMF(n_components=2, init='nndsvda').fit(X) # X = 一批混合光譜 # 定量:PLS 由光譜預測含量 from sklearn.cross_decomposition import PLSRegression PLSRegression(5).fit(X, indigo_mass_fraction)
# 差譜 scale <- sum(mix * cupc) / sum(cupc^2) residual <- mix - scale * cupc # NNLS 解混 library(nnls) R <- cbind(cupc, indigo) fit <- nnls(R, mix); abund <- fit$x sig_frac <- abund[2] / sum(abund) # 盲解混:MCR-ALS library(ALS) # 或 mdatools::mcrals # 定量:PLS library(pls) plsr(indigo_frac ~ spectra, ncomp = 5, data = df)
解混與定量(Spectroscopy 外掛):
1. File 載入 raman_mixture_library.csv,把 indigo_mass_fraction 設為 target(數值 → 迴歸)。
2. Preprocess Spectra:Baseline → Normalize →(可加)Savitzky–Golay(1st/2nd derivative) 凸顯弱峰。
3. 定量:接 PLS 或 Linear Regression → Test and Score(交叉驗證),由光譜預測靛藍含量。
4. 探索式盲解混:PCA 看幾個成分、載入向量像不像純光譜;Orange 內建無 MCR,盲解混建議回到 Python/R。
5. Data Table / Predictions 對未知混合輸出估計含量。