当然可以。以下是代码更新,添加了绘制波数能量分布的极坐标图以及计算特定角度范围内能量百分比的功能。
### 完整代码
- % ... (之前的数据读取和初始化代码不变)
- % 计算傅里叶变换后,在频域中得到的维度信息
- [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); % 横向波数幅值
- % 假定最大波数为标量单位
- k0 = max(kr(:));
- % 计算与z轴的夹角(出射角)
- theta = asin(min(kr / k0, 1)); % 确保比例在有效区间内
- % 划分角度范围
- thetaBins = linspace(0, pi/2, 90); % 将0到90度分为89个区间
- angleEnergy = zeros(1, length(thetaBins)-1);
- for i = 1:length(thetaBins)-1
- 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)');
- % 归一化能量分布
- totalEnergy = sum(angleEnergy);
- angleEnergyNormalized = angleEnergy / totalEnergy;
- % 绘制能量百分比分布(极坐标图)
- figure;
- polarplot(thetaBins(1:end-1), angleEnergyNormalized);
- title('Normalized Energy Percentage over Angle (0 to 90 degrees)');
- % 绘制波数能量分布的极坐标图
- kBins = linspace(0, max(kr(:)), 100); % 将波数分成100个区间
- kEnergy = zeros(1, length(kBins)-1);
- for i = 1:length(kBins)-1
- mask = (kr >= kBins(i)) & (kr < kBins(i+1));
- kEnergy(i) = sum(energyDistribution(mask));
- end
- figure;
- polarplot(linspace(0, 2*pi, length(kEnergy)), [kEnergy, kEnergy]); % 绘制完整圆周
- title('Energy Distribution over Wave Number');
- % 输入一个角度,计算0到这个角度的能量占总能量的百分比
- inputAngle = pi/4; % 例如45度
- angleMask = (theta <= inputAngle);
- energyWithinAngle = sum(energyDistribution(angleMask));
- percentageEnergyWithinAngle = energyWithinAngle / totalEnergy * 100;
- disp(['Percentage of energy within 0 to ', num2str(inputAngle * 180 / pi), ' degrees: ', num2str(percentageEnergyWithinAngle), '%']);
复制代码
### 代码细节说明:
1. **波数能量分布(第三张图)**:
- 波数的范围被划分为100个区间。
- 使用 `kr` 来决定每个区间内的能量,然后以极坐标形式表示。
- 绘制完整的极坐标圆来展示波数能量分布。
2. **计算特定角度范围内的能量百分比**:
- 提供一个输入角度,例如45度,将角度转换为弧度。
- 计算从0到该输入角度范围内的能量,并计算其占总能量的百分比。
通过这些更新,你可以得到三个图以及指定角度范围内的能量百分比。
--- 光学专家Gpt |