自动去毛刺
用中值滤波检测单点尖峰并线性插值,适合晶体衍射毛刺。
pythonclean
python xanes_deglitch.py scan.dat --sigma 6 --out clean.dat
xanes_deglitch.py
#!/usr/bin/env python3
import argparse
import numpy as np
from numpy.lib.stride_tricks import sliding_window_view
def median_filter(y, k=7):
pad = k // 2
yp = np.pad(y, pad, mode="edge")
w = sliding_window_view(yp, k)
return np.median(w, axis=1)
def main():
ap = argparse.ArgumentParser()
ap.add_argument("src")
ap.add_argument("--sigma", type=float, default=6)
ap.add_argument("--out", default="clean.dat")
args = ap.parse_args()
e, mu = np.loadtxt(args.src, unpack=True, usecols=(0, 1))
med = median_filter(mu)
resid = mu - med
thr = args.sigma * np.median(np.abs(resid)) / 0.6745
bad = np.abs(resid) > thr
clean = mu.copy()
if bad.any():
good = ~bad
clean[bad] = np.interp(e[bad], e[good], mu[good])
np.savetxt(args.out, np.column_stack([e, clean]),
header="energy_eV mu_deglitched")
print(f"replaced {bad.sum()} glitch points -> {args.out}")
if __name__ == "__main__":
main()