import{fft2,frequency,intensity}from'./fft.mjs';export{fft2,frequency,intensity};export const MODEL_VERSION='1.0.0',EXPERIMENT_ID='course-04/holography',DEFAULTS=Object.freeze({wavelength_nm:632.8,recording_distance_mm:300,reconstruction_distance_mm:300,reference_amplitude:1,field_length_mm:4,grid_size:256,carrier_per_mm:10,sideband_radius_per_mm:3.5}); export function validateParameters(p){for(const[k,l,h]of[['wavelength_nm',500,700],['recording_distance_mm',100,500],['reconstruction_distance_mm',100,500],['reference_amplitude',.5,2]])if(!Number.isFinite(p[k])||p[k]h)throw new RangeError(`${k}须在${l}–${h}`);if(![128,256,512].includes(p.grid_size)||p.field_length_mm!==4||p.carrier_per_mm!==10||p.sideband_radius_per_mm!==3.5)throw new RangeError('网格128/256/512、L4mm、载频10mm⁻¹、边带3.5mm⁻¹');if(p.carrier_per_mm+p.sideband_radius_per_mm>=p.grid_size/(2*p.field_length_mm))throw new RangeError('载频边带超过Nyquist');return{...p};} export function objectField(p){validateParameters(p);const n=p.grid_size,re=new Float64Array(n*n),im=new Float64Array(n*n);for(let j=0;j500)throw new RangeError('传播距离绝对值不超过500mm');const spectrum=fft2(field),n=field.n,lambda=p.wavelength_nm*1e-6;for(let j=0;ja+b,0),outputEnergy=outputIntensity.reduce((a,b)=>a+b,0);let error=0;for(let k=0;kMath.min(a,b),Infinity),hologram_max:hologram.reduce((a,b)=>Math.max(a,b),0)}};}