1.3 光谱仪构成与数据入库


1.3 光谱仪构成与数据入库

本节摘要:一台光谱仪分光源、样品接口、波长选择器、检测器、读出系统五段链路,每段都往数据里掺一种特定"杂质"。本节逐段标记缺陷来源,并给出一套落盘前的入库质检流程——饱和、死像素、信噪比三关。

前两节讲的是指纹的"法理",这一节讲指纹的"现场":数据在仪器内部走过的每一步,都会在档案上留下痕迹。第 2 章你将学到的一切去噪与基线算法,本质都是在偿还采集链路欠下的债——而分清债务是谁欠的,决定你该用哪个算法。这一节也直接承接导读的知识地图:它是整备车间(第 2 章)的"上游事故记录本"。

一、五段链路与各自的"杂质"

光源:氘灯、钨灯、激光器都有强度起伏。光源波动主要造成整体强度漂移——谱图整体抬高或压低,这是乘性干扰,归一化与散射校正(2.5 节)的靶子。

样品接口:透射池的划痕、ATR 晶体的接触压力、积分球的取样斑位置,决定散射与光程差异。固体近红外测量里,同一瓶粉末倒两次,谱形状都会变——这是 MSC 与 SNV 存在的理由。

波长选择器:光栅的机械重复性、干涉仪的动镜对准,决定波长准确度。环境温度变化半天,峰位能漂移零点几纳米;这直接影响谱库比对,第 6 章的互相关定漂移就是对付它的。

检测器:CCD、PMT、InGaAs 的电子学噪声是加性随机噪声的主要来源,表现为谱图上的毛刺——Savitzky-Golay 与小波去噪(2.1、2.2 节)的对象。

读出系统:模数转换的量化误差通常可忽略,但饱和死像素在这层产生:强峰把某些像元打满量程,输出削顶;坏像元输出恒定值或狂跳。

二、色散系统的采样几何

以一台 2048 像元 CCD 覆盖 400 至 700 纳米为例,先算清楚每个像元分到多少纳米——它决定了你的数据能承载多窄的谱峰:

# 像元色散与满量程检查 import numpy as np px = np.arange(2048) lam = 400 + (700 - 400) * px / 2047 # 每个像元对应的中心波长 print(f"nm/pixel={(700-400)/2047:.4f}") # 色散倒数:每像元纳米数 # 模拟一次读出:暗电流区与信号区各取 500 像元 rng = np.random.default_rng(7) dark = rng.normal(100, 3.0, 500) # 遮光时读到的本底 sig_region = rng.normal(5000, 3.0, 500) # 稳定光源下的平坦信号区 print(f"dark mean={dark.mean():.2f} std={dark.std():.2f}") print(f"signal mean={sig_region.mean():.1f} SNR~={sig_region.mean()/dark.std():.0f}") hot = (np.arange(2048) > 2000).sum() # 假设尾部 47 个像元过热 print("hot pixels at tail:", hot)

输出:

nm/pixel=0.1466 dark mean=99.62 std=2.81 signal mean=5000.0 SNR~=1779 hot pixels at tail: 47

三个数各有用途:每像元 0.147 纳米意味着半峰宽窄于 0.3 纳米的峰在这台配置下会被欠采样,峰位精度受限;暗噪声标准差 2.81 个计数,是后续一切信噪比估算的分母;信号均值 5000 对应约 1780 的单次信噪比——如果分析目标只需要 200 的信噪比,你大可以缩短积分时间换通量。信噪比预算应当在采集方案里花掉,而不是留到处理端去补救。

三、入库质检:三道闸门

档案落盘前过三道闸,写成一个可复用的检查函数:

# 入库质检:饱和、死像元、信噪比 def intake_qc(counts, full_scale=65535, snr_min=100): report = {} saturated = int(np.sum(counts >= full_scale * 0.999)) report["saturated_px"] = saturated dead = int(np.sum(np.std(counts, axis=0) == 0)) if counts.ndim > 1 else 0 report["dead_px"] = dead noise = np.std(counts[:50]) if counts.ndim == 1 else np.std(counts[:, :50]) signal = np.mean(counts) if counts.ndim == 1 else np.mean(counts) report["snr_est"] = float(signal / noise) report["verdict"] = "PASS" if (saturated == 0 and report["snr_est"] >= snr_min) else "REJECT" return report spec = np.where(np.arange(2048) == 500, 65535.0, 3000.0 + np.random.default_rng(1).normal(0, 20, 2048)) print(intake_qc(spec))

输出:

{'saturated_px': 1, 'dead_px': 0, 'snr_est': 147.6, 'verdict': 'REJECT'}

一个饱和像元就把整份档案判了退回——因为削顶的峰高无法复原,任何处理算法都只能编造它。信噪比 147.6 刚过 100 的门槛,但若分析目标是痕量定量,这个数还远远不够。质检标准由分析目标倒推,不是通用常数。

四、采集参数的取舍账

  • 积分时间加倍,信噪比约提升根号 2 倍(散粒噪声主导时),但样品漂移的风险随之增加——在线场景里宁可多平均几次短积分;
  • 平均 N 次扫描,信噪比提升根号 N 倍,这是最稳的预算手段,代价是时间;
  • 狭缝或光圈加大,通量上升、分辨率下降,定性任务与定量任务的最优解常常相反;
  • 暗电流与背景谱必须同步采集:扣暗、扣背景是在采集端完成的"第一层处理",比任何软件后处理都干净。

⚠️ 常见坑:把"平均 16 次"当成万能药。样品在 16 次扫描期间发生光解或相变时,平均得到的是一份"时间上失真"的档案——平均前先确认样品在这段时间里是稳定的。

本节要点回顾

  • 五段链路各欠一种债:光源波动是乘性漂移、接口差异是散射、分光部件是波长漂移、检测器是加性噪声、读出层是饱和与死像元;
  • 每像元色散决定可承载的最窄峰宽,配型前先算清楚;
  • 入库三闸:饱和零容忍、死像元要标记、信噪比按分析目标倒推;
  • 信噪比预算花在采集端:积分时间、扫描平均、狭缝宽度是三个可调旋钮。

第 2 章正式进整备车间。第一道工序就是给本节留下的加性噪声画像——分清"白噪声还是闪烁噪声",去噪方案的选择会完全不同。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U