export const MODEL_VERSION='1.0.0',DEFAULTS=Object.freeze({waveform:'sine',amplitude:.5,frequency:1000,voltsPerDiv:.2,msPerDiv:.2,y1:-2.5,y2:2.5,x1:1,x2:6,phase:45,ratio:1}); export function validateParameters(p){if(!['sine','triangle','square'].includes(p.waveform)||![.25,.5,1,1.5,2].includes(p.ratio))throw new RangeError('波形或频率比');for(const[k,a,b]of[['amplitude',.1,2],['frequency',250,2000],['voltsPerDiv',.05,1],['msPerDiv',.05,1],['y1',-4,4],['y2',-4,4],['x1',0,10],['x2',0,10],['phase',0,360]])if(!Number.isFinite(p[k])||p[k]b)throw new RangeError(k);return{...p};} export function wave(kind,cycles){const angle=2*Math.PI*cycles;return kind==='sine'?Math.sin(angle):kind==='triangle'?2/Math.PI*Math.asin(Math.sin(angle)):Math.sin(angle)>=0?1:-1;} export function response(p){validateParameters(p);const factor=p.waveform==='sine'?Math.sqrt(2):p.waveform==='triangle'?Math.sqrt(3):1,measuredVpp=Math.abs(p.y2-p.y1)*p.voltsPerDiv,measuredPeriodMs=Math.abs(p.x2-p.x1)*p.msPerDiv;return{waveform:p.waveform,measuredVpp,measuredPeriodMs,measuredFrequency:measuredPeriodMs>0?1000/measuredPeriodMs:null,measuredRMS:measuredVpp/(2*factor),trueRMS:p.amplitude/factor,clipped:p.amplitude/p.voltsPerDiv>4};} export function plots(p){return[{caption:'已知输入信号的一个周期',xLabel:'时间 t / ms',yLabel:'电压 u / V',curves:[{points:Array.from({length:1001},(_,i)=>[i/p.frequency,p.amplitude*wave(p.waveform,i/1000)])}]},{caption:'两正弦通道的李萨如图形',xLabel:'水平电压 ux / V',yLabel:'垂直电压 uy / V',curves:[{points:Array.from({length:2001},(_,i)=>{const t=.004*i/2000;return[p.amplitude*Math.sin(2*Math.PI*1000*p.ratio*t),p.amplitude*Math.sin(2*Math.PI*1000*t+p.phase*Math.PI/180)];})}]}];} export function analyzeRecords(rows,p){const s=rows.filter(r=>r.parameters.waveform===p.waveform&&r.parameters.frequency===p.frequency&&r.parameters.amplitude===p.amplitude);if(!s.length)return'将游标置于波峰波谷及同方向相邻周期点,记录格数换算结果。';const r=s.at(-1).readings;return(r.clipped?'当前信号超出垂直屏幕,请调整灵敏度。':'')+'已知输入频率 '+p.frequency+' Hz;游标测得 '+(r.measuredFrequency===null?'未定义(两游标重合)':r.measuredFrequency.toFixed(6)+' Hz')+',已知RMS '+r.trueRMS.toFixed(7)+' V。';}