zbf

[复制链接]
匿名  发表于 前天 16:34 |阅读模式
% 打开 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是我希望得到每个角度上的能量占所有角度的所有能量的占比,就是可以给他们归一化一下

回复

使用道具 举报

全部回复27 显示全部楼层
机器人Gpt 发表于 前天 16:34 | 显示全部楼层
要解决你提到的问题,我们需要确保计算的角度正确,并对每个角度的能量进行归一化。首先,我们需要明确计算的角度是与z轴的夹角,而不是在平面内的方位角。因此,我们需要调整代码以计算与z轴的夹角,并将能量归一化。

以下是如何修改代码:

1. **计算与z轴的夹角**:  
    \[ \theta = \arctan\left(\frac{\sqrt{kx^2 + ky^2}}{kz}\right) \]
   其中,\( kz = \sqrt{k_0^2 - kx^2 - ky^2} \),\( k_0 \)为标量,可以用来做单位换算。

2. **归一化能量分布**:计算每个角度上的能量占所有角度的能量的比例。

以下是修改后的代码示例:

  1. % ... (之前的代码不变)

  2. % 计算傅里叶变换后,在频域中得到的维度信息
  3. [X, Y] = meshgrid(1:Nx, 1:Ny);

  4. % 中心点转换
  5. centerX = ceil(Nx / 2);
  6. centerY = ceil(Ny / 2);

  7. % 波数向量
  8. kx = X - centerX;
  9. ky = Y - centerY;
  10. k0 = max(kx(:)); % 假设最大波数为标量单位

  11. % 计算与z轴的夹角
  12. kr = sqrt(kx.^2 + ky.^2); % 横向波数幅值
  13. kz = sqrt(max(k0^2 - kr.^2, 0));
  14. theta = atan2(kr, kz); % 与z轴的夹角

  15. % 设置角度范围和分辨率
  16. thetaBins = linspace(0, pi/2, 90); % 0到90度分100份
  17. angleEnergy = zeros(1, length(thetaBins)-1);

  18. for i = 1:length(thetaBins)-1
  19.     mask = (theta >= thetaBins(i)) & (theta < thetaBins(i+1));
  20.     angleEnergy(i) = sum(energyDistribution(mask));
  21. end

  22. % 归一化能量分布
  23. totalEnergy = sum(angleEnergy);
  24. angleEnergyNormalized = angleEnergy / totalEnergy;

  25. % 绘制能量随角度的分布
  26. figure;
  27. polarplot(thetaBins(1:end-1), angleEnergyNormalized);
  28. title('Normalized Energy Distribution over Angle (0 to 90 degrees)');
复制代码


### 关键改动:
- **夹角计算**:`atan2(kr, kz)` 用于计算与 z 轴的夹角。
- **能量归一化**:计算总能量 `totalEnergy` 后,将每个角度区间的能量除以这个总能量,得到 `angleEnergyNormalized`。

通过这些改动,你可以获得每个角度的能量在总能量中的比例,并且正确地表示出射光与 Z 轴的夹角分布情况。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 前天 16:53
能不能把这个代码修改一下,角度改成是出射光与z轴的夹角。0-90度
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 前天 16:54 | 显示全部楼层
LIYU 发表于 2025-01-06 16:53
能不能把这个代码修改一下,角度改成是出射光与z轴的 ...


要修改代码以确保计算的是出射光与z轴的夹角,我们需要计算波向量的幅值以及它与z轴方向的夹角。通常,我们计算的出射角是通过计算`kr`(横向波数分量)和`kz`(沿z轴的波数分量)的比值来得到的。

假设一个理想的传播媒介,我们可以使用如下假设:`kz = sqrt(k0^2 - kr^2)`,其中`k0`是传播中的波数幅值。因此可以调整方向以便于计算与z轴的夹角。

以下是更新后的代码:

  1. % ... (之前的文件读取代码不变)

  2. % 计算傅里叶变换后,在频域中得到的维度信息
  3. [X, Y] = meshgrid(1:Nx, 1:Ny);

  4. % 中心点转换
  5. centerX = ceil(Nx / 2);
  6. centerY = ceil(Ny / 2);

  7. % 波数向量
  8. kx = X - centerX;
  9. ky = Y - centerY;
  10. kr = sqrt(kx.^2 + ky.^2); % 横向波数幅值

  11. % 用最大横向波数作为标量单位(这里假设)
  12. k0 = max(kr(:)); % 总波数幅值

  13. % 计算与z轴的夹角(出射角)
  14. kz = sqrt(max(k0^2 - kr.^2, 0)); % 确保对根号取非负数
  15. theta = asin(min(kr / k0, 1)); % 使用sin来反射出kz/k0的比例

  16. % 设置角度范围和分辨率
  17. thetaBins = linspace(0, pi/2, 90); % 0到90度分区
  18. angleEnergy = zeros(1, length(thetaBins)-1);

  19. for i = 1:length(thetaBins)-1
  20.     mask = (theta >= thetaBins(i)) & (theta < thetaBins(i+1));
  21.     angleEnergy(i) = sum(energyDistribution(mask));
  22. end

  23. % 归一化能量分布
  24. totalEnergy = sum(angleEnergy);
  25. angleEnergyNormalized = angleEnergy / totalEnergy;

  26. % 绘制能量随角度的分布
  27. figure;
  28. polarplot(thetaBins(1:end-1), angleEnergyNormalized);
  29. title('Normalized Energy Distribution over Angle (0 to 90 degrees)');
复制代码


### 关键改动:
- **`kz`分量计算**:使用`kz = sqrt(max(k0^2 - kr^2, 0))`来保持其非负。
- **与z轴夹角的计算**:使用 `theta = asin(min(kr / k0, 1))` 来确保正弦值在有效区间内,从而反映与z轴的正确夹角。
- 这样计算出来的`theta`对于所有点,都将在 0 到 90 度之间,且每个角度的能量可以正确地表示出与 z 轴的夹角。

这些步骤确保了角度计算以反映出射光与 z 轴的夹角,并在特定的角度范围内进行能量归一化统计。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 前天 16:56
我需要的是只把角度修改为与z轴的夹角,0-90度,不需要归一化统计
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 前天 16:56 | 显示全部楼层
LIYU 发表于 2025-01-06 16:56
我需要的是只把角度修改为与z轴的夹角,0-90度,不需 ...


好的,我们来调整代码来计算出与 z 轴之间的夹角,不进行归一化统计。这个计算将基于横向波数成分 `kr` 和总波数成分 `k0`。

以下是相应的修改:

  1. % ... (之前的数据读取和初始化代码不变)

  2. % 计算傅里叶变换后,在频域中得到的维度信息
  3. [X, Y] = meshgrid(1:Nx, 1:Ny);

  4. % 中心点转换为波数向量
  5. centerX = ceil(Nx / 2);
  6. centerY = ceil(Ny / 2);
  7. kx = X - centerX;
  8. ky = Y - centerY;
  9. kr = sqrt(kx.^2 + ky.^2); % 横向波数幅值

  10. % 假定最大波数为标量单位
  11. k0 = max(kr(:));

  12. % 计算与z轴的夹角(出射角)
  13. theta = asin(min(kr / k0, 1)); % 确保在有效区间内

  14. % 划分角度范围,直接计算能量而不归一化
  15. thetaBins = linspace(0, pi/2, 90); % 将0到90度分为89个区间
  16. angleEnergy = zeros(1, length(thetaBins)-1);

  17. for i = 1:length(thetaBins)-1
  18.     mask = (theta >= thetaBins(i)) & (theta < thetaBins(i+1));
  19.     angleEnergy(i) = sum(energyDistribution(mask));
  20. end

  21. % 绘制能量随角度的分布
  22. figure;
  23. polarplot(thetaBins(1:end-1), angleEnergy);
  24. title('Energy Distribution over Angle (0 to 90 degrees)');
复制代码


### 主要更改说明:

- **与 z 轴夹角的计算**:使用 `asin(min(kr / k0, 1))`,其中 `kr` 是横向波数,`k0` 是假设的总波数。
- **不做归一化处理**:直接计算能量分布。

通过这些调整,代码将能够计算出光波与 z 轴的夹角,并绘制该角度范围内的能量分布。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 前天 16:58
机器人Gpt 发表于 2025-1-6 16:56
好的,我们来调整代码来计算出与 z 轴之间的夹角,不进行归一化统计。这个计算将基于横向波数成分 `kr`  ...

对上述数据进行归一化统计,再得到一张图
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 前天 16:59 | 显示全部楼层
LIYU 发表于 2025-01-06 16:58
对上述数据进行归一化统计,再得到一张图 ...


要对计算出的能量分布进行归一化统计,我们需要在最后步骤中对每个角度的能量进行归一化处理,即将每个角度的能量占总能量的比例计算出来,并绘制图表。

以下是经过更新后的代码,包括归一化步骤:

  1. % ... (之前的数据读取和初始化代码不变)

  2. % 计算傅里叶变换后,在频域中得到的维度信息
  3. [Y, X] = meshgrid(1:Nx, 1:Ny);

  4. % 中心点转换为波数向量
  5. centerX = ceil(Nx / 2);
  6. centerY = ceil(Ny / 2);
  7. kx = X - centerX;
  8. ky = Y - centerY;
  9. kr = sqrt(kx.^2 + ky.^2); % 横向波数幅值

  10. % 假定最大波数为标量单位
  11. k0 = max(kr(:));

  12. % 计算与z轴的夹角(出射角)
  13. theta = asin(min(kr / k0, 1)); % 确保比例在有效区间内

  14. % 划分角度范围
  15. thetaBins = linspace(0, pi/2, 90); % 将0到90度分为89个区间
  16. angleEnergy = zeros(1, length(thetaBins)-1);

  17. for i = 1:length(thetaBins)-1
  18.     mask = (theta >= thetaBins(i)) & (theta < thetaBins(i+1));
  19.     angleEnergy(i) = sum(energyDistribution(mask));
  20. end

  21. % 归一化能量分布
  22. totalEnergy = sum(angleEnergy);
  23. angleEnergyNormalized = angleEnergy / totalEnergy;

  24. % 绘制能量随角度的归一化分布
  25. figure;
  26. polarplot(thetaBins(1:end-1), angleEnergyNormalized);
  27. title('Normalized Energy Distribution over Angle (0 to 90 degrees)');
复制代码


### 关键步骤说明:
- **与 z 轴夹角的计算**:`theta = asin(min(kr / k0, 1))` 确保计算的出射角。
- **能量归一化**:总能量用 `totalEnergy = sum(angleEnergy)` 计算,随后每个角度的能量用 `angleEnergy / totalEnergy` 归一。
- **绘图**:使用 `polarplot` 函数来绘制归一化后的能量分布。

这些改变确保了你将得到一个显示能量在 0 到 90 度范围内分布的极坐标图,且显示的是每个角度上的能量占总体能量的百分比。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 前天 17:00
我需要得到两张图,一张是是与z轴0-90度的能量分布的极坐标图,另一张是每个角度上的能量占总体能量的百分比图
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 前天 17:00 | 显示全部楼层
LIYU 发表于 2025-01-06 17:00
我需要得到两张图,一张是是与z轴0-90度的能量分布的 ...


好的,我们可以将代码分为两部分,分别生成你需要的两张图。第一张图显示与 z 轴的夹角为 0 到 90 度的能量分布,第二张图则显示每个角度上的能量占总体能量的百分比。

以下是完整的代码实现:

  1. % ... (之前的数据读取和初始化代码不变)

  2. % 计算傅里叶变换后,在频域中得到的维度信息
  3. [X, Y] = meshgrid(1:Nx, 1:Ny);

  4. % 中心点转换为波数向量
  5. centerX = ceil(Nx / 2);
  6. centerY = ceil(Ny / 2);
  7. kx = X - centerX;
  8. ky = Y - centerY;
  9. kr = sqrt(kx.^2 + ky.^2); % 横向波数幅值

  10. % 假定最大波数为标量单位
  11. k0 = max(kr(:));

  12. % 计算与z轴的夹角(出射角)
  13. theta = asin(min(kr / k0, 1)); % 确保比例在有效区间内

  14. % 划分角度范围
  15. thetaBins = linspace(0, pi/2, 90); % 将0到90度分为89个区间
  16. angleEnergy = zeros(1, length(thetaBins)-1);

  17. for i = 1:length(thetaBins)-1
  18.     mask = (theta >= thetaBins(i)) & (theta < thetaBins(i+1));
  19.     angleEnergy(i) = sum(energyDistribution(mask));
  20. end

  21. % 绘制能量随角度的分布(极坐标图)
  22. figure;
  23. polarplot(thetaBins(1:end-1), angleEnergy);
  24. title('Energy Distribution over Angle (0 to 90 degrees)');

  25. % 归一化能量分布
  26. totalEnergy = sum(angleEnergy);
  27. angleEnergyNormalized = angleEnergy / totalEnergy;

  28. % 绘制能量百分比分布(直角坐标图)
  29. figure;
  30. plot(thetaBins(1:end-1), angleEnergyNormalized, '-o');
  31. xlabel('Angle (radians)');
  32. ylabel('Normalized Energy Percentage');
  33. title('Normalized Energy Percentage over Angle (0 to 90 degrees)');
  34. grid on;
复制代码


### 代码说明:
1. **能量分布图**:第一段代码生成一个极坐标图,显示能量随角度的分布。
2. **归一化后的百分比图**:第二段代码创建一个直角坐标图,显示每个角度上的能量占整体能量的百分比。

通过这两个独立的绘图步骤,你可以分别查看能量分布的绝对大小及其在不同角度上的相对贡献百分比。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

123下一页
发帖

快速回帖

您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于楼主

匿名用户组
  • 主题

    104
  • 回答

    9
  • 积分

    105
联系客服 关注微信 访问手机版 返回顶部 返回列表