% 打开 ZBF 文件
filename = 'your_file.zbf'; % 请替换为实际的文件名
fileID = fopen(filename, 'r', 'l'); % 'l' denotes little-endian
if fileID == -1
error('无法打开文件');
end
% 假设我们知道数据大小为 Nx x Ny
Nx = 256; % 从文件中解析
Ny = 256; % 从文件中解析
dataSize = Nx * Ny;
% 读取照度数据
intensity = fread(fileID, dataSize, 'double');
% 读取相位数据
phase = fread(fileID, dataSize, 'double');
fclose(fileID);
% 对照度和相位数据进行预处理
intensity(isnan(intensity) | isinf(intensity)) = 0;
phase(isnan(phase) | isinf(phase)) = 0;
% 对照度数据进行归一化处理
intensity = intensity / max(intensity();
% 确保数据组织成矩阵形式
intensity = reshape(intensity, Ny, Nx); % 根据实际数据调整维度顺序
phase = reshape(phase, Ny, Nx);
% 形成复数形式的光场
complexField = sqrt(intensity) .* exp(1i * phase);
% 执行傅里叶变换
fftResult = fftshift(fft2(complexField));
% 能量分布
energyDistribution = abs(fftResult).^2;
% 计算波数半径和角度
[X, Y] = meshgrid(1:Nx, 1:Ny);
centerX = ceil(Nx / 2);
centerY = ceil(Ny / 2);
kx = X - centerX; % 中心化波数向量
ky = Y - centerY;
kr = sqrt(kx.^2 + ky.^2); % 波数幅值
theta = atan2(ky, kx); % 波数角度
% 限制角度范围为 0 到 90 度
angleMask = theta >= 0 & theta <= (pi/2);
% 计算指定角度范围内能量分布
energyDistribution(~angleMask) = 0; % 只保留特定角度范围内的数据
% 使用 histcounts 和 accumarray 计算能量随角度变化
numThetaBins = 180; % 比如每一度一个 bin
thetaBins = linspace(0, pi/2, numThetaBins + 1);
angleEnergy = zeros(numThetaBins, 1);
for i = 1:numThetaBins
mask = (theta >= thetaBins(i) & theta < thetaBins(i+1));
angleEnergy(i) = sum(energyDistribution(mask));
end
% 绘制能量随角度的分布
figure;
polarplot(thetaBins(1:end-1), angleEnergy);
title('Energy Distribution over Angle (0 to 90 degrees)');
这个代码是用来得到zbf文件中的能量随角度的变化,但是有一点问题,1是角度应该是出射光与z轴的夹角,0-90度,2是我希望得到每个角度上的能量占所有角度的所有能量的占比,就是可以给他们归一化一下
|