You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
6.0 KiB
Matlab

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

% 本程序用于信噪比计算
function [SNR_output, mmm_pho_SNR, Picture_output] = SNR_simulation(Sensor_input,Optic_input,T_imaging_input,Light_input,pho_input,pho_L_infor,site_str)
%% Sensor_input 探测器性能参数输入
I_dark = Sensor_input(1); % 暗电流电子数单位e-/s
Fn = Sensor_input(2); % 噪声因子,无量纲
QE = Sensor_input(3); % 平均量子效率,无量纲
Gain = Sensor_input(4); % 增益系数,无量纲
Noise_read = Sensor_input(5); % 读出噪声单位e-
FWC = Sensor_input(6); % 满阱电子数单位e-
ADC = Sensor_input(7); % 量化位数单位bit
% 如果未指定探测器性能参数则采用默认参数HR4256性能参数
if isnan(I_dark)
I_dark = 100*1000; % 暗电流噪声电子数单位e-/s
end
if isnan(Fn)
Fn = 1; % 噪声因子,无量纲
end
if isnan(QE)
QE = 0.6; % 平均量子效率,无量纲
end
if isnan(Gain)
Gain = 2.0; % 增益系数,无量纲
end
if isnan(Noise_read)
Noise_read = 120; % 读出噪声单位e-
end
if isnan(FWC)
FWC = 140*1000; % 满阱电子数单位e-
end
if isnan(ADC)
ADC = 12; % 量化位数单位bit
end
%% Optic_input 光学系统性能参数
Lambda_center = Optic_input(1); % 中心波长,单位nm
D_aperture = Optic_input(2); % 光学系统口径单位m
GSD = Optic_input(3); % 星下点分辨率单位m
H_orbit = Optic_input(4); % 轨道高度单位km
Tao0 = Optic_input(5); % 光学系统透过率,无量纲
Epslong = Optic_input(6); % 光学系统面遮拦比,无量纲
% 如果未指定光学系统性能参数,则采用默认参数(商业星性能参数)
if isnan(Lambda_center)
Lambda_center = 650; % 中心波长,单位nm
end
if isnan(D_aperture)
D_aperture = 1.2; % 光学系统口径单位m
end
if isnan(GSD)
GSD = 0.25; % 星下点分辨率单位m
end
if isnan(H_orbit)
H_orbit = 500; % 轨道高度单位km
end
if isnan(Tao0)
Tao0 = 0.8; % 光学系统透过率,无量纲
end
if isnan(Epslong)
Epslong = 0.15; % 光学系统面遮拦比,无量纲
end
%% 成像参数输入
t_TDI = T_imaging_input(1); % 积分时间单位s可以不输入改输入积分级数M
M_TDI = T_imaging_input(2); % 积分级数,无量纲,整数
% 如果未指定成像参数,则采用默认参数(商业星性能参数)
if isnan(M_TDI)
M_TDI = 64; % 积分级数,无量纲,整数
end
if isnan(t_TDI)
GM = 398603*10^9; % G:万有引力常数M地球质量
R = 6371*1000; % R: 地球半径
H = H_orbit*1000; % H: 轨道高度,单位m
rs = R + H;% 半长轴a单位km
Vx = sqrt(GM/rs); % 飞行速度
ws = Vx/rs; % 地面飞行速度
GSD_Vx = R*ws; % 角速度 度/每秒
t_TDI_single = GSD/GSD_Vx; % 单行积分时间
t_TDI = M_TDI*t_TDI_single ; % 积分时间单位s
end
%% 入瞳辐亮度输入
% 必须输入
% 若不输入,则默认高中低三个参数
if isnan(Light_input)
Light_input = [4.35,13.36,55.7]; % 500-900nm,北纬夏季10°@0.0530°@0.2 60°@0.65单位W/m2/sr
end
h_planck = 6.63*1E-34; % 普朗克常数单位Js
c_light = 3.0*1E8; % 光速常量单位m/s
%% 计算信噪比
S_signal_with_L = QE*(GSD/H_orbit/1000)^2*pi*(1-Epslong)/4*Tao0*(Lambda_center*1E-9)/(h_planck*c_light)*D_aperture^2*t_TDI; % 信号电子数/辐射亮度 的系数
S_signal = S_signal_with_L*Light_input; % 信号电子数
S_signal(S_signal > FWC/Gain) = FWC/Gain; % 信号电子数大于满阱,表示探测器饱和了
SNR_ratio = Gain*S_signal./sqrt(Fn^2*Gain^2*S_signal + Gain^2*I_dark*t_TDI+ Gain^2*Noise_read^2); % 信噪比,倍数
SNR_output = 20*log10(SNR_ratio); % 信噪比dB
%% pho_input 反射率矩阵或者图片数据
% 反射率分布,必须输入
if isnan(pho_input)
Picture_output = nan;
mmm_pho_SNR = nan;
else
if length(size(pho_input)) >= 3 % 表示输入为rgb图像
pho_input = rgb2gray(pho_input);
pho_input = im2double(pho_input);
else
% length(size(pho_input)) <= 2 % 表示输入为图像或者矩阵
if max(pho_input)<=1.0 % 表述输入为0-1的矩阵,已经是double型
;
else
pho_input = im2double(pho_input);
end
end
%% pho_L_infor 最大反射率辐射亮度L与反射率pho的k,b输入
pho_max = pho_L_infor(1); % 最大的反射率
if isnan(pho_max)
pho_max = 0.9; % 如果不输入那就按0.9,云的反射率
end
if ~isnan(pho_max)
pho_input = pho_max*pho_input/max(max(pho_input)); % 认为最大反射率pho_max
end
%% 仿真输出 图片为Picture_output.tiff
[sizeM,sizeN] = size(pho_input); %求尺寸
pho_L_k = pho_L_infor(2); % pho到辐射亮度L的斜率k
pho_L_b = pho_L_infor(3); % pho到辐射亮度L的本底b
% 计算最大/平均/最小反射率,最大/平均/最小信噪比
mmm_pho = [max(pho_input(:)),mean(pho_input(:)),min(pho_input(:))]; % 平均反射率
S_signal_mmm = S_signal_with_L*(pho_L_k*mmm_pho + pho_L_b); % 信号电子数
S_signal_mmm(S_signal_mmm > FWC/Gain) = FWC/Gain; % 信号电子数大于满阱,表示探测器饱和了
SNR_ratio_mmm = Gain*S_signal_mmm./sqrt(Fn^2*Gain^2*S_signal_mmm + Gain^2*I_dark*t_TDI+ Gain^2*Noise_read^2); % 信噪比,倍数
SNR_output_mmm = 20*log10(SNR_ratio_mmm); % 信噪比dB
mmm_pho_SNR = [mmm_pho; SNR_output_mmm];
% 图像生产输出信号→DN
L_light = pho_L_k*pho_input + pho_L_b; % 辐射亮度
S_signal = S_signal_with_L*L_light; % 信号电子数
% noise_white = 1/0.289*(rand(sizeM,sizeN)-0.5); % 均值为0rms为1
noise_S_signal = Fn*sqrt(S_signal).*(1/0.289*(rand(sizeM,sizeN)-0.5)); % 光子噪声
noise_S_dark = sqrt(I_dark*t_TDI).*(1/0.289*(rand(sizeM,sizeN)-0.5)); % 暗电流噪声
noise_S_read = Noise_read*(1/0.289*(rand(sizeM,sizeN)-0.5)); % 读出噪声
S_signal_output = S_signal + I_dark*t_TDI + noise_S_signal + noise_S_dark + noise_S_read; % 总电子数(信号+暗电流+噪声)
S_signal_output(S_signal_output>FWC/Gain) = FWC/Gain; % 饱和了
DN_signal_output = round(S_signal_output/(FWC/Gain)*(2^ADC -1)); %
%imwrite(uint8(DN_signal_output/max(DN_signal_output(:))*255),[site_str,'Picture_output_LaShen.png']);
imwrite(uint8(DN_signal_output/max(DN_signal_output(:))*255),site_str+'Picture_output_LaShen.png');
if ADC > 16;
disp('不支持16bit以上量化')
elseif (ADC >8)&&(ADC<=16)
Picture_output = uint16(DN_signal_output); % 输出的
%imwrite(Picture_output,[site_str,'Picture_output.tiff']);
imwrite(Picture_output,site_str+'Picture_output.tiff');
else
Picture_output = uint8(DN_signal_output); % 输出的
%imwrite(Picture_output,[site_str,'Picture_output.tiff']);
imwrite(Picture_output,site_str+'Picture_output.tiff');
end
end