Build a sensor that simulates a spectral radiance meter

We will use the data from this sensor to estimate the Photon noise
for different spectral lights

See also s_radiometerCreate;

Contents

ieInit;

Make the OI

We can create different scene spectral radiances easily. Maybe we should have

sceneCreate('uniform',specifyRelativeRadiance);
scene = sceneCreate('uniformD65');  % sceneWindow(scene);
oi = oiCreate;
oi = oiCompute(oi,scene);

Create a radiometer sensor

wave = 400:700;

[data, filterNames, fileData]  = ieReadColorFilter(wave,'radiometer');
nFilters = size(data,2);
filterOrder = 1:nFilters;
filterFile = fullfile(isetRootPath, 'data', 'sensor', 'colorfilters', 'radiometer.mat');
wSamples = zeros(size(filterNames));
for ii=1:numel(filterNames)
    wSamples(ii) = str2double(filterNames{ii});
end

Make the sensor

pixel = pixelCreate('default', wave);
pixel = pixelSet(pixel,'fill factor',1);
pixel = pixelSet(pixel,'size same fill factor',[1.5 1.5]*1e-6);

sensorRadiometer = sensorCreate('custom', pixel, filterOrder, filterFile,[], wave);
sensorRadiometer = sensorSet(sensorRadiometer,'size',[10 nFilters]);

The choice of exposure time matters a lot

sensorRadiometer = sensorSet(sensorRadiometer,'exposure time',1/100);

sensorRadiometer = sensorSet(sensorRadiometer,'noise flag',-2);
sensorRadiometer = sensorCompute(sensorRadiometer,oi);
electrons = sensorGet(sensorRadiometer,'electrons');
sensorWindow(sensorRadiometer);

sensorRadiometer = sensorSet(sensorRadiometer,'noise flag',-1);
sensorRadiometer = sensorCompute(sensorRadiometer,oi);
electronsNoNoise = sensorGet(sensorRadiometer,'electrons');

Get the electrons across a line

thisLine = electrons(5,:);
sd = thisLine .^ 0.5;
thisLineNoNoise = electronsNoNoise(5,:);

ieNewGraphWin;
errorbar(wSamples,thisLine,2*sd);
hold on;
plot(wSamples,thisLineNoNoise,'k-');

grid on; xlabel('Wavelength (nm)'); ylabel('Electrons');
set(gca,'ylim',[0 round(1.2*max(thisLine(:)),-1)]);