资讯动态

MATLAB傅里叶变换:从迈克尔逊干涉图到黑体辐射光谱重建

发布时间:2026/9/14 14:33:44 来源:尧图企业网站定制
简介面向MATLAB课程设计与光学实验数据分析场景这份源码项目围绕黑体辐射光谱分析展开将通过迈克尔逊干涉仪得到的干涉图经傅里叶变换转换为光谱图完整呈现从干涉信号到频谱结果的流程。压缩包共6个文件包含2个fig图形文件供结果对照、2个csv数据文件用于输入验证、1个m脚本实现核心算法、1个md说明文档辅助理解整体约250KB目录精炼易读。作者已调试通过下载后无需修改即可运行适合课程设计、期末大作业或光学与信号处理方向初学者作为可直接使用的参考实现。目前已有185人学习下载可帮助读者快速建立傅里叶变换与光谱分析之间的关联并用于后续实验数据处理的二次开发。1. 黑体辐射光谱分析中迈克尔逊干涉图到光谱图的傅里叶变换到底做什么黑体辐射光谱测量并不像用手机拍一段光谱图那么直接。迈克尔逊干涉仪输出的是一串光强随光程差变化的干涉图动镜每移动一点探测器记录一个余弦叠加值要得到波数-强度光谱唯一靠谱的数学操作是对干涉图做傅里叶变换。MATLAB的fft函数看起来一行就能完成但干涉图中心是否对齐、采样光程差够不够长、切趾函数怎么选、相位误差如何校正都直接决定最终光谱是光滑接近理论曲线还是布满伪峰。下面从黑体辐射物理模型出发逐步给出在MATLAB里将迈克尔逊干涉图转换为黑体辐射光谱图的完整做法适合刚接触傅里叶变换红外光谱的数据处理人员也适合用光谱模拟验证算法的科研人员。真正动手时你会发现大部分时间不是在写傅里叶变换而是在处理那些让fft结果走样的工程细节。2. 从干涉图到光谱图迈克尔逊干涉仪的物理模型与黑体辐射模拟2.1 干涉图的物理来源光程差与光谱的余弦变换对迈克尔逊干涉仪中分束器将一束光分成两束分别经定镜和动镜反射后重新合束。动镜移动造成两臂光程差δ探测器上的干涉强度可以写成I(δ) ∫ B(ν) cos(2πνδ) dν这里ν是波数单位通常取cm⁻¹B(ν)是入射光的波数谱。这个式子说明干涉图I(δ)和光谱B(ν)之间不是直接对应关系而是余弦傅里叶变换对。黑体辐射属于连续宽谱所以它的干涉图表现为一个中心主峰大、两边快速衰减的振荡曲线零光程差处所有波数的余弦项同相叠加强度最大离开中心后不同波数余弦相互抵消信号迅速变小。实验上需要通过离散采样记录I(δ)。采样间隔dδ决定能还原的最大波数范围对应关系类似奈奎斯特采样定律ν_max ≈ 1/(2dδ)。最大光程差Lmax决定波数分辨率Δν 1/(2Lmax)。两个公式会在后续代码里反复使用也是“为什么干涉图长度影响光谱精细程度”的根本来源。2.2 用MATLAB生成黑体辐射光谱和模拟干涉图先造一份理想黑体光谱作为验证对象。黑体辐射在波数域的普朗克公式需要把波数从cm⁻¹转成国际单位制中的m⁻¹。下面的代码生成温度为1500 K、波数范围2004000 cm⁻¹的归一化光谱T 1500; nu linspace(200, 4000, 2048); % 波数cm^-1 h 6.62607015e-34; % 普朗克常量J s c 2.99792458e8; % 光速m/s kB 1.380649e-23; % 玻尔兹曼常量J/K nu_si nu * 100; % 转成 m^-1 Bnu 2*h*c^2*nu_si.^3 ./ (exp(h*c*nu_si/(kB*T)) - 1); Bnu Bnu / max(Bnu); % 归一化便于显示逻辑说明普朗克公式的变量必须统一到SI单位因此将波数乘以100把cm⁻¹变成m⁻¹。./和exp都是逐元素运算所以得到的Bnu是一个与nu同形状的列向量。归一化只影响幅度不改变谱峰位置适合算法验证。下一步用这个Bnu生成对应的干涉图。根据余弦变换关系对光程差向量delta上的每个点计算积分近似Lmax 0.2; % 最大光程差cm M 2048; delta linspace(-Lmax, Lmax, M); I zeros(M, 1); dnu nu(2) - nu(1); for k 1:M I(k) sum(Bnu .* cos(2*pi*nu*delta(k))) * dnu; end I I 1.2; % 直流偏置 I I 0.02*randn(M,1); % 模拟探测器噪声代码含义循环内对波数积分得到单个光程差点上的干涉强度。dnu是波数采样间隔用于离散积分近似。后面加上的1.2是直流偏置实际干涉图总是叠加大量的平均功率randn模拟加性高斯噪声便于后面对比去直流和降噪效果。2.3 采样参数表光程差间隔、最大光程差与波数分辨率模拟时用linspace自动生成了delta但实际采集时最关键的是三个参数参数与光谱的关系选择原则最大光程差Lmax光谱分辨率Δν 1/(2Lmax)要求分辨率4 cm⁻¹时Lmax至少0.125 cm采样间隔dδ最大可测波数ν_max ≈ 1/(2dδ)黑体辐射实验通常要覆盖到4000 cm⁻¹对应dδ约0.000125 cm采样点数M决定离散频谱采样点数量一般取2的幂以加速fft但并不是点数越多分辨率越高这里最容易出现的认知偏差是“增加采样点数就能提高分辨率”。实际分辨率只由最大光程差Lmax决定采样点数M只改变频谱上相邻点的间隔。M增加相当于对频谱做插值让峰值位置更平滑但无法区分间隔小于1/(2Lmax)的两个谱线。3. MATLAB傅里叶变换重建光谱的完整流程与参数控制3.1 干涉图预处理去直流和双边干涉图中心化实测干涉图首先是包含直流分量的因为探测器输出总是叠加一个随时间缓变的背景强度。直接对整段数据fft直流分量会出现在波数零位置并可能通过频谱泄漏污染低频区域。常见做法是取干涉图两端的平均值作为直流近似然后减去I I(:); dc mean([I(1:30); I(end-29:end)]); % 取两端平均近似直流 I I - dc;干涉图也必须是双边数据即零光程差点位于向量中心而不是起始位置。如果零光程差不在第一个采样点快速傅里叶变换会引入线性相位导致光谱实部出现严重失真。使用ifftshift(I)把中心值移到数组首位I0 ifftshift(I);注意区分fftshift和ifftshift。当长度M为偶数时两者效果一样当M为奇数时ifftshift将零频率正确移到第一个元素。干涉图数据长度通常是偶数但养成用ifftshift的习惯更稳妥。3.2 用fft构建波数轴并还原光谱完成中心化后傅里叶变换和波数轴映射可以封装成一个函数。下面的代码同时处理delta是均匀光程差向量的情况function [S, nu_axis] interferogram2spectrum(delta, I, apodName) % delta: 光程差向量单位 cm % I: 干涉图强度 % apodName: none / hann / blackman arguments delta double I double apodName string none end I I(:) - mean([I(1:30); I(end-29:end)]); M length(I); I0 ifftshift(I); if apodName ~ none switch apodName case hann w hann(M); case blackman w blackman(M); end I0 I0 .* ifftshift(w); % 切趾窗中心也要对齐到零光程差 end S_raw fft(I0) / M; % 归一化FFT half floor(M/2) 1; S 2 * real(S_raw(1:half)); % 双边干涉图取正频并乘2 d_delta mean(diff(delta)); % 光程差采样间隔cm nu_axis (0:half-1) / (M * d_delta); % 波数轴cm^-1 end参数说明apodName控制切趾窗默认不做S_raw是复数谱取实部是因为理想干涉图是偶函数频谱实部就是光谱强度乘2是因为正负波数各占一半能量只保留正频时需要恢复。nu_axis的计算需要考虑单位光程差用cm采样间隔用cm那么nu_axis的单位就是cm⁻¹。调用示例[S, nu_axis] interferogram2spectrum(delta, I, hann); plot(nu_axis, S); xlim([500 4000]);如果使用较旧版本MATLABarguments语法可能报错可以删掉函数定义头部的块改成用varargin判断。3.3 切趾函数选择及其频谱泄漏影响干涉图不可能无限长在最大光程差位置被突然截断等效于乘以一个矩形窗。矩形窗的傅里叶变换旁瓣很高会造成光谱上的伪振荡。对连续黑体辐射谱来说这种伪峰会严重干扰谱形判断。常用切趾函数有三类窗函数主瓣半宽约第一旁瓣抑制适用场景矩形窗1.21 Δν-13 dB分辨率优先允许旁瓣Hann窗2.0 Δν-43 dB黑体辐射平滑谱分辨率损失可接受Blackman窗3.0 Δν-58 dB弱信号、强旁瓣干扰场景在函数中切换窗函数只需改一行[S_hann, nu_axis] interferogram2spectrum(delta, I, hann); [S_black, nu_axis] interferogram2spectrum(delta, I, blackman);对比两段重建光谱可以发现Hann窗几乎消除旁瓣但峰值宽度比矩形窗大Blackman窗更保守适合后面要做辐射定标、不需要极高分辨率的黑体光谱测量。这里要注意切趾等效于在波数域做卷积会让尖锐的吸收峰展宽。如果实验目的是分辨相邻谱线应尽量使用矩形窗或轻切趾。3.4 相位校正黑体干涉图无法避免的非对称干扰实际干涉图往往由于分束器色散、电路相频响应或采样中心偏移使正负光程差两侧不完全对称。直接取实部会得到混合了色散型峰的扭曲光谱。Mertz相位校正是最常见的解决办法从干涉图中心截取一段较短的对称双边数据只利用低频稳定的相位信息来校正全谱。Lshort min(256, M); ph angle(fft(I0(1:Lshort), M)); % 短双边区相位补零到M S_corr S_raw .* exp(-1i*ph); % 相位旋转 S 2 * real(S_corr(1:half));这里的I0(1:Lshort)取的是零光程差附近的数据因为中心区信噪比高相位估计比远离中心的尾部更可靠。exp(-1i*ph)将每条频谱线旋转回实轴。使用angle(fft(...))时短区长度Lshort决定了相位谱的平滑程度Lshort太短相位对低频成分估计不足太长则混入高次相位误差。一般取总数据点数的1/16到1/4之间。4. 实测迈克尔逊干涉仪数据的工程化转换技巧4.1 波数标定用激光基准确定光程差采样间隔实验室使用的迈克尔逊干涉仪通常配有HeNe参考激光。激光与样品光共享同一光路因此可以用激光条纹精确确定每个数据点对应的光程差增量。典型做法是让采集系统在激光干涉信号的过零点触发采样这样每个采样点的光程差增量是确定的lambda_HeNe_cm 632.8e-7; % 632.8 nm 6.328e-5 cm d_delta lambda_HeNe_cm / 2; % 每个采样间隔对应的光程差变化cm632.8 nm的HeNe激光在迈克尔逊干涉仪中移动半波长产生一个完整干涉条纹所以按λ/2作为采样间隔。如果没有激光同步触发也可以用电机移动距离和总采样点数的比值来估计d_delta但精度远低于激光法。得到d_delta后波数轴直接按(0:half-1)/(M*d_delta)生成不需要再依赖均值差。如果仪器没有提供绝对光程差长度也可以用已知谱线位置反向标定。比如用大气中的水汽吸收峰1601.18 cm⁻¹或聚苯乙烯薄膜标准峰拟合出缩放系数。这种标定比直接信任电机步长更可靠。4.2 大气吸收与光谱辐射定标校正开放式光路里红外光谱总会被空气中的水和二氧化碳吸收。黑体光谱测量通常先采集一个背景干涉图再采集样品干涉图两者傅里叶变换后相除得到透射光谱。但黑体辐射定标的目的是得到绝对辐射量不能只做比值。常见做法是分别测量高温黑体和环境温度背景S_hot interferogram2spectrum(delta_hot, I_hot, hann); S_cold interferogram2spectrum(delta_cold, I_cold, hann); % 理论黑体辐射使用相同波数轴 B_hot planckSpectrum(nu_axis, 1200); B_cold planckSpectrum(nu_axis, 300); R (S_hot - S_cold) ./ (B_hot - B_cold); % 仪器响应函数 S_sample (S_meas - S_cold) ./ R; % 校正后的样品光谱响应函数R里包含了分束器效率、探测器响应和光路透过率。做背景差可以扣除室温背景辐射和环境吸收。这里的R可能在低信号区产生噪声放大通常对R做多项式平滑或者限制在辐射较强、响应稳定的波数区间内使用。4.3 多扫描累加与噪声抑制单次干涉图信噪比有限工程上采用多次扫描后累加平均。干涉图累加在时域进行平均后再做傅里叶变换比先变换多个光谱再平均更稳妥因为时域平均不放大相位噪声I_sum zeros(size(I)); for k 1:N_scan I_sum I_sum measuredInterferogram(k); end I_avg I_sum / N_scan;另一种低噪声策略是分段处理将干涉图分成若干子区间做傅里叶变换然后用这些子光谱的中位数叠加代替简单平均。这种中位数合可以对发射线尖峰、宇宙射线或偶发电磁干扰造成的强脉冲免疫适合长时间监测实验。5. 验证傅里叶变换光谱还原精度的模拟回测技巧5.1 构造已知光谱的干涉图进行闭环验证把重建算法和实测数据放在一起调试很难判断误差来自仪器还是算法。更可靠的办法是先构造一组已知谱线用它生成干涉图再走一遍完整傅里叶变换流程对比输入输出。下面用两个高斯峰模拟黑体辐射谱的局部特征nu_true [1800, 3000]; amp [1.0, 0.6]; width 8; S_true zeros(size(nu_axis)); for k 1:length(nu_true) S_true S_true amp(k) * exp(-((nu_axis - nu_true(k)).^2)/(2*width^2)); end % 生成干涉图 M length(delta); I_sim zeros(M, 1); dnu_axis nu_axis(2) - nu_axis(1); for m 1:M I_sim(m) sum(S_true .* cos(2*pi*nu_axis*delta(m))) * dnu_axis; end % 使用自己的重建函数还原 [S_rec, nu_axis] interferogram2spectrum(delta, I_sim, none);输入的光谱范围是确定的通过比较S_rec与S_true可以快速检查波数轴是否正确、切趾导致展宽有多大、旁瓣落在哪些位置。5.2 判断还原误差的关键指标与参数调整方向常用的量化指标有三个谱峰位置偏差、峰值强度误差和均方根误差。谱峰位置偏差应远小于分辨率Δν峰值强度误差反映切趾是否引入过度衰减均方根误差则将整个波数带内的偏差汇总residual S_rec - S_true; rms_err sqrt(mean(residual.^2)); [~, idx_true] max(S_true); [~, idx_rec] max(S_rec); position_err nu_axis(idx_rec) - nu_axis(idx_true);模拟回测最大的价值是验证算法边界固定Lmax不变把两个高斯峰间距从20 cm⁻¹收紧到2 cm⁻¹观察重建谱是否还能分开。如果不能分开增加采样点数也不会有效而应增加最大光程差。相反如果高频波数区域出现混乱覆盖则应减小采样间隔并同步提高采样点数防止混叠。每次调整后重跑一次闭环验证比直接信任fft结果更能定位误差来源。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价