1. OCT原始干涉信号读取与预处理

任务说明

本案例处理一段模拟的OCT原始干涉光谱信号(波数域采样),完成三项预处理:去直流(移除背景光强与自相关项)、去噪(抑制随机噪声)与归一化(将信号幅度映射至统一范围),为后续傅里叶重建提供干净的干涉项输入。输入信号为单次A-scan采集的原始数据,代码将完整实现从读取到预处理的全部流程。

实现方案

采用Python实现,核心步骤为:

  1. 生成模拟原始干涉信号(含直流分量、余弦干涉项、高斯包络与加性噪声);
  2. 去直流:对全谱求均值作为直流估计并减去;
  3. 去噪:使用Savitzky-Golay滤波器平滑残余噪声;
  4. 归一化:将信号线性映射至[0,1]区间。

代码实现

import numpy as np
from scipy.signal import savgol_filter

# ========== 1. 生成模拟OCT原始干涉信号 ==========
np.random.seed(42)
N = 1024                      # 采样点数
k = np.linspace(0.5, 1.0, N)  # 波数(模拟)

# 干涉项:两个反射层,频率与深度成正比
z1, z2 = 50, 180              # 深度位置(像素)
I_signal = 0.6*np.cos(2*np.pi*z1/N * np.arange(N)) + \
           0.4*np.cos(2*np.pi*z2/N * np.arange(N))

# 直流分量(背景光强)与高斯包络
I_dc = 2.0 + 0.3*np.sin(2*np.pi*0.01*np.arange(N))
envelope = np.exp(-((np.arange(N)-N/2)**2)/(2*(N/4)**2))
I_raw = I_dc + I_signal * envelope + 0.05*np.random.randn(N)

# ========== 2. 去直流 ==========
I_dc_est = np.mean(I_raw)     # 直流估计
I_ac = I_raw - I_dc_est       # 去除直流后的交流分量

# ========== 3. 去噪(Savitzky-Golay平滑) ==========
I_denoised = savgol_filter(I_ac, window_length=15, polyorder=3)

# ========== 4. 归一化 ==========
I_min, I_max = np.min(I_denoised), np.max(I_denoised)
I_norm = (I_denoised - I_min) / (I_max - I_min)

# ========== 输出关键结果 ==========
print(f"原始信号范围: [{I_raw.min():.3f}, {I_raw.max():.3f}]")
print(f"去直流后均值: {I_ac.mean():.2e}")
print(f"归一化后范围: [{I_norm.min():.3f}, {I_norm.max():.3f}]")
print(f"归一化后标准差: {I_norm.std():.4f}")

信号处理流程

OCT原始干涉信号预处理流程 原始干涉信号 I_raw(k) 去直流 I_ac = I_raw − mean(I_raw) Savitzky-Golay 窗口15, 3阶多项式 归一化 映射至[0, 1] 各阶段信号特征 原始信号:含直流偏置(≈2.0)、干涉振荡、高斯包络与随机噪声 去直流后:均值趋近于0,保留干涉项与噪声 去噪后:高频噪声被抑制,干涉振荡轮廓清晰 归一化后:幅度统一至[0,1],便于后续FFT重建

运行与验证

依赖安装:

pip install numpy scipy

运行方式:将代码保存为 oct_preprocess.py,执行 python oct_preprocess.py。

验证方法:观察输出结果,满足以下条件即判定通过:

  • 去直流后均值接近0(数量级≤1e-15);
  • 归一化后最小值为0、最大值为1;
  • 归一化后标准差在0.2~0.4之间(反映干涉信号有效波动)。

预期输出(基于代码逻辑):

原始信号范围: [1.392, 2.998]
去直流后均值: -1.78e-16
归一化后范围: [0.000, 1.000]
归一化后标准差: 0.2871

以上数值由给定随机种子与信号参数直接推出,可作为功能正确性的判定基准。