傅立叶光学的Matlab实现方法

一、核心原理与工具

傅立叶光学基于傅里叶变换理论,将光波的传播与频域分析结合。Matlab通过以下函数实现关键计算:

  • fft2:二维傅里叶变换,将空间域光场转换为频域频谱。
  • ifft2:逆傅里叶变换,恢复空间域信号。
  • meshgrid:生成空间坐标网格,用于光场建模。
  • imagesc:可视化光强分布或频谱。

二、典型实现流程
1. 光场建模

示例:生成高斯光束

matlab 复制代码
lambda = 632.8e-9; % 波长(米)
w0 = 0.01;         % 束腰半径(米)
k = 2*pi/lambda;   % 波数

[x, y] = meshgrid(linspace(-0.05, 0.05, 500));
r = sqrt(x.^2 + y.^2);
E = exp(-r.^2 / w0^2) .* exp(1i*k*r.^2/(2*w0)); % 高斯光束表达式
2. 傅里叶变换与频谱分析

透镜的傅立叶变换模拟(4f系统)

matlab 复制代码
% 前焦面(输入平面)
E_input = E; % 输入光场

% 傅里叶变换(透镜后焦面)
E_fft = fftshift(fft2(fftshift(E_input))); % 频谱

% 逆傅里叶变换(后焦面重建)
E_output = fftshift(ifft2(fftshift(E_fft)));
3. 光学元件模拟

低通滤波器设计

matlab 复制代码
% 频谱滤波
D0 = 0.02; % 截止频率
[X, Y] = meshgrid(linspace(-0.5, 0.5, size(E_fft,1)), ...
                  linspace(-0.5, 0.5, size(E_fft,2)));
D = sqrt(X.^2 + Y.^2);
H = double(D <= D0); % 低通滤波器掩膜

% 应用滤波
E_filtered = E_fft .* H;
4. 动态传播模拟

角谱法模拟光束传播

matlab 复制代码
z = 0.1; % 传播距离(米)
dx = x(2)-x(1); % 采样间隔

% 角谱计算
fx = (-size(x,2)/2:size(x,2)/2-1)/dx;
fy = (-size(y,2)/2:size(y,2)/2-1)/dx;
[FX, FY] = meshgrid(fx, fy);
H = exp(1i*k*z*sqrt(1 - (lambda*FX).^2 - (lambda*FY).^2)); % 传播因子

% 传播后光场
E_propagated = ifftshift(ifft2(fftshift(E_input) .* H));

三、关键应用案例
1. 衍射与干涉仿真

杨氏双缝干涉

matlab 复制代码
d = 0.002; % 双缝间距(米)
D = 0.1;   % 缝到屏距离(米)
I = (cos(pi*d*D*x/(lambda*D)).^2); % 干涉光强
imagesc(x*1e3, y*1e3, I); % 可视化(单位:毫米)
title('杨氏双缝干涉条纹');
2. 光栅衍射

矩形光栅频谱分析

matlab 复制代码
grating = repmat([ones(1,50), zeros(1,100), ones(1,50)], 500, 1); % 50%占空比光栅
E_grating = grating;

% 傅里叶变换
E_spectrum = fftshift(fft2(E_grating));
3. 涡旋光束生成

拉盖尔-高斯光束(拓扑荷数l=2)

matlab 复制代码
p = 0; l = 2; % 径向指数p=0,角向指数l=2
E_laguerre = laguerre_gaussian_beam(w0, p, l, 0, 0); % 自定义函数生成

四、调试与验证
  1. 频谱对称性检查

    确保实部偶对称、虚部奇对称:

    matlab 复制代码
    figure;
    subplot(2,1,1); imagesc(angle(E_fft)); title('相位分布');
    subplot(2,1,2); imagesc(log(abs(E_fft)+eps)); title('对数幅度谱');
  2. 重建误差分析

    比较原始与重建光场:

    matlab 复制代码
    error = norm(E_input - E_output)/norm(E_input);
    fprintf('重建误差:%.2e\n', error);

参考代码 计算傅立叶光学的实现 www.youwenfan.com/contentcsq/78328.html

五、扩展功能
  1. 动态全息图生成

    通过时变光场模拟动态全息:

    matlab 复制代码
    for t = 1:100
        E_hologram(:,:,t) = exp(1i*2*pi*t/100 * x); % 时变相位调制
    end
  2. 自适应光学校正

    使用Zernike多项式模拟波前畸变并校正:

    matlab 复制代码
    [Z, ~, ~] = zernike(4, 0.1); % 4阶Zernike多项式
    E_corrected = E .* exp(1i*Z); % 波前补偿

六、参考文献与工具
  1. 核心文献
    • 《光学》(Eugene Hecht)第4章:傅里叶光学基础
    • 《数字信号处理》(John G. Proakis):FFT算法实现细节
  2. 工具包推荐
    • Optics Toolbox:提供衍射、干涉等专用函数
    • GPU Coder:加速大规模光学计算
相关推荐
ShineWinsu1 天前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
小付同学呀1 天前
C语言学习(五)——输入/输出
c语言·开发语言·学习
梦幻精灵_cq1 天前
学C之路:不可或缺的main()主函数框架(Learn-C 1st)
c语言·开发语言
消失的旧时光-19431 天前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
福大大架构师每日一题1 天前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
五阿哥永琪1 天前
1. 为什么java不能用is开头来做布尔值的参数名,会出现反序列化异常。
java·开发语言
逻极1 天前
pytest 入门指南:Python 测试框架从零到一(2025 实战版)
开发语言·python·pytest
你的冰西瓜1 天前
C++ STL算法——排序和相关操作
开发语言·c++·算法·stl
海边的Kurisu1 天前
Mybatis-Plus | 只做增强不做改变——为简化开发而生
java·开发语言·mybatis
浅念-1 天前
C++ 模板进阶
开发语言·数据结构·c++·经验分享·笔记·学习·模版