基于模板的相位解包裹算法:MEMS/NEMS表面3D轮廓精密测量

0 下载量 131 浏览量 更新于2024-08-31 收藏 274KB PDF 举报
在MEMS/NEMS(微/纳米机电系统)的结构特性参数测量和可靠性测试中,对表面的三维轮廓、粗糙度、微小位移和变形等精细物理量的精确测量至关重要。显微干涉法因其高精度、高垂直分辨率、非破坏性以及操作简便等特点,已经成为此类测量的常用方法[3-5]。 在干涉测量过程中,相位移显微干涉法是核心手段。首先,通过驱动电路驱动参考镜产生微小的光程变化,通过CCD摄像机和图像采集卡记录下一系列相关干涉图像。这些图像包含了被测表面的相位信息,但实际测量中,由于表面高度的相位变化可能超过一个波长周期,导致相位值被截断为多个2π范围内的区域,形成包裹相位。 为了获取真实的表面高度信息,需要进行相位解包裹或相位展开。这涉及到将多段截断的相位区域重新组合成连续的相位序列。一种常见方法是利用反正切函数的主值差来求和,根据相邻像素点的相位差是否小于2π的条件,通过公式(2)进行逐点展开: \[ \phi(m) = \phi(0) + \sum_{n=1}^{N} W_2\{\Delta W_1[\phi(n)]\} \] 对于微/纳米级别的连续结构表面,这种条件通常得以满足,使得基于模板的相位解包裹算法可以有效应用。模板在此过程中扮演了关键角色,它可以是预先定义的模型或者与待测表面形状匹配的参考结构,用于辅助相位解包过程。 相位解包裹算法的发展不仅限于基本的求和运算,还涉及更复杂的数学模型和算法优化,如利用局部模板匹配、迭代方法或者机器学习技术来提高解包精度和效率[7-8]。这些创新方法有助于在处理复杂表面细节和噪声抑制方面取得更好的结果,从而确保MEMS/NEMS表面测量的准确性和可靠性。 基于模板的相位解包裹算法在MEMS/NEMS表面3-D轮廓测量中发挥着重要作用,通过结合现代干涉测量技术和算法优化,实现了对微小结构特征的精细测量,对于保障设备性能和质量控制具有重要意义。

VibrationData VibrationSensorModule::retrieveVibrationData() const { int samplesCount = 0; float recordStepSize = 0; int decimationFactor = readRecInfoDecimationFactor(); std::function<float(int16_t)> convertVibrationValue; switch (currentRecordingMode) { case RecordingMode::MTC://Time domain capture samplesCount = 4096; recordStepSize = 1.f / (220000.f / static_cast<float>(decimationFactor)); convertVibrationValue = { [](int16_t valueRaw) { return static_cast<float>(valueRaw) * 0.001907349; } }; break; case RecordingMode::MFFT://Spectral analysis through internal FFT case RecordingMode::AFFT: const uint8_t numberOfFFTAvg = readRecInfoFFTAveragesCount(); samplesCount = 2048; recordStepSize = 110000.f / static_cast<float>(decimationFactor) / static_cast<float>(samplesCount); convertVibrationValue = { [numberOfFFTAvg](int16_t valueRaw) { // handle special case according to https://ez.analog.com/mems/f/q-a/162759/adcmxl3021-fft-conversion/372600#372600 if(valueRaw == 0) { return 0.0; } return std::pow(2, static_cast<float>(valueRaw) / 2048) / numberOfFFTAvg * 0.9535;//数据处理公式,作用? } }; break; } write(spi_commands::BUF_PNTR, 0); VibrationData vibrationData; vibrationData.recordingMode = currentRecordingMode; vibrationData.stepAxis = generateSteps(recordStepSize, samplesCount); vibrationData.xAxis = readSamplesBuffer(spi_commands::X_BUF, samplesCount, convertVibrationValue); vibrationData.yAxis = readSamplesBuffer(spi_commands::Y_BUF, samplesCount, convertVibrationValue); vibrationData.zAxis = readSamplesBuffer(spi_commands::Z_BUF, samplesCount, convertVibrationValue); return vibrationData; }//dsp//return vibrationData 请问这段代码是什么意思

2023-02-22 上传