import{fft1,fft2,frequency,intensity}from'./fft.mjs';export{fft1,fft2,frequency,intensity};export const MODEL_VERSION='1.0.0',EXPERIMENT_ID='course-04/abbe-imaging',DEFAULTS=Object.freeze({wavelength_nm:632.8,focal_length_mm:150,field_length_mm:4,cycles:16,pupil_radius_mm:.4,filter:'circle',grid_size:256});export const FILTERS=['open','circle','zero-only','horizontal-slit','vertical-slit','block-zero']; export function validateParameters(p){for(const[k,l,h]of[['wavelength_nm',500,700],['focal_length_mm',100,200],['cycles',8,32],['pupil_radius_mm',0,2]])if(!Number.isFinite(p[k])||p[k]h)throw new RangeError(`${k}须在${l}–${h}`);if(!Number.isInteger(p.cycles)||![128,256,512].includes(p.grid_size)||p.field_length_mm!==4||!FILTERS.includes(p.filter))throw new RangeError('物体须周期整格、L=4mm、FFT网格128/256/512,滤波方式有效');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;jnarrow?1:0;} export function analyze(p){validateParameters(p);const object=objectField(p),spectrum=fft2(object),filtered={n:object.n,re:Float64Array.from(spectrum.re),im:Float64Array.from(spectrum.im)},mask=new Uint8Array(object.n*object.n),n=object.n;for(let j=0;ja+b,0),outputEnergy=outputIntensity.reduce((a,b)=>a+b,0),max=outputIntensity.reduce((a,b)=>Math.max(a,b),0),min=outputIntensity.reduce((a,b)=>Math.min(a,b),Infinity);return{object,spectrum,mask,image,inputIntensity,outputIntensity,metrics:{transmitted_energy_fraction:outputEnergy/inputEnergy,visibility:(max-min)/(max+min||1),first_order_position_mm:p.wavelength_nm*1e-6*p.focal_length_mm*p.cycles/4,object_period_mm:4/p.cycles,output_intensity_min:min,output_intensity_max:max}};}