Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models.
The 10 matches · 3 of them tie a paragraph to a whole file without given lines: weak matches, whose lines are not tinted
- [1] § Methods › Data Collection › In silico simulations of two- and three-layered media ↔ TwoLayerSpectroscopy/R_2L_withPreCom.m, the whole file · a weak match · score 0.67 · angular modulation frequency, absorption coefficient, speed, photons, refractive, Sec · Report a mismatch
- [2] § Methods › Data Analysis › Measure of functional brain activation with data type M (maximum at 830 nm) ↔ DualRatio_FluorescenceFlowCytometry/221101Data/NEUprocessed/two_probe__4_pmt_preProc.m, lines 30 to 147 · score 0.61 · standard deviation, fibers, peak, window, threshold, SNR · Report a mismatch
- [3] § Methods › Data Collection › In silico simulations of two- and three-layered media ↔ TwoLayerSpectroscopy/R_2L_withPreCom.m, the whole file · a weak match · score 0.59 · reduced scattering coefficient, radius, zero, photons, diffusive, refractive · Report a mismatch
- [4] § Biographies ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 1 to 35 · score 0.58 · Biomedical Optics, Sergio Fantini, Optical · Report a mismatch
- [5] § Methods › Data Collection › In silico simulations of two- and three-layered media ↔ TwoLayer/TwoLayerReflectance.m, the whole file · a weak match · score 0.57 · angular modulation frequency, speed, photons, refractive, coefficient, Sec · Report a mismatch
- [6] § Methods › Data Analysis › Changes in absorption coefficient ( ) ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 219 to 246 · score 0.57 · deoxy hemoglobin, Beer, law, wavelengths, concentration, coefficient · Report a mismatch
- [7] § Methods › Data Collection › In vivo brain measurements › Equipment and human subjects ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 37 to 61 · score 0.54 · laser diodes, skin, wavelengths, setup, dual, tissue · Report a mismatch
- [8] § Methods › Data Collection › In vivo brain measurements › Equipment and human subjects ↔ DualSlope/DSdmua.m, lines 1 to 115 · score 0.54 · dual slope, human, modulated, Tufts, brain, intensity · Report a mismatch
- [9] § Biographies ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 1 to 35 · score 0.51 · optical measurements, Giles Blaney, optics, Biomedical · Report a mismatch
- [10] § Methods › Data Analysis › Changes in absorption coefficient ( ) ↔ CHS/time-domain CHS/Example.m, lines 52 to 110 · score 0.50 · deoxy hemoglobin · Report a mismatch
Paper
Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
MATLAB · 778 lines · 25 KB · no license · 4 matches
- %% Giles Blaney, PhD; Spring 2026
- % Please cite
- % Giles Blaney, Sergio Fantini "Broad-linewidth sources result in a skin-tone
- % bias in noninvasive optical measurement of oxygen saturation,"
- % Journal of Biomedical Optics 31(7), 070501 (9 Jul 2026)
- % https://doi.org/10.1117/1.JBO.31.7.070501
- % for anything regarding this code.
- clear; home;
- % Nominal RED and IR wavelengths & full width half maxes
- lamRED = 660; %nm
- lamIR = 880; %nm
- LEDfwhm_all = linspace(10,100, 10); %nm
- % Melanin volume fractions
- Mfrac_all = linspace(0,0.43,10);
- % Pulsatile hemoglobin perturbation & arterial oxygen saturation
- dTart = 1; %uM
- SaO2_all = linspace(0.7,1,100);
- % Wavelengths to simulate
- lam = (550:1050).'; %nm
- % Set if we assume constant epidermis thickness (useMCpathlen=false) or use
- % path-lengths from Monte-Carlo (useMCpathlen=true)
- useMCpathlen = true;
- % Thickness and source detector distance
- s = 10; %mm
- rho = s; % Detector is directly opposite source
- % Number of terms in diffusion theory solution to sum
- m_max = 100;
- %% ########## Setup #######################################################
- % Load results from Monte Carlo based on the model in:
- % G. Blaney, J. Frias, F. Tavakoli, A. Sassaroli, and S. Fantini,
- % "Dual-ratio approach to pulse oximetry and the effect of skin tone,"
- % JBO, vol. 29, no. S3, p. S33311, Oct. 2024,
- % doi: 10.1117/1.JBO.29.S3.S33311
- if useMCpathlen
- MCavg = load('deps/MCout_avg.mat');
- end
- % Find indexes of the nominal RED and IR wavelengths
- [~,iRED] = min(abs(lam-lamRED));
- [~,iIR] = min(abs(lam-lamIR));
- % Create Laser Diode (LD) emission spectrum
- P0red_LD = zeros(size(lam));
- P0red_LD(iRED) = 1; %power/nm
- P0ir_LD = zeros(size(lam));
- P0ir_LD(iIR) = 1; %power/nm
- % Generate bulk tissue optical property spectra
- [muspTIS, muaTIS, nTIS] = tissueOptProps_func(lam);
- % Generate matrix of extinction coefficients for oxy- and deoxy-hemoglobin
- E_OD = makeE('OD',lam); %(1/mm)/uM
- %% ########## Calculate total path-length in bulk tissue <L> ##############
- % Infinitesimal perturbation for numerical derivative
- dmua_numDer = 1e-6; %1/mm
- % Initialize optical property structure
- optProp.nin=[];
- optProp.nout=1;
- optProp.musp=[]; %1/mm
- optProp.mua=[]; %1/mm
- % Loop through wavelength and calculate <L> for each
- L = NaN(size(lam));
- for i = 1:length(lam)
- % Set refractive index and reduced scattering coefficient
- optProp.nin=nTIS(i);
- optProp.musp=muspTIS(i); %1/mm
- % Calculate transmittance Green's function with a symmetric
- % infinitesimal perturbation
- optProp.mua=muaTIS(i)-dmua_numDer/2; %1/mm
- Tgrn_0 = Tslab(rho, s, optProp, m_max); %1/mm^2
- optProp.mua=muaTIS(i)+dmua_numDer/2; %1/mm
- Tgrn_1 = Tslab(rho, s, optProp, m_max); %1/mm^2
- % Find <L> via numerical derivative
- L(i) = -(log(Tgrn_1)-log(Tgrn_0))/dmua_numDer; %mm
- end
- %% ########## Loop over all arterial oxygen saturations ###################
- % Variable initialization (below)
- % Intensity spectra emitted from tissue for illumination from the RED or
- % IR LED (wavelength,SaO2,Melanin,FWHM)
- IredLED = NaN(length(lam),length(SaO2_all),length(Mfrac_all), ...
- length(LEDfwhm_all));
- IirLED = NaN(length(lam),length(SaO2_all),length(Mfrac_all), ...
- length(LEDfwhm_all));
- % Ratio-of-ratios for LDs or LEDs (SaO2,Melanin,FWHM)
- RoR_LD = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
- RoR_LED = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
- % Recovered arterial oxygen saturations for LDs, LEDs with nominal
- % extinction coefficients, or LEDs with weighted extinction coefficients
- % (SaO2,Melanin,FWHM)
- sat_LD_rec = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
- sat_LED_rec = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
- satw_LED_rec = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
- % SaO2 loop
- for SaO2ind = 1:length(SaO2_all)
- % Calculate changes in absorption given total-hemoglobin concentration
- % and arterial oxygen saturation
- dO = dTart*SaO2_all(SaO2ind); %uM
- dD = dTart-dO; %uM
- dmua = E_OD*[dO;dD]; %1/mm
- %% ########## Transmittance Green's functions #########################
- % Loop through wavelength and calculate Green's function during
- % systolic and diastolic phases for each wavelength
- Tgrn_sys = NaN(size(lam));
- Tgrn_dia = NaN(size(lam));
- for i = 1:length(lam)
- % Set refractive index and reduced scattering coefficient
- optProp.nin=nTIS(i);
- optProp.musp=muspTIS(i); %1/mm
- % Calculate transmittance Green's function with a symmetric
- % blood volume perturbation
- optProp.mua=muaTIS(i)+dmua(i)/2; %1/mm
- Tgrn_sys(i) = Tslab(rho, s, optProp, m_max); %1/mm^2
- optProp.mua=muaTIS(i)-dmua(i)/2; %1/mm
- Tgrn_dia(i) = Tslab(rho, s, optProp, m_max); %1/mm^2
- end
- %% ########## Loop through melanin concentrations #####################
- for melInd = 1:length(Mfrac_all)
- % Absorption of epidermis from melanosomes using Equation 8 in:
- % S. L. Jacques, "Optical properties of biological tissues: a
- % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
- % doi: 10.1088/0031-9155/58/11/r37
- muaEPI = Mfrac_all(melInd) * 51.9*(lam/500).^-3.5; %1/mm
- %% Determine length through epidermal melanin filter
- if useMCpathlen
- % Find index of closest melanin concentration in Monte Carlo
- % data
- [~,iM_MC] = min(abs( MCavg.Mfracs - Mfrac_all(melInd) ));
- % Map partial path-lengths from Monte Carlo onto the simulated
- % wavelengths
- tmpLam = movmean(MCavg.lams, 10); %nm
- tmpL = movmean(MCavg.l(iM_MC,:,1), 10); %mm
- d = interp1(tmpLam, tmpL, lam, ...
- 'linear','extrap'); %mm
- else
- % Assume 0.25 mm thick on each side
- d = 0.25*2; %mm
- end
- %% ########## Loop through FWHM cases #############################
- for fwhmInd = 1:length(LEDfwhm_all)
- % Generate LED emission spectra
- P0red_LED = LEDspec_func(lam, lamRED, LEDfwhm_all(fwhmInd));
- P0ir_LED = LEDspec_func(lam, lamIR, LEDfwhm_all(fwhmInd));
- %% ########## Model spectra reaching the detector #############
- % Spectra for LD and systolic or diastolic cases (will be the
- % same for every FWHM loop iteration)
- IredLD_sys = P0red_LD .* exp(-muaEPI.*d) .* Tgrn_sys;
- IirLD_sys = P0ir_LD .* exp(-muaEPI.*d) .* Tgrn_sys;
- IredLD_dia = P0red_LD .* exp(-muaEPI.*d) .* Tgrn_dia;
- IirLD_dia = P0ir_LD .* exp(-muaEPI.*d) .* Tgrn_dia;
- % Spectra for LED and systolic or diastolic cases (will depend
- % on FWHM loop iteration)
- IredLED_sys = P0red_LED .* exp(-muaEPI.*d) .* Tgrn_sys;
- IirLED_sys = P0ir_LED .* exp(-muaEPI.*d) .* Tgrn_sys;
- IredLED_dia = P0red_LED .* exp(-muaEPI.*d) .* Tgrn_dia;
- IirLED_dia = P0ir_LED .* exp(-muaEPI.*d) .* Tgrn_dia;
- % Find average spectra reaching the detectors for the LED case
- IredLED(:,SaO2ind,melInd,fwhmInd) = ...
- (IredLED_sys+IredLED_dia)/2;
- IirLED(:,SaO2ind,melInd,fwhmInd) = ...
- (IirLED_sys+IirLED_dia)/2;
- %% ########## Find detected signals ###########################
- % Sum spectra reaching the detectors to find detected signal
- % for LDs during systolic and diastolic phases (will be the
- % same for every FWHM loop iteration)
- IredLD_sys_det = sum(IredLD_sys);
- IirLD_sys_det = sum(IirLD_sys);
- IredLD_dia_det = sum(IredLD_dia);
- IirLD_dia_det = sum(IirLD_dia);
- % Sum spectra reaching the detectors to find detected signal
- % for LEDs during systolic and diastolic phases (will depend
- % on FWHM loop iteration)
- IredLED_sys_det = sum(IredLED_sys);
- IirLED_sys_det = sum(IirLED_sys);
- IredLED_dia_det = sum(IredLED_dia);
- IirLED_dia_det = sum(IirLED_dia);
- %% ########## Calculate ratio-of-ratios #######################
- RoR_LD(SaO2ind,melInd,fwhmInd) = ...
- ((IredLD_sys_det-IredLD_dia_det)/IredLD_dia_det)/...
- ((IirLD_sys_det-IirLD_dia_det)/IirLD_dia_det);
- RoR_LED(SaO2ind,melInd,fwhmInd) = ...
- ((IredLED_sys_det-IredLED_dia_det)/IredLED_dia_det)/...
- ((IirLED_sys_det-IirLED_dia_det)/IirLED_dia_det);
- %% ########## Apply modified Beer Lambert law #################
- % Generate matrix of extinction coefficients for oxy- and
- % deoxy-hemoglobin only at the nominal wavelengths
- E_mBLL = makeE('OD', [lamRED,lamIR]);
- % Calculate recovered absorption changes for LDs
- dmuaRED_LD = -log(IredLD_sys_det/IredLD_dia_det)/L(iRED);
- dmuaIR_LD = -log(IirLD_sys_det/IirLD_dia_det)/L(iIR);
- % Convert absorption to concentration and calculate recovered
- % oxygen saturation for LDs
- dC_LD = E_mBLL\[dmuaRED_LD;dmuaIR_LD];
- dO_LD_rec = dC_LD(1);
- dD_LD_rec = dC_LD(2);
- sat_LD_rec(SaO2ind,melInd,fwhmInd) = ...
- dO_LD_rec / (dO_LD_rec+dD_LD_rec);
- % Calculate recovered absorption changes for LEDs
- dmuaRED_LED = -log(IredLED_sys_det/IredLED_dia_det)/L(iRED);
- dmuaIR_LED = -log(IirLED_sys_det/IirLED_dia_det)/L(iIR);
- % Convert absorption to concentration and calculate recovered
- % oxygen saturation for LDs
- dC_LED = E_mBLL\[dmuaRED_LED;dmuaIR_LED];
- dO_LED_rec = dC_LED(1);
- dD_LED_rec = dC_LED(2);
- sat_LED_rec(SaO2ind,melInd,fwhmInd) = ...
- dO_LED_rec / (dO_LED_rec+dD_LED_rec);
- %% ########## Implement weighted extinction coefficients ######
- % Generate extinction spectra for oxy- and deoxy-hemoglobin
- extO = makeE('O',lam);
- extD = makeE('D',lam);
- % Weight extinction coefficients by the spectra reaching the
- % detectors
- Wred = IredLED(:,SaO2ind,melInd,fwhmInd);
- Wir = IirLED(:,SaO2ind,melInd,fwhmInd);
- extOred = sum(Wred.*extO)/sum(Wred);
- extDred = sum(Wred.*extD)/sum(Wred);
- extOir = sum(Wir.*extO)/sum(Wir);
- extDir = sum(Wir.*extD)/sum(Wir);
- % Convert absorption to concentration and calculate recovered
- % oxygen saturation considering weighted coefficients for LEDs
- Ew_mBLL = [
- extOred, extDred;
- extOir, extDir
- ];
- dCw_LED = Ew_mBLL\[dmuaRED_LED;dmuaIR_LED];
- dOw_LED_rec = dCw_LED(1);
- dDw_LED_rec = dCw_LED(2);
- satw_LED_rec(SaO2ind,melInd,fwhmInd) = ...
- dOw_LED_rec / (dOw_LED_rec+dDw_LED_rec);
- end
- end
- end
- %% ########## Plot -- Modeled Spectra #####################################
- cols = lines(7);
- Mind = length(Mfrac_all);
- [~,satInd] = min(abs(SaO2_all-0.95));
- [~,fwhmInd] = min(abs(LEDfwhm_all-50));
- figure(101); clf;
- % -------------------------------------------------------------------------
- subplot(2,1,1); hold on;
- plot(lam, LEDspec_func(lam, lamRED, LEDfwhm_all(fwhmInd)), '-',...
- 'Color',cols(7,:));
- xlim([-100,100]+lamRED);
- ylim([0,1]);
- ylabel('$P/P_{max}$');
- xlabel('Wavelength (nm)');
- title('Red LED');
- pos = get(gca,"Position");
- legend( ...
- 'Source Emission', ...
- 'Orientation','horizontal', ...
- 'Location','northoutside');
- set(gca, "Position",pos);
- % -------------------------------------------------------------------------
- subplot(2,1,2); hold on;
- plot(lam, LEDspec_func(lam, lamRED, LEDfwhm_all(fwhmInd)), '--',...
- 'Color',cols(7,:));
- tmp = IredLED(:,satInd,Mind,fwhmInd);
- plot(lam, tmp/max(tmp), '-',...
- 'Color',cols(7,:));
- xlim([-100,100]+lamRED);
- ylim([0,1]);
- ylabel('$I/I_{max}$');
- xlabel('Wavelength (nm)');
- title('Red LED');
- pos = get(gca,"Position");
- legend( ...
- 'Source Emission', ...
- 'Detected Spectrum', ...
- 'Orientation','vertical', ...
- 'Location','northoutside');
- set(gca, "Position",pos);
- % -------------------------------------------------------------------------
- % Absorption of epidermis from melanosomes using Equation 8 in:
- % S. L. Jacques, "Optical properties of biological tissues: a
- % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
- % doi: 10.1088/0031-9155/58/11/r37
- muaEPI = Mfrac_all(Mind) * 51.9*(lam/500).^-3.5; %1/mm
- [~,iM_MC] = min(abs( MCavg.Mfracs - Mfrac_all(Mind) ));
- tmpLam = movmean(MCavg.lams, 10);
- tmpL = movmean(MCavg.l(iM_MC,:,1), 10);
- d = interp1(tmpLam, tmpL, lam, ...
- 'linear','extrap');
- figure(102); clf;
- yyaxis left;
- plot(lam, muaEPI);
- ylabel('$\mu_a$ (mm$^{-1}$)');
- yyaxis right;
- plot(lam, d);
- ylabel('$\langle \ell \rangle$ (mm)', ...
- 'Interpreter','latex');
- xlim(lam([1,end]));
- xlabel('Wavelength (nm)');
- title('Epidermis Properties');
- % -------------------------------------------------------------------------
- figure(103); clf;
- yyaxis left;
- plot(lam, muaTIS);
- ylabel('$\mu_a$ (mm$^{-1}$)');
- yyaxis right;
- plot(lam, L);
- ylabel('$\langle L \rangle$ (mm)');
- xlim(lam([1,end]));
- xlabel('Wavelength (nm)');
- title('Bulk Tissue Properties');
- %% ########## Plot -- SaO2 vs. RoR ########################################
- colsM=flipud(copper(length(Mfrac_all)));
- [~,fwhmInd] = min(abs(LEDfwhm_all-50));
- figure(200); clf;
- % -------------------------------------------------------------------------
- ax1 = subplot(2,2,1);
- slp_LD = NaN(size(Mfrac_all));
- for i = 1:length(Mfrac_all)
- plot(RoR_LD(:,i,fwhmInd), SaO2_all,'-',...
- 'Color',colsM(i,:));
- hold on;
- p = polyfit(RoR_LD(:,i,fwhmInd),SaO2_all,1);
- slp_LD(i) = p(1);
- end
- xlabel('Recovered Ratio-of-Ratios');
- ylabel('Modeled SaO$_2$');
- title('(a) LDs');
- % -------------------------------------------------------------------------
- ax2 = subplot(2,2,2);
- slp_LED = NaN(size(Mfrac_all));
- for i = 1:length(Mfrac_all)
- plot(RoR_LED(:,i,fwhmInd), SaO2_all,'-',...
- 'Color',colsM(i,:));
- hold on;
- p = polyfit(RoR_LED(:,i,fwhmInd),SaO2_all,1);
- slp_LED(i) = p(1);
- end
- xlabel('Recovered Ratio-of-Ratios');
- ylabel('Modeled SaO$_2$');
- title('(b) LEDs');
- linkaxes([ax1,ax2], 'xy');
- xlim([0.3,1.3]);
- % -------------------------------------------------------------------------
- ax3 = subplot(2,2,3);
- plot(Mfrac_all,slp_LD, '-k'); hold on;
- for i = 1:length(Mfrac_all)
- plot(Mfrac_all(i),slp_LD(i), 'o', 'Color',colsM(i,:));
- end
- xlabel('Melanin Volume Fraction');
- ylabel('Slope of (a)');
- title('(c) LDs');
- % -------------------------------------------------------------------------
- ax4 = subplot(2,2,4);
- plot(Mfrac_all,slp_LED, '-k'); hold on;
- for i = 1:length(Mfrac_all)
- plot(Mfrac_all(i),slp_LED(i), 'o', 'Color',colsM(i,:));
- end
- xlabel('Melanin Volume Fraction');
- ylabel('Slope of (b)');
- title('(d) LEDs');
- linkaxes([ax3,ax4], 'xy');
- ylim([-0.38,-0.3]);
- %% ########## Plot -- Application of weighted extinction coefficients #####
- colsM = flipud(copper(length(Mfrac_all)));
- [~,fwhmInd] = min(abs(LEDfwhm_all-50));
- figure(300); clf;
- % -------------------------------------------------------------------------
- ax1 = subplot(2,2,1);
- for i = 1:length(Mfrac_all)
- plot(SaO2_all, sat_LD_rec(:,i,fwhmInd)-SaO2_all.', '-', ...
- 'Color',colsM(i,:)); hold on;
- end
- xlabel('Modeled SaO$_2$');
- ylabel('SaO$_{2,recovered}$ $-$ SaO$_{2,modeled}$');
- title('(a) LDs with Assumed $\epsilon$s');
- % -------------------------------------------------------------------------
- ax2 = subplot(2,2,2);
- for i = 1:length(Mfrac_all)
- plot(SaO2_all, sat_LED_rec(:,i,fwhmInd)-SaO2_all.', '-', ...
- 'Color',colsM(i,:)); hold on;
- end
- xlabel('Modeled SaO$_2$');
- ylabel('SaO$_{2,recovered}$ $-$ SaO$_{2,modeled}$');
- title('(b) LEDs with Assumed $\epsilon$s');
- % -------------------------------------------------------------------------
- subplot(2,2,3);
- cb = colorbar;
- cb.Limits = Mfrac_all([1,end]);
- cb.Ticks = round(Mfrac_all,2);
- cb.Label.String = 'Melanin Volume Fraction';
- cb.Position = cb.Position + [-0.1, 0, 0.01, 0];
- clim(Mfrac_all([1,end]));
- colormap(colsM);
- axis off;
- % -------------------------------------------------------------------------
- ax4 = subplot(2,2,4);
- for i = 1:length(Mfrac_all)
- plot(SaO2_all, satw_LED_rec(:,i,fwhmInd)-SaO2_all.', '-', ...
- 'Color',colsM(i,:)); hold on;
- end
- xlabel('Modeled SaO$_2$');
- ylabel('SaO$_{2,recovered}$ $-$ SaO$_{2,modeled}$');
- title('(c) LEDs with Weighted $\epsilon$s');
- linkaxes([ax1,ax2,ax4], 'xy');
- %% ########## Plot -- Dependance on LED FWHM ##############################
- colsM = flipud(copper(length(Mfrac_all)));
- figure(400); clf;
- % -------------------------------------------------------------------------
- ax1 = subplot(1,2,1);
- for i = 1:length(Mfrac_all)
- plot([0,LEDfwhm_all], ...
- [squeeze(rms(sat_LD_rec(:,i,1) - SaO2_all.'));...
- squeeze(rms(sat_LED_rec(:,i,:) - SaO2_all.'))], '-', ...
- 'Color',colsM(i,:)); hold on;
- end
- xlabel('Source FWHM (nm)');
- ylabel('SaO$_2$ RMS Error');
- title('(a) Assumed $\epsilon$s');
- % -------------------------------------------------------------------------
- ax2 = subplot(1,2,2);
- for i = 1:length(Mfrac_all)
- plot([0,LEDfwhm_all], ...
- [squeeze(rms(sat_LD_rec(:,i,1) - SaO2_all.'));...
- squeeze(rms(satw_LED_rec(:,i,:) - SaO2_all.'))], '-', ...
- 'Color',colsM(i,:)); hold on;
- end
- xlabel('Source FWHM (nm)');
- ylabel('SaO$_2$ RMS Error');
- title('(b) Weighted $\epsilon$s');
- pos = get(gca,'Position');
- cb = colorbar;
- cb.Limits = Mfrac_all([1,end]);
- cb.Ticks = round(Mfrac_all,2);
- cb.Label.String = 'Melanin Volume Fraction';
- clim(Mfrac_all([1,end]));
- colormap(colsM);
- set(gca,'Position',pos);
- linkaxes([ax1,ax2],'xy');
- %% ########################################################################
- %% ########## Functions ###################################################
- %% ########################################################################
- % =============== LED Spectra =============================================
- function [P0_LED] = LEDspec_func(lam, lamPK, lamFWHM)
- % Generate Gaussian and normalize
- P0_LED = normpdf(lam, ...
- lamPK, lamFWHM/(2*sqrt(2*log(2))));
- P0_LED = P0_LED/max(P0_LED);
- end
- % =============== Tissue Optical Properties ===============================
- function [muspTIS, muaTIS, nTIS] = tissueOptProps_func(lam, NVA)
- % Tissue optical properties based on:
- % S. L. Jacques, "Optical properties of biological tissues: a
- % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
- % doi: 10.1088/0031-9155/58/11/r37
- % By default use relative tissue volumes from model in:
- % G. Blaney, J. Frias, F. Tavakoli, A. Sassaroli, and S. Fantini,
- % "Dual-ratio approach to pulse oximetry and the effect of skin tone,"
- % JBO, vol. 29, no. S3, p. S33311, Oct. 2024,
- % doi: 10.1117/1.JBO.29.S3.S33311
- % Thus V_tisTyp/V_tot,noEpi are:
- % Bone = 0.119
- % Muscle = 0.457
- % Fat = 0.228
- % Dermis = 0.196
- arguments
- lam (:,1) double; %nm
- NVA.T (1,1) double = ...
- 69.8*0.119 + 117*0.457 + 12.5*0.228 + 4.70*0.196; %uM
- NVA.S (1,1) double = ...
- 0.875*0.119 + 0.641*0.457 + 0.760*0.228 + 0.390*0.196;
- NVA.W (1,1) double = ...
- 0.318*0.119 + 0.795*0.457 + 0.110*0.228 + 0.650*0.196;
- NVA.L (1,1) double = ...
- 0.00*0.119 + 0.00*0.457 + 0.69*0.228 + 0.00*0.196;
- NVA.ap (1,1) double = ...
- 15.3*0.119 + 13.0*0.457 + 34.2*0.228 + 43.6*0.196; %1/cm
- NVA.fray (1,1) double = ...
- 0.022*0.119 + 0.000*0.457 + 0.260*0.228 + 0.410*0.196;
- NVA.bMie (1,1) double = ...
- 0.326*0.119 + 0.926*0.457 + 0.567*0.228 + 0.562*0.196;
- end
- %% musp
- ap = NVA.ap; % 1/cm
- fRay = NVA.fray;
- bMie = NVA.bMie;
- % Combination of Rayleigh and Mie scattering
- muspTIS = ap*0.1*(fRay*(lam/500).^-4 ...
- + (1-fRay)*(lam/500).^-bMie); %1/mm
- %% mua
- T = NVA.T; % uM
- S = NVA.S;
- W = NVA.W;
- L = NVA.L;
- % Beer's law
- E_ODWL = makeE('ODWL', lam);
- muaTIS = E_ODWL * [T*S; T*(1-S); W; L];
- %% n
- % https://www.engineersedge.com/physics/refraction_for_water__15690.htm
- % at 40 deg C
- n_waterRef=[...
- 226.50, 361.05, 404.41, 589.00, 632.80, 1013.98;
- 1.39046, 1.34540, 1.34065, 1.33095, 1.32972, 1.32296].';
- n_water=interp1(n_waterRef(:, 1), n_waterRef(:, 2), lam, ...
- 'linear', 'extrap');
- % Equation 3 in:
- % S. L. Jacques, "Optical properties of biological tissues: a
- % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
- % doi: 10.1088/0031-9155/58/11/r37
- n_dry = 1.514;
- nTIS = n_dry - (n_dry - n_water) * W;
- end
- % =============== Transmittance Green's Function ==========================
- function T = Tslab(rho, s, optProp, m_max)
- % Transmitance for a slab with extrapolated boundary
- % Equation 4.35 in:
- % F. Martelli, S. Del Bianco, A. Ismaelli, and G. Zaccanti, Light
- % Propagation through Biological Tissue and Other Diffusive Media.
- % 1000 20th Street, Bellingham, WA 98227-0010 USA: SPIE, 2010.
- % doi: 10.1117/3.824746
- arguments (Input)
- rho (1,1) double; %mm -- Source detector distance
- s (1,1) double; %mm -- Slab thickness
- optProp struct = [];
- m_max (1,1) double = 100;
- end
- arguments (Output)
- T (1,1) double; %1/mm^2 -- Transmittance Green's function
- end
- % Set default optical properties if input not given
- if isempty(optProp)
- clear optProp;
- optProp.nin=1.4;
- optProp.nout=1;
- optProp.musp=1.1; %1/mm
- optProp.mua=0.011; %1/mm
- warning('Default optical properties used');
- end
- mua = optProp.mua; %1/mm
- D = 1/(3*optProp.musp); %mm
- zs = 1/optProp.musp; %mm
- A = n2A(optProp.nin,optProp.nout);
- ze = 2*A*D; %mm
- m = (-m_max:m_max).';
- z1m = (1-2*m)*s - 4*m*ze - zs; %mm
- z2m = (1-2*m)*s - (4*m-2)*ze + zs; %mm
- T = (1/(4*pi)) * sum( ...
- z1m.*(rho^2+z1m.^2).^(-3/2) .* ...
- (1+(mua*(rho^2+z1m.^2)/D).^(1/2)) .* ...
- exp(-(mua*(rho^2+z1m.^2)/D).^(1/2)) - ...
- z2m.*(rho^2+z2m.^2).^(-3/2) .* ...
- (1+(mua*(rho^2+z2m.^2)/D).^(1/2)) .* ...
- exp(-(mua*(rho^2+z2m.^2)/D).^(1/2)) ...
- ); %1/mm^2
- end
- % =============== Reflection Parameter ====================================
- function A = n2A(nin, nout)
- % Based on:
- % R. Aronson, "Boundary conditions for diffusion of light," JOSA A,
- % vol. 12, no. 11, pp. 2532–2539, Nov. 1995, doi: 10/dff63n.
- % A = n2A(nin,nout)
- % Inputs:
- % nin - Index of refraction inside medium
- % nout - Index of refraction outside medium
- % Output:
- % A - Index of refraction mismatch parameter
- if nargin==0
- dan12=1.4;
- else
- dan12=nin/nout;
- end
- if dan12>1
- A=504.332889-2641.00214*dan12+...
- 5923.699064*dan12.^2-7376.355814*dan12^3+...
- 5507.53041*dan12^4-2463.357945*dan12^5+...
- 610.956547*dan12^6-64.8047*dan12^7;
- elseif dan12<1
- A=3.084635-6.531194*dan12+...
- 8.357854*dan12^2-5.082751*dan12^3+1.171382*dan12^4;
- else
- A=1;
- end
- end
- % =============== Extinction Coefficients ===============
- function E = makeE(chroms, lambda)
- % E = makeE(chroms, lambda)
- % Giles Blaney Spring 2021
- %
- % Inputs: - chroms: String of chromophores to include in E.
- % Available chromophores:
- % - O: Oxyhemoglobin
- % - D: Deoxyhemoglobin
- % - W: Water
- % - L: Lipid
- % (Default: 'OD')
- % Spaces are ignored.
- % - lambda: Vectors of wavelengths (nm).
- % (Default: [830, 690])
- %
- % Output: - E: Extinction coefficient matrix.
- % Units: 1/(mm uM) for O, D, CCOo, and CCOr
- % 1/mm for W, L, and C
- % size(E)=[length(lambda), length(chroms)];
- % Defined as mua=E*C
- % Order of C is defined by order in chroms input
- % Relevant references in .mat files for each chromophore
- if nargin<=0
- chroms='OD';
- end
- if nargin<=1
- lambda=[830, 690]; %nm
- end
- if size(lambda, 1)==1
- lambda=lambda';
- end
- chroms=chroms(~isspace(chroms));
- E=[];
- while ~isempty(chroms)
- switch chroms(1)
- case 'O' %Oxy
- blood=load('Bext.mat');
- Oext=interp1(blood.Blambda, blood.Oext, lambda,...
- 'linear', 'extrap');
- Oext(Oext<0)=0;
- E=[E, Oext];
- case 'D' %Deoxy
- blood=load('Bext.mat');
- Dext=interp1(blood.Blambda, blood.Dext, lambda,...
- 'linear', 'extrap');
- Dext(Dext<0)=0;
- E=[E, Dext];
- case 'W' %Water
- water=load('Wext.mat');
- Wext=interp1(water.Wlambda, water.Wmua, lambda,...
- 'linear', 'extrap');
- Wext(Wext<0)=0;
- E=[E, Wext];
- case 'L' %Lipid
- lipid=load('Lext.mat');
- Lext=interp1(lipid.Llambda, lipid.Lmua, lambda,...
- 'linear', 'extrap');
- Lext(Lext<0)=0;
- E=[E, Lext];
- otherwise
- warning(['Unknown chromophore' chroms(1) ', ignored']);
- end
- chroms(1)=[];
- end
- end
LEDspecColor_forPUB.m at commit 24e6c13, no license · at the source
Overview
Abstract
Significance: Functional near-infrared spectroscopy (fNIRS) is impacted by signal contamination from superficial hemodynamics. It is important to develop methods that account for such contamination and provide accurate measurements of cerebral hemodynamics.
Aim: We aim to investigate whether simulated data with two- or three-layer tissue models are able to reproduce in vivo data collected with dual-slope (DS) frequency-domain (FD) near-infrared spectroscopy (NIRS) on human subjects during brain activation.
Approach: We performed Monte Carlo simulations to generate DS FD-NIRS data from two- and three-layer media with a range of layer thicknesses and optical properties. We collected in vivo data with DS FD-NIRS (source-detector distances: 25 and 37 mm, wavelengths: 690 and 830 nm, and modulation frequency: 140 MHz) over the occipital lobe of human subjects during visual stimulation. Simulated and in vivo data were analyzed with diffusion theory for a homogeneous medium, and results were compared for each DS FD-NIRS data type.
Results: We found that the main qualitative features of in vivo data could be reproduced by simulated data from a three-layer medium, with a second layer (representing the cerebrospinal fluid in the subarachnoid space) that is less absorbing and less scattering than the other two layers, and with a top layer thickness that represents the combined scalp and skull thickness.
Conclusions: A three-layer model is a viable improvement over a homogeneous model to analyze DS FD-NIRS data (or any other fNIRS data) to generate more accurate measurements of cerebral hemodynamic changes without a need for large datasets for tomographic reconstructions.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 10 matches between paragraphs and lines of code.
doit-lab/doit-public
24e6c13b4eb47ca4ae5188eabad86c7bbdb4c059, 9 July 2026Availability: 2 checks, the latest on 6 November 2026: the link answers
- 6 November 2026: the link answers
- 30 September 2026: the link answers
199 files
- BroadbandAbsorptionSpect
roscopy/ , MATLAB, 50 linesexampleLookRawData.m - CHS/
time-domain CHS/ , MATLAB, 112 lines, 1 matchExample.m - CHS/
time-domain CHS/ , MATLAB, 75 linesInverse_TD.m - CHS/
time-domain CHS/ , MATLAB, 20 linesLPfilt2.m - CHS/
time-domain CHS/ , MATLAB, 77 linescbf_cmro2_dyn.m - CHS/
time-domain CHS/ , MATLAB, 98 linesforward_TD.m - CoherenceThreshold/
genWAVthresh.m , MATLAB, 176 lines - Dissertations/
GilesBlaney2022/ , MATLAB, 120 linescode/ DSI2muaEB_iterRecov.m - Dissertations/
GilesBlaney2022/ , MATLAB, 158 linescode/ DSR2muamuspEB_iterRecov. m - Dissertations/
GilesBlaney2022/ , MATLAB, 52 linescode/ GammaDelta.m - Dissertations/
GilesBlaney2022/ , MATLAB, 54 linescode/ complexFluence.m - Dissertations/
GilesBlaney2022/ , MATLAB, 35 linescode/ complexPartPathLen.m - Dissertations/
GilesBlaney2022/ , MATLAB, 57 linescode/ complexReflectance.m - Dissertations/
GilesBlaney2022/ , MATLAB, 58 linescode/ complexTotPathLen.m - Dissertations/
GilesBlaney2022/ , MATLAB, 112 linescode/ findDSsets.m - Dissertations/
GilesBlaney2022/ , MATLAB, 37 linescode/ findSDsets.m - Dissertations/
GilesBlaney2022/ , MATLAB, 57 linescode/ findSSsets.m - Dissertations/
GilesBlaney2022/ , MATLAB, 207 linescode/ genWAVthresh.m - Dissertations/
GilesBlaney2022/ , MATLAB, 516 linescode/ makeSenMaps.m - Dissertations/
GilesBlaney2022/ , MATLAB, 28 linescode/ n2A.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 204 lines221101Data/ NEUprocessed/ preProc.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 147 lines, 1 match221101Data/ NEUprocessed/ two_probe__4_pmt_preProc .m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 115 linesA1_MCXLAB_Homo_sen.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 113 linesA2_MCXLAB_Homo_sen_SD0.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 85 linesB1_pullPckNoi.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 45 linesB2_calcEta.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 598 linesC1_makeMap_simSig_SNRvZ. m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 162 linesD1_realVsSimSig.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 176 linesD2_SNRvsNonCanNoi.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 1,125 linesdeps/ findpeaks.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 49 linesdeps/ plot_avg.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 8 linesdeps/ setALLdefault2LaTex.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 239 linesdeps/ subaxis.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 4 linesdeps/ yell.m - DualRatio_FluorescenceFl
owCytometry/ , MATLAB, 15 linesrun_all.m - DualSlope/
DSdmua.m , MATLAB, 251 lines, 1 match - DualSlope/
example.m , MATLAB, 116 lines - DualSlope/
mua2OandD.m , MATLAB, 38 lines - DualSlopeArrayDesign/
ArrangementEvaluation/ , MATLAB, 51 linesGammaDelta.m - DualSlopeArrayDesign/
ArrangementEvaluation/ , MATLAB, 98 linesexample.m - DualSlopeArrayDesign/
DualSlopeSetDiscovery/ , MATLAB, 57 linesexample.m - DualSlopeArrayDesign/
DualSlopeSetDiscovery/ , MATLAB, 96 linesfindDSsets.m - DualSlopeArrayDesign/
DualSlopeSetDiscovery/ , MATLAB, 35 linesfindSDsets.m - DualSlopeArrayDesign/
DualSlopeSetDiscovery/ , MATLAB, 58 linesfindSSsets.m - DualSlopeArrayDesign/
PositionRefinement/ , MATLAB, 215 linesexample.m - DualSlopeImaging/
A1_look.m , MATLAB, 711 lines - DualSlopeImaging/
A2_look_blood.m , MATLAB, 271 lines - DualSlopeImaging/
A3_look_fold.m , MATLAB, 453 lines - DualSlopeImaging/
B1_makeSen.m , MATLAB, 542 lines - DualSlopeImaging/
B2_doRecon.m , MATLAB, 136 lines - DualSlopeImaging/
B3_ttest.m , MATLAB, 440 lines - DualSlopeImaging/
deps/ , MATLAB, 101 linesDPF_DSF_calc.m - DualSlopeImaging/
deps/ , MATLAB, 180 linesDSR2muamuspEB_iterRecov. m - DualSlopeImaging/
deps/ , MATLAB, 79 linescirc_confmean.m - DualSlopeImaging/
deps/ , MATLAB, 60 linescirc_mean.m - DualSlopeImaging/
deps/ , MATLAB, 62 linescirc_r.m - DualSlopeImaging/
deps/ , MATLAB, 54 linescomplexFluence.m - DualSlopeImaging/
deps/ , MATLAB, 35 linescomplexPartPathLen.m - DualSlopeImaging/
deps/ , MATLAB, 57 linescomplexReflectance.m - DualSlopeImaging/
deps/ , MATLAB, 63 linescomplexTotPathLen.m - DualSlopeImaging/
deps/ , MATLAB, 79 linesfoldingAvgASync.m - DualSlopeImaging/
deps/ , MATLAB, 130 linesload_Imagent.m - DualSlopeImaging/
deps/ , MATLAB, 97 linesmakeE.m - DualSlopeImaging/
deps/ , MATLAB, 27 linesn2A.m - DualSlopeImaging/
deps/ , MATLAB, 61 linesnumSubplots.m - DualSlopeImaging/
deps/ , MATLAB, 28 linesrunall.m - DualSlopeImaging/
deps/ , MATLAB, 183 linessaveFig.m - DualSlopeImaging/
deps/ , MATLAB, 6 linestimeAxis.m - DualSlopeImaging/
makeArrayTable.m , MATLAB, 91 lines - DualSlopeImaging/
makeExampleActImage_forN , MATLAB, 118 linesEUROW.m - DualSlopeImaging/
makeExampleTrace_forNEUR , MATLAB, 266 linesOW.m - DualSlopeImaging/
makeMapOfTraces_forNEURO , MATLAB, 269 linesW.m - DualSlopeImaging/
runall.m , MATLAB, 24 lines - OpticalPropertiesInCuvet
te/ , MATLAB, 143 linesTcuv.m - OpticalPropertiesInCuvet
te/ , MATLAB, 215 linescostSpaceKappa.m - OpticalPropertiesInCuvet
te/ , MATLAB, 41 linescuvTcost.m - OpticalPropertiesInCuvet
te/ , MATLAB, 138 linesdiffGrid.m - OpticalPropertiesInCuvet
te/ , MATLAB, 179 linesexampleAnalytT.m - OpticalPropertiesInCuvet
te/ , MATLAB, 169 linesexampleCostSpaces.m - OpticalPropertiesInCuvet
te/ , MATLAB, 148 linesexampleErrors.m - OpticalPropertiesInCuvet
te/ , MATLAB, 171 linesexampleFit.m - OpticalPropertiesInCuvet
te/ , MATLAB, 97 linesexampleTcal.m - OpticalPropertiesInCuvet
te/ , MATLAB, 200 linesfigOfGeo.m - OpticalPropertiesInCuvet
te/ , MATLAB, 204 lineswrongIndex_2no.m - PulseOxSpectralLinewidth
/ , MATLAB, 778 lines, 4 matchesLEDspecColor_forPUB.m - SelfCalibratingPositionE
rrors/ , MATLAB, 350 linesSIMS_optodePosErr_linesZ eroChange.m - SelfCalibratingPositionE
rrors/ , MATLAB, 1,638 linesSIMSabs_optodePosErr.m - SelfCalibratingPositionE
rrors/ , MATLAB, 1,175 linesSIMSrel_optodePosErr.m - SelfCalibratingPositionE
rrors/ , MATLAB, 204 linesdeps/ DSR2muamuspEB_iterRecov. m - SelfCalibratingPositionE
rrors/ , MATLAB, 127 linesdeps/ DSpos2err.m - SelfCalibratingPositionE
rrors/ , MATLAB, 69 linesdeps/ complexReflectance.m - SelfCalibratingPositionE
rrors/ , MATLAB, 71 linesdeps/ complexTotPathLen.m - SelfCalibratingPositionE
rrors/ , MATLAB, 27 linesdeps/ n2A.m - SelfCalibratingPositionE
rrors/ , MATLAB, 229 linesdeps/ posOrbitRMSE.m - SelfCalibratingPositionE
rrors/ , MATLAB, 439 linesdeps/ saveFig.m - SelfCalibratingPositionE
rrors/ , MATLAB, 239 linesdeps/ subaxis.m - SensitivityCompendium/
deps/ , MATLAB, 67 linescomplexFluence.m - SensitivityCompendium/
deps/ , MATLAB, 53 linescomplexPartPathLen.m - SensitivityCompendium/
deps/ , MATLAB, 69 linescomplexReflectance.m - SensitivityCompendium/
deps/ , MATLAB, 71 linescomplexTotPathLen.m - SensitivityCompendium/
deps/ , MATLAB, 28 linescontinuousPartPathLen.m - SensitivityCompendium/
deps/ , MATLAB, 34 linescontinuousPathLen_MCadjo int.m - SensitivityCompendium/
deps/ , MATLAB, 24 linescontinuousReflectance.m - SensitivityCompendium/
deps/ , MATLAB, 25 linescontinuousTotPathLen.m - SensitivityCompendium/
deps/ , MATLAB, 19 linesmakeCL.m - SensitivityCompendium/
deps/ , MATLAB, 427 linesmakeS.m - SensitivityCompendium/
deps/ , MATLAB, 181 linesmyMCXLAB_adjoint.m - SensitivityCompendium/
deps/ , MATLAB, 27 linesn2A.m - SensitivityCompendium/
deps/ , MATLAB, 32 linessliceS.m - SensitivityCompendium/
deps/ , MATLAB, 14 linesstruct2pairs.m - SensitivityCompendium/
deps/ , MATLAB, 71 linestemporalFluence.m - SensitivityCompendium/
deps/ , MATLAB, 143 linestemporalGatePartPathLen. m - SensitivityCompendium/
deps/ , MATLAB, 53 linestemporalGatePathLen_MCad joint.m - SensitivityCompendium/
deps/ , MATLAB, 68 linestemporalGateTotPathLen.m - SensitivityCompendium/
deps/ , MATLAB, 122 linestemporalKthMomPartPathLe n.m - SensitivityCompendium/
deps/ , MATLAB, 52 linestemporalKthMomTotPathLen .m - SensitivityCompendium/
deps/ , MATLAB, 89 linestemporalKthMoment.m - SensitivityCompendium/
deps/ , MATLAB, 183 linestemporalReflectance.m - SensitivityCompendium/
deps/ , MATLAB, 43 linestemporalVar.m - SensitivityCompendium/
deps/ , MATLAB, 65 linestemporalVarPartPathLen.m - SensitivityCompendium/
deps/ , MATLAB, 47 linestemporalVarTotPathLen.m - SensitivityCompendium/
example1_DT.m , MATLAB, 87 lines - SensitivityCompendium/
example2_MC.m , MATLAB, 72 lines - SensitivityCompendium/
makeFigs/ , MATLAB, 97 linesdrho_CW_DS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 96 linesdrho_CW_SS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 97 linesdrho_FD_DS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 96 linesdrho_FD_SS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 98 linesdrho_TD_DS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 113 linesdrho_TD_DS_V.m - SensitivityCompendium/
makeFigs/ , MATLAB, 97 linesdrho_TD_SS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 112 linesdrho_TD_SS_V.m - SensitivityCompendium/
makeFigs/ , MATLAB, 97 linesdt_TD_DS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 95 linesdt_TD_SD_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 95 linesdt_TD_SD_GI_rho0_MC.m - SensitivityCompendium/
makeFigs/ , MATLAB, 96 linesdt_TD_SS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 100 linesdtg_TD_SD_DGI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 100 linesdtg_TD_SD_DGI_rho0_MC.m - SensitivityCompendium/
makeFigs/ , MATLAB, 95 linesfmod_FD_DS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 95 linesfmod_FD_DS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 94 linesfmod_FD_SD_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 93 linesfmod_FD_SD_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 94 linesfmod_FD_SS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 94 linesfmod_FD_SS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 82 linesmkFig3rd_CW_DS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 80 linesmkFig3rd_CW_SD_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 113 linesmkFig3rd_CW_SD_I_rho0_MC .m - SensitivityCompendium/
makeFigs/ , MATLAB, 81 linesmkFig3rd_CW_SS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 82 linesmkFig3rd_FD_DS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 82 linesmkFig3rd_FD_DS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 80 linesmkFig3rd_FD_SD_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 80 linesmkFig3rd_FD_SD_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 81 linesmkFig3rd_FD_SS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 74 linesmkFig3rd_FD_SS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 88 linesmkFig3rd_TD_DS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 88 linesmkFig3rd_TD_DS_T.m - SensitivityCompendium/
makeFigs/ , MATLAB, 88 linesmkFig3rd_TD_DS_V.m - SensitivityCompendium/
makeFigs/ , MATLAB, 86 linesmkFig3rd_TD_SD_DGI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 118 linesmkFig3rd_TD_SD_DGI_rho0_ MC.m - SensitivityCompendium/
makeFigs/ , MATLAB, 86 linesmkFig3rd_TD_SD_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 115 linesmkFig3rd_TD_SD_GI_rho0_M C.m - SensitivityCompendium/
makeFigs/ , MATLAB, 86 linesmkFig3rd_TD_SD_T.m - SensitivityCompendium/
makeFigs/ , MATLAB, 86 linesmkFig3rd_TD_SD_V.m - SensitivityCompendium/
makeFigs/ , MATLAB, 87 linesmkFig3rd_TD_SS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 87 linesmkFig3rd_TD_SS_T.m - SensitivityCompendium/
makeFigs/ , MATLAB, 87 linesmkFig3rd_TD_SS_V.m - SensitivityCompendium/
makeFigs/ , MATLAB, 99 linesmrho_CW_DS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 96 linesmrho_CW_SS_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 99 linesmrho_FD_DS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 96 linesmrho_FD_SS_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 100 linesmrho_TD_DS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 115 linesmrho_TD_DS_V.m - SensitivityCompendium/
makeFigs/ , MATLAB, 97 linesmrho_TD_SS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 112 linesmrho_TD_SS_V.m - SensitivityCompendium/
makeFigs/ , MATLAB, 97 linesmt_TD_DS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 95 linesmt_TD_SD_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 95 linesmt_TD_SD_GI_rho0_MC.m - SensitivityCompendium/
makeFigs/ , MATLAB, 96 linesmt_TD_SS_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 100 linesmtg_TD_SD_DGI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 101 linesmtg_TD_SD_DGI_rho0_MC.m - SensitivityCompendium/
makeFigs/ , MATLAB, 125 linesplotHelpers/ makeLatexFigure.m - SensitivityCompendium/
makeFigs/ , MATLAB, 125 linesplotHelpers/ makeLatexFigure_varSP.m - SensitivityCompendium/
makeFigs/ , MATLAB, 116 linesplotHelpers/ makeSatCols.m - SensitivityCompendium/
makeFigs/ , MATLAB, 225 linesplotHelpers/ plot3rdAngle.m - SensitivityCompendium/
makeFigs/ , MATLAB, 89 linesplotHelpers/ plot_varSP.m - SensitivityCompendium/
makeFigs/ , MATLAB, 208 linesplotHelpers/ saveFig_senCompen.m - SensitivityCompendium/
makeFigs/ , MATLAB, 239 linesplotHelpers/ subaxis.m - SensitivityCompendium/
makeFigs/ , MATLAB, 93 linesrho_CW_SD_I.m - SensitivityCompendium/
makeFigs/ , MATLAB, 93 linesrho_FD_SD_P.m - SensitivityCompendium/
makeFigs/ , MATLAB, 94 linesrho_TD_SD_DGI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 94 linesrho_TD_SD_GI.m - SensitivityCompendium/
makeFigs/ , MATLAB, 109 linesrho_TD_SD_V.m - TwoLayer/
Example.m , MATLAB, 65 lines - TwoLayer/
TwoLayerReflectance.m , MATLAB, 99 lines, 1 match - TwoLayer/
TwoLayer_InverseMarquard , MATLAB, 291 linest.m - TwoLayerSpectroscopy/
DSR2muamuspEB_iterRecov. , MATLAB, 180 linesm - TwoLayerSpectroscopy/
R_2L_withPreCom.m , MATLAB, 104 lines, 2 matches - TwoLayerSpectroscopy/
example.m , MATLAB, 35 lines - TwoLayerSpectroscopy/
get_R2L_preCom.m , MATLAB, 40 lines - TwoLayerSpectroscopy/
twoLayEffHomoOptProp.m , MATLAB, 51 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 199 scripts, each with its path and the digest of its content;
- 10 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Code and Data Availability
Data and code will be made available at the following repository: https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 30 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 6 keywords, 1 funder, 40 references.
Cite
This paper
Frias, J., Blaney, G., Sassaroli, A., & Fantini, S. (2026). Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models. Biophotonics discovery, 3(2), 025003. https://
BibTeX
@article{frias2026functi
author = {Frias, Jodee and Blaney, Giles and Sassaroli, Angelo and Fantini, Sergio},
title = {{Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models}},
journal = {Biophotonics discovery},
year = {2026},
month = mar,
volume = {3},
number = {2},
pages = {025003},
publisher = {Society of Photo-Optical Instrumentation Engineers},
issn = {3005-4745},
doi = {10.1117/
url = {https://
pmid = {42038099},
pmcid = {PMC13107251}
}
RIS
TY - JOUR
AU - Frias, Jodee
AU - Blaney, Giles
AU - Sassaroli, Angelo
AU - Fantini, Sergio
TI - Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models
T2 - Biophotonics discovery
J2 - Biophotonics Discov
PY - 2026
DA - 2026/
VL - 3
IS - 2
SP - 025003
SN - 3005-4745
PB - Society of Photo-Optical Instrumentation Engineers
DO - 10.1117/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1117/
"type": "article-journal",
"title": "Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models",
"container-title": "Biophotonics discovery",
"author": [
{
"family": "Frias",
"given": "Jodee"
},
{
"family": "Blaney",
"given": "Giles"
},
{
"family": "Sassaroli",
"given": "Angelo"
},
{
"family": "Fantini",
"given": "Sergio"
}
],
"container-title-short":
"volume": "3",
"issue": "2",
"page": "025003",
"DOI": "10.1117/
"PMID": "42038099",
"PMCID": "PMC13107251",
"ISSN": "3005-4745",
"publisher": "Society of Photo-Optical Instrumentation Engineers",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
24
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1117/1.nph.10.1.013508 [code]
- Dual-slope imaging of cerebral hemodynamics with frequency-domain near-infrared spectroscopy.Journal: NeurophotonicsIn common: Wavelet Toolbox, CircStat, Optimization Toolbox, 3 other tools, fNIRS, 12 references, 2 authors
- [2] doi:10.1117/1.nph.9.s2.s24001 [code]
- Optical imaging and spectroscopy for the study of the human brain: status report.Journal: NeurophotonicsIn common: Signal Processing Toolbox, fNIRS, 10 references, author Giles Blaney
- [3] doi:10.1117/1.nph.9.3.035003 [code]
- Correction of global physiology in resting-state functional near-infrared spectroscopy.Journal: NeurophotonicsIn common: Wavelet Toolbox, CircStat, Optimization Toolbox, 3 other tools, fNIRS, 3 references
- [4] doi:10.1117/1.nph.10.2.025007
- Short-separation regression incorporated diffuse optical tomography image reconstruction modeling for high-density functional near-infrared spectroscopy.Journal: NeurophotonicsIn common: fNIRS, 7 references
- [5] doi:10.1117/1.nph.12.4.045003 [code]
- Anisotropic light propagation in human brain white matter.Journal: NeurophotonicsIn common: computational, 6 references
- [6] doi:10.1371/journal.pone.0285581 [code]
- Acute effects of nitrate and breakfast on working memory, cerebral blood flow, arterial stiffness, and psychological factors in adolescents: Study protocol for a randomised crossover trial.Journal: PloS oneIn common: Wavelet Toolbox, CircStat, Optimization Toolbox, 3 other tools, 1 reference
- [7] doi:10.1162/imag.a.1289 [code]
- Measurement prediction and power analysis for fNIRS and DOT.Journal: Imaging neuroscience (Cambridge, Mass.)In common: Optimization Toolbox, Signal Processing Toolbox, Statistics and Machine Learning Toolbox, fNIRS, 4 references
- [8] doi:10.1117/1.nph.12.1.015009 [code]
- Revisiting equivalent optical properties for cerebrospinal fluid to improve diffusion-based modeling accuracy in the brain.Journal: NeurophotonicsIn common: fNIRS, computational, 5 references
- [9] doi:10.3389/fnhum.2024.1329086 [code]
- fNIRS dataset during complex scene analysis.Journal: Frontiers in human neuroscienceIn common: Wavelet Toolbox, Optimization Toolbox, Parallel Computing Toolbox, 2 other tools, fNIRS, 1 reference
- [10] doi:10.1117/1.jbo.29.2.025004
- Retrieval of chromophore concentration changes in a digital human head model using analytical mean partial pathlengths of photons.Journal: Journal of biomedical opticsIn common: fNIRS, computational, 5 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 199 scripts, and 10 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:4f8434204530016b…
Add the badge to the code's README
If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.
Markdown
<!-- oscr-badge:start -->
[](https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003)
<!-- oscr-badge:end -->reStructuredText
.. oscr-badge:start
.. image:: https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003.svg
:target: https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003
:alt: OSCR
.. oscr-badge:endHTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003"><img src="https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".
If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge page.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.
Report a mismatch between the code and the paper · Report a code error (signed in)
Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.
Report a reproduction failure (signed in)
Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
