Skip to content
문서 섹션

API 변경 기록

공개 API의 변경 중 호출자가 알아챌 수 있는 것을 모두 최신순으로 기록합니다. 각 항목의 날짜는 여기에 공지한 날입니다. 기존 호출자에게 영향을 주는 변경은 늦어도 그 변경을 담은 릴리스와 함께 공지하며, 호환되지 않음으로 표시합니다. 아래 81개 항목 중 29개는 호환되지 않는 변경입니다.

  1. rf-link-budget은 atmosphericLoss를 생략하면 0.5 dB의 대기 손실을 적용합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    atmosphericLoss를 생략한 호출은 0 dB로 계산되었지만, 그 provenance.inputs에는 문서에 적힌 기본값 0.5 dB가 표시되었습니다. 이제는 계산기 페이지와 출처 정보에 적힌 대로 0.5 dB로 계산되므로, 그런 호출에서는 rxPower, linkMargin, maxRangeKm가 그 0.5 dB만큼 바뀝니다. 이 입력을 보내는 호출은 바뀌지 않습니다.

    모든 계산기의 다른 모든 입력도 같은 방식으로 확인했습니다. 생략하면 거부되거나(400, 과금 없음) 문서에 적힌 기본값으로 계산되거나 둘 중 하나입니다.

  2. GET /v1/usage가 일별 호출 수를 반환할 수 있습니다

    • GET /api/py/v1/usage

    ?days=N(1~90)을 전달하면 응답에 daily가 추가됩니다. 최근 N일(UTC) 각각에 대해 {date, calls} 항목이 하나씩, 오래된 순서로 오늘까지 나열됩니다. 각 날의 calls는 계정의 모든 키를 합친 값이며, 돌려받은 호출을 뺀 값입니다. 호출이 없는 날은 0입니다. 시간별 집계가 시작된 2026-09-24 이전의 날은 0입니다.

    days가 없으면 응답은 바뀌지 않습니다. 사용량 조회는 여전히 집계되지 않습니다.

  3. Touchstone 업로드의 포트 수는 파일 이름보다 행을 먼저 보고 판단합니다

    • rf_cascade
    • sparam_pipeline
    • impedance_match
    • eye_diagram

    파일의 값 개수로 여러 포트 수가 가능한 경우, 확장자보다 행이 먼저 결정합니다. .s2p라는 이름의 파일에 있는 1포트 점 3개는 2포트 점 1개가 아니라 1포트로 처리하며, 데이터와 맞지 않는 이름은 보고됩니다(rf_cascade에서는 port_count_mismatch). [Number of Ports] 키워드가 있으면 여전히 그것이 가장 먼저 결정합니다.

    아이 다이어그램은 확장자가 데이터보다 많은 포트 수를 나타내는 파일에서도 더 이상 실패하지 않습니다.

  4. 필터 몬테카를로는 작업량 예산 안에서 무료로 최대 1,000회, Pro와 API에서 최대 100,000회 시행을 실행합니다

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • POST /api/py/v1/jobs/estimate
    • GET /api/py/v1/jobs/types
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    monteCarloIterations의 상한은 무료 요금제에서 1,000(이전 500), Pro와 API에서 100,000(이전 10,000)입니다. 작업의 시간 상한은 180초(이전 120초)입니다.

    실행 비용은 시행 횟수에 시행당 래더 평가 횟수를 곱한 값이며, 평가 횟수는 부품과 passCriteria로 정해집니다. 실행 환경의 예산(유료 실행 환경 120초, 무료 60초)을 넘을 것으로 예측되는 실행은 제출할 때와 견적에서 모두, 과금 전에 errorKind: "too_large"로 거부됩니다. 세부 정보에는 monteCarloIterations가 표시되고 비용, 상한, 그리고 들어갈 수 있는 최대 시행 횟수가 allowed.max에 담깁니다. 부품 5개짜리 래더와 기준 3개라면 100,000회 시행이 들어가고, 부품 20개짜리 래더와 기준 8개라면 53,304회까지입니다.

    견적은 withinBudget, 종류가 ladderEvaluations인 budget, 그리고 trials와 ladderEvaluationsPerTrial로 된 work를 반환하며, 작업의 computeCost.work에도 같은 값이 기록됩니다.

  5. RF 캐스케이드의 단 목록을 제출할 때 확인합니다

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • rf_cascade

    형식이 잘못된 stages(JSON이 아님, 비어 있음, 객체가 아닌 단, 유한한 숫자가 아닌 값)는 과금 전에 단과 키를 밝히는 400으로 거부됩니다. 이전에는 받아들인 뒤 장애로 실패했습니다.

    단의 값에는 범위가 있습니다. gain_db은 ±1000 dB, nf_db은 0~1000 dB, iip3_dbm과 p1db_dbm은 ±1000 dBm이며, 각 단 뒤의 체인 이득은 ±1000 dB 이내여야 합니다. NaN, Infinity, true/false는 거부되며, 텍스트로 쓴 숫자는 여전히 읽습니다.

    알려진 키와 대소문자만 다른 단의 키(gain_dB, IIP3_dbm, Name)는 단과 올바른 키를 밝히며 거부됩니다. 이전에는 무시되어 그 단이 기본값으로 실행되었습니다. 단이 받지 않는 그 밖의 키(notes, part)는 unknown_stage_key 경고와 함께 무시됩니다.

    작업과 함께 업로드되지 않은 sparamFile을 가진 단은 입력한 이득으로 계산되지 않고 거부됩니다.

  6. 인터셉트가 없으면 99 dBm이 아니라 null입니다

    • POST /api/py/v1/jobs
    • rf_cascade

    수동 단의 IIP3, 그리고 어떤 단도 제한하지 않는 체인의 IIP3, OIP3, P1dB, SFDR은 null입니다(이전에는 99 dBm과 99 + 이득). 이 경우 몬테카를로 IIP3 백분위수와 히스토그램은 null이고 IIP3 수율은 100%입니다.

    수동 단이 더 이상 99 dBm 인터셉트를 더하지 않습니다. IIP3가 0 dBm인 증폭기 앞의 150 dB 패드는 이제 99가 아니라 150 dBm입니다.

  7. RF 캐스케이드: 파일에서 얻는 수동 단 잡음, 몬테카를로 부호, 정확한 인터셉트, 경고

    • rf_cascade

    이득을 파일에서 얻는 수동 단은 그 이득으로부터 잡음 지수를 구합니다.

    몬테카를로에서 수동 단의 잡음 지수가 손실에 따라 움직입니다. 부호가 반대였습니다.

    입력 IIP3와 P1dB는 아무리 낮아도 정확하게 계산됩니다(300 dB 증폭기 3단: −600 dBm과 −610 dBm, 이전에는 −270 dBm으로 표시). −270 dBm 하한은 어떤 점 뒤의 합이 양의 유한한 숫자가 아닌 경우를 막는 보호 장치로만 남아 있으며, 단의 범위 때문에 그런 상태에는 이르지 않으므로 P1dB 때문에 작업이 실패하는 일은 더 이상 없습니다.

    경고 unknown_stage_type, unknown_stage_key, file_not_uploaded가 추가되었습니다.

  8. 임피던스 정합은 로그 스케일로 값을 맞추고 전력파 반사를 스윕합니다

    • POST /api/py/v1/jobs
    • impedance_match

    E12, E24, E96 부품은 계열의 간격에 맞춰 로그 스케일에서 가장 가까운 표준값이 됩니다. 정확히 중간이면 작은 쪽입니다. 2.099 nH는 이제 2.0 nH가 아니라 2.2 nH입니다. 두 규칙이 다른 경우 부품, 반사 손실, auto가 고르는 분기가 바뀔 수 있습니다.

    |S11|, 스미스 차트 궤적, 최악의 반사 손실, 대역폭은 f0에서의 값과 마찬가지로 전력파 반사 (Z − Zs*)/(Z + Zs)를 사용합니다. 실수 신호원은 바뀌지 않으며, 입력했거나 파일에서 읽은 복소수 신호원은 |S11|이 달라집니다.

  9. 임피던스 정합에서 설계 주파수, 부하의 주파수 모델, f0에서의 값을 지정하고 표시합니다

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • impedance_match

    새 매개변수는 모두 선택 사항이며, 지정하지 않은 요청은 이전과 같은 답을 받습니다.

    designFreq(Hz): f0. freqStart~freqStop과 별도로, 그 범위 안에서 지정합니다. 생략하면 대역의 중심입니다.

    loadModel: constant(생략 시), series_rc 또는 series_rl(f0에서 피팅, 부호가 맞지 않는 리액턴스는 거부), 또는 file(업로드한 부하 자체의 주파수 점). branchPreference: any, lowpass, highpass. 해당하는 분기가 없으면 branch_preference_unmet 경고가 붙습니다. .s1p 부하 파일도 받습니다.

    새 결과: designFreqHz, loadModel, unmatchedLoad, performance.ideal과 .standard(반사 손실, VSWR, 제거된 미스매치 손실, RL ≥ 10 dB 대역폭과 그 양 끝 및 f0 대비 비율, 이분법으로 구함), branch, qDefinitions.

  10. 아이 다이어그램에 송신 진폭, CTLE, 마스크를 지정할 수 있습니다

    • POST /api/py/v1/jobs (eye_diagram)
    • MCP simulate_eye_diagram

    새 매개변수는 모두 선택 사항이며, 지정하지 않은 요청은 이전과 같은 답을 받습니다.

    launchSwing(mV 피크 투 피크, 기본값 2000, 이전의 모든 결과가 가정한 ±1 V)은 모든 전압의 크기를 조정합니다. eyeHeightPctOfSwing은 아이 높이를 그 진폭에 대한 비율로 나타냅니다.

    equalization: ctle는 IEEE 802.3 Annex 93A의 연속 시간 필터를 적용합니다. ctleDcGain(−12~0 dB)으로 이득을 고정하며, 비워 두면 −12~0 dB를 1 dB 간격으로 살펴 가장 좋은 값을 씁니다. ctle는 이득, 나이퀴스트 주파수에서의 피킹, 스윕 결과, 적용 전의 아이를 반환합니다.

    maskType(hexagon 또는 rectangle), maskHalfHeight(mV), maskWidth(UI)를 지정하면 mask.pass, margin_mV, 위반 항목이 반환됩니다. samplingPhase(교차점 이후의 UI)와 lossFrequency(Hz)를 지정하면 sampling과 lossAtFrequency가 추가됩니다.

    모든 결과에 channelFile, uiMeasured, traceCount가 포함됩니다.

  11. 레이더 탐지에 난수 시드를 지정할 수 있습니다

    • POST /api/py/v1/jobs (radar_detection)
    • provenance.seed

    randomSeed(0 이상의 정수)는 고정되어 있던 몬테카를로 시드 42를 대신하며 provenance.seed로 기록되므로, 실행을 재현하거나 같은 난수로 조건을 바꿔 다시 제출할 수 있습니다. 지정하지 않으면 모든 결과는 바뀌지 않습니다.

  12. 필터 몬테카를로는 만든 그대로의 래더를 지정한 기준에 대해 실행하고, 무엇을 더 엄격하게 할지 알려 줍니다

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    새 매개변수는 모두 선택 사항이며, 지정하지 않은 요청은 이전과 같은 답을 받고, 그 옆에 새 결과 필드가 추가됩니다.

    parts(1~20개, 신호원에서 부하 순서: ref, kind는 L 또는 C, position은 series 또는 shunt, value는 H 또는 F, 선택 사항인 tolerance는 %)는 주어진 그대로의 래더를 E24 반올림 없이 시뮬레이션합니다. passCriteria(1~8개: fStart~fStop에서 최대 maxDb인 insertionLoss, fMin~fMax 안의 cutoff3dB, freq에서 또는 fStart~fStop에서 최소 minDb인 attenuation)는 rippleSpec_db과 rejectionSpec_db을 대신합니다. yieldTarget(%, 비워 두면 95).

    새 결과: circuit, 95 % 구간에 대한 판정이 붙은 yieldTarget, 통계와 히스토그램과 각 부품의 varianceShare(r²)를 담은 criteria, failingTrials(처음 200개), sampleTrials, 그리고 기준을 입력한 경우 whatIfs. 이는 가장 많이 불합격한 기준을 좌우하는 부품의 허용 오차를 한 단계 엄격하게 하여 같은 시행으로 다시 실행한 것입니다. 그 실행의 randomSeed와 그 허용 오차로 다시 제출하면 같은 수율이 나옵니다.

  13. SMPS 제어 루프에 보상기를 부품으로 지정하고, 크로스오버 주파수를 역산하고, 판정을 받을 수 있습니다

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • smps_control_loop result

    새 입력은 모두 선택 사항이며, 지정하지 않은 요청은 이전과 같은 답을 받습니다.

    compensatorType: type2_ota와 compRc, compCc, compChf, compGm, compVref로 트랜스컨덕턴스 Type II 보상기를 부품으로 나타내며, 이는 K, f_z, f_p에 정확히 대응됩니다. Vout보다 큰 compVref는 거부됩니다.

    solveFor: crossover와 targetCrossover(Hz, 기본값 Fsw/10), resistorSeries(E96), capacitorSeries(E12)를 지정하면 피크 전류 모드에서 R_c, C_c, C_hf를 정하고 그것으로 얻는 특성을 반환합니다.

    minPhaseMargin(45°)과 minGainMargin(10 dB)이 판정과 몬테카를로 수율의 기준을 정합니다.

    새 결과: verdict, polesZeros, nominal.phaseCrossoverHz, nominal.loopGainAt100HzDb, compensatorParts, solve, runSummary, 그리고 bodeAboveHalfFsw(2·Fsw까지의 응답, 이 범위에서는 여유를 읽지 않음).

  14. 타이밍 계산기 16종이 타이밍을 예산에 대해 판정합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    새 입력은 모두 선택 사항이며, 지정하지 않은 요청은 이전과 같은 답을 받습니다. 단, 아래 항목에 적은 예외가 있습니다.

    uart-baud-rate: oversampling(16 또는 8), divisorFraction(0은 정수 분주비, 1은 1/oversampling 단위의 분수), errorBudget(%, 2, 보레이트 오차 경고가 이를 따름). divisorSet, baudError_pct(부호 있음), stopSampleOffset_bits.

    can-bus-timing: sjw(tq, 1). bitRateActual, bitRateError_pct, samplePointActual, 그리고 ISO 11898-1이 각 노드에 허용하는 클록 허용 오차인 oscTolerance_pct.

    lin-bus-timing: slotTime(ms, 10). frameTimeMax는 공칭 프레임의 1.4배(LIN 2.x). modbus-frame-timing: charGap(ms, 0), 이제 프레임 시간에 포함됩니다. t15, charGapChars, t15Chars.

    spi-timing: riseTime(2.2τ)과 edgeShare_pct. i2s-timing: mclk(MHz, 16.9344)과 rateBudget(%, 0.1). mclkDivider, bclkActual, sampleRateActual, sampleRateError_pct. pwm-duty-cycle: timerClock(MHz, 16)과 requiredBits(8). periodCounts, onCounts, dutyActual, frequencyActual, dutyResolution_bits.

    555-timer: targetTime(ms, 2), errorBudget(%, 5), rTolerance와 cTolerance(%, 0). timeMin, timeMax, timingError_pct. rc-time-constant: rTolerance(%, 1), cTolerance(%, 5), tauBudget(%, 10, 넘으면 경고). tauMinUs, tauMaxUs, tauErrorPct.

    inductor-energy: requiredTime(µs, 20). battery-charge-time: requiredTime(h, 3). supercapacitor-backup: holdUpTime(s, 60). motor-inrush-current: dipLimit(%, 10). via-step-response: slowdownBudget(%, 10, 이제 지연 경고가 이를 따름). 모두 0 이하이면 거부됩니다.

    inrush-current-limiter: ntcR25(Ω, 0이면 필요한 값)와 ntcTolerance(%, 20). peakInrushMax. ntcR25를 지정하면 peakInrush, timeConstant, limitingResistor가 피팅한 서미스터를 따릅니다. pid-tuning: overshootBudget(%, 25). 시뮬레이션한 폐루프 계단 응답에서 구한 overshootPct와 settlingTime.

  15. 주파수 계산기 14종이 생성 성분을 대역에 대해 셉니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    새 입력은 모두 선택 사항이며, 지정하지 않은 요청은 이전과 같은 답을 받습니다. 단, 아래 항목에 적은 예외가 있습니다.

    mixer-spur-calculator: rfBandLow/rfBandHigh(MHz, 902/928), ifBandwidth(MHz, 10), nearMargin(MHz, 50). spursInBand, spursNearBand, nearestSpur, imageFreq, imageToBand, loToBand. 이 값들은 IF로 변환되는 모든 RF 입력 f_RF = (m·f_LO ± f_IF)/n(m은 LO 고조파 차수, n은 RF 고조파 차수로 기존 집계와 같음)에서, m + n이 maxOrder 이하인 범위로 구합니다.

    intermodulation-distortion: bandLow/bandHigh(MHz, 88/108). productsInBand. vibration-phase-noise: offsetBandLow/offsetBandHigh(Hz, 1000/10000). sidebandsInBand. phase-noise-to-jitter: pointsIntegrated.

    ism-coexistence: channelWidth1_MHz/channelWidth2_MHz(20/2). overlappingChannels, 채널은 대역 전체에 고르게 배치됩니다. channels1과 channels2의 상한은 100입니다.

    via-stub-resonance: dataRate(Gb/s, 10). nyquistFreq, resonancesInBand, resonancesNearBand. chassis-resonance: bandLow/bandHigh(MHz, 30/1000). f011MHz와 modesInBand. room-modes: bandLow/bandHigh(Hz, 20/200). modesInBand, modesNearBand, modalBandwidth.

    sampling-nyquist: harmonicOrder(5). aliasesInBand(톤 자체가 신호 대역으로 접힌 것), harmonicAliasesInBand(그 고조파가 대역으로 접힌 것, 변환기의 SFDR 범위까지 영향을 줌), lowestAliasingInput. fft-bin-resolution: toneFreq(Hz, 1000)와 sidebandSpacing(Hz, 100). toneBin, toneLevelError, resolutionBandwidth, sidebandsUnresolved(f_s/2보다 높은 톤에서는 null).

    am-modulation-index: channelWidth(kHz, 10). powerInChannel, sidebandsInChannel, sidebandsOutside. fm-modulation-index: channelLow/channelHigh(kHz, 98000/98200). occupiedBandwidth, powerInChannel, sidebandsInChannel, sidebandsOutside(β = 1000을 넘으면 null, 경고 포함).

    oversampling-snr: signalBandwidth(Hz, 24000). modulatorRate, outOfBandNoise, foldBands. digital-filter-order: toneFreq(Hz, 1000)와 maxHarmonic(5). harmonicsInPassband, harmonicsInTransition, nearestHarmonic, butterworthAttenuation, chebyshevAttenuation.

  16. can-bus-timing: 비트 레이트에 가장 가까운 프리스케일러와 퀀텀 수를 고릅니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    8~25 타임 퀀텀의 모든 비트(CAN 2.0)와, 필요한 프리스케일러의 앞뒤 값 가운데에서 먼저 비트 레이트에 가장 가까운 것, 다음으로 요청한 샘플 포인트에 가장 가까운 것(CiA 601-3), 다음으로 16 퀀텀, 마지막으로 가장 작은 프리스케일러를 고릅니다. 이전에는 어떤 비트 레이트가 되든 16 퀀텀에 가장 가까운 프리스케일러를 골랐습니다. 36 MHz에서 500 kbps는 5 × 14 퀀텀으로 2.86 % 빨랐지만, 이제는 3 × 24로 정확합니다. 정확하거나 더 가까운 설정이 있으면 prescaler, nominalBitTime, tq, 각 세그먼트가 바뀝니다. 모든 기본값과 프리셋은 바뀌지 않습니다.

    샘플 포인트는 비트 끝에서 최대 1 퀀텀 앞에 놓이므로 세그먼트의 합이 그와 일치합니다(95 %에서 8 퀀텀이던 것은 9였습니다).

  17. modbus-frame-timing: 19 200 Bd를 넘으면 타이머가 고정값입니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    19 200 Bd를 넘으면 t35는 3.5문자(115 200 Bd 8E1에서 0.334 ms)가 아니라 고정된 1.75 ms(Modbus over Serial Line V1.02, 2.5.1.1절)이며, maxFrameRate도 이를 따릅니다. 새 t15는 이 범위에서 고정된 750 µs입니다.

  18. intermodulation-distortion: im3High는 크기(절댓값)입니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    im3High는 im3Low와 마찬가지로 |2f₂ − f₁|입니다. f₂ = f₁/2 아래에서는 음수였습니다(100 MHz와 40 MHz: −20이던 것이 이제 20 MHz).

  19. chassis-resonance: 정확한 c와 (0,1,1) 모드

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    빛의 속도는 3 × 10¹⁰이 아니라 정확한 값 29 979 245 800 cm/s를 씁니다. fLowest, f101MHz, f110MHz가 0.07 % 낮아집니다(기본값에서 901.39 → 900.76 MHz).

    fLowest에 (0,1,1)이 포함됩니다. 길이가 가장 짧은 변일 때는 이것이 가장 낮은 모드입니다(Pozar, Microwave Engineering, 4판, 6.3절). 10 × 30 × 20 cm 상자는 1581 MHz였지만 이제 900.76 MHz이며, wavelengthAtResonance도 이를 따릅니다.

  20. phase-noise-to-jitter: 프로파일을 거듭제곱 법칙으로 적분합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    profileMode가 1이면 프로파일은 각 점 사이를 거듭제곱 법칙, 즉 로그-로그 축의 직선으로 적분하며(Drakhlis, Microwaves & RF, 2001년 1월), 대역의 끝에서는 그 위치에서의 프로파일 자체 레벨을 씁니다. 선형 사다리꼴 적분은 내려가는 프로파일을 과대평가했고, L₄는 대역의 끝보다 바깥에 있을 때도 대역의 끝까지 유지되었습니다. 100 MHz에서 기본 프로파일은 0.166 ps였지만 이제 0.084 ps입니다. 이 모드에서는 rmsJitter, cycleToCycleJitter, phaseNoisePower, rmsPhaseError, adcSnrLimit이 바뀌며, 단일 레벨 모드는 바뀌지 않습니다.

  21. sampling-nyquist: 에일리어스를 f_s의 가장 가까운 배수로 접습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    aliasFreq_Hz는 |f − k·f_s|이며, k는 f/f_s에 가장 가까운 정수입니다(Kester, MT-002). 이전에는 |f_s − f|로, 1.5·f_s까지만 맞았습니다. 4 kSa/s에서 10 kHz는 6000 Hz였지만 이제 2000 Hz입니다.

  22. fm-modulation-index: 베셀 대역폭을 베셀 함수로 구합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    besselBandwidth는 변조되지 않은 반송파의 1 %를 넘는 측파대의 범위 2·n·f_m입니다(Haykin, Communication Systems). 이전에는 2(β + 1)·f_m으로, 카슨 법칙과 같았습니다. β = 5에서 180 kHz였지만 이제 240 kHz입니다. β = 1000을 넘으면 null이며 경고가 붙습니다.

  23. digital-filter-order: 정확한 타원 필터 차수

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    ellipticOrder는 차수 방정식 K(k)·K′(k₁)/(K′(k)·K(k₁))을 풉니다(k = f_p/f_s, k₁ = ε_p/ε_s). 이전에는 체비쇼프 차수를 1.5로 나눈 값이어서 대부분의 설계에서는 너무 높고 일부에서는 너무 낮았습니다. 기본값에서는 4가 아니라 3이 필요하며, 1 dB와 20 dB의 2:1 전이 대역에서는 2가 아니라 3이 필요합니다.

  24. via-stub-resonance: 스터브가 없으면 공진도 없습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    출구가 마지막 층에 있으면 스터브가 없습니다. resonantFreq와 backdrillBenefit은 0이 아니라 null(공진 주파수에 상한이 없음)입니다.

  25. room-modes와 inductor-energy: 무엇이 잘못되었는지 밝히며 거부합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    room-modes는 0 이하의 음속이나 잔향 시간을 각각의 메시지로 거부하며, 거부와 함께 값을 반환하지 않습니다. 이전에는 0을 반환하고 방의 치수를 문제로 지목했습니다.

    inductor-energy는 사이트가 늘 그랬듯이 0 이하의 직렬 저항을 거부합니다. API에서는 이 경우 실패했습니다.

  26. 컨버터·드라이버 계산기 8종이 동작 범위를 받고, 부품을 고르고, 손실 모델을 추가합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    buck-converter처럼, 사용 중에 변하는 각 입력은 <input>Min과 <input>Max의 쌍이며, 0(기본값)은 공칭 입력을 뜻합니다. 모든 최악값은 출력이며, 그것이 생기는 입력값도 각각 별도의 출력입니다(rippleWorstVin에서의 rippleWorstA). 부품은 최악의 코너가 요구하는 값 이상으로 고릅니다. 인덕터는 E12에서, 전압 정격은 최악 전압의 1.5배 이상인 다음 표준 정격입니다(플라이백의 스위치는 클램프된 드레인 피크 이상). 손실 모델의 입력에는 일반적인 기본값이 있으며, 손실은 공칭점에서의 값(W)으로 lossTotal에 더해집니다. 새 입력을 지정하지 않은 요청은 이전과 같은 답을 받습니다. 단, 아래 항목에 적은 예외가 있습니다.

    boost-converter: inputVoltageMin/inputVoltageMax. coutEach, 그리고 손실 모델의 rdsOn, tSwitch, qg, vGate, vDiode, qrr, dcr, coreLoss, esrOut. 새 출력에는 dutyMin/dutyMax, inductorMinWorstUH와 inductorChosenUH, ilPeakWorst, inputCurrentWorst, q1RmsA, coutRmsA, outputRippleMV, vdsRating, 8가지 손실, efficiencyLossModel이 있습니다. 전류는 여전히 입력 efficiency로 정해집니다.

    flyback-converter: vinMin/vinMax, 각 코너에서 공칭 트랜스포머로 계산합니다. 손실 모델의 rdsOn, tFall, qg, vGate, vDiode, rPri, rSec, coreLoss, leakageInductance(µH, 기본값 2.6), clampRatio(기본값 2, 1.1 이상). RCD 클램프의 손실은 ½·L_lk·I_pk²·f·k/(k − 1)입니다. 새 출력에는 두 권선의 피크 전류와 RMS 전류, reflectedVoltage, clampVoltage, vdsPeakWorst, vdsRating, diodeVrWorst, diodeVrRating, 7가지 손실, efficiencyLossModel이 있습니다.

    charge-pump-voltage: inputVoltageMin/inputVoltageMax와 pumpCurrentMin/pumpCurrentMax. switchResistance(Ω, 기본값 1)와 esr(mΩ, 기본값 10)은 ICL7660 데이터시트의 R_O처럼 전하 분배 저항에 더해집니다. 새 출력에는 loadedVoltageMin/loadedVoltageMax, outputResistance, loadedVoltageWithLosses, 커패시터와 스위치의 정격, 3가지 손실, efficiencyLossModel(이상적인 부품에서는 efficiency와 같음)이 있습니다.

    switching-regulator-ripple: outputCurrent(A, 기본값 2), inputVoltageMin/inputVoltageMax, 그리고 벅 컨버터의 손실 모델을 자체 부품에 적용한 것(esr은 출력 커패시터의 값). 새 출력에는 최악의 리플과 RMS 전류, vdsRating, 8가지 손실, efficiency가 있습니다.

    mosfet-power-dissipation: drainCurrentMin/drainCurrentMax와 tAmbientMin/tAmbientMax(0을 제외한 임의의 값, 0은 공칭값). rdsonTempco(%/°C, 기본값 0, 접합부 온도까지 닫힌 형식으로 풂), coss(pF, 기본값 0), qg, vGate. 새 출력에는 그때의 전류와 주위 온도가 붙은 junctionTempWorst, totalLossWorst, efficiencyWorst, vdsRating, 4가지 손실, efficiencyLossModel이 있습니다.

    h-bridge-selection과 motor-driver-power: motorCurrentMin/motorCurrentMax와 전원의 범위(motorVoltageMin/motorVoltageMax, supplyVoltageMin/supplyVoltageMax). 데드 타임 tDead와 바디 다이오드의 vBody(TI SLVA504A), 그리고 H 브리지에서는 dutyCycle(%, 기본값 75), tSwitch, qg, vGate. 새 출력에는 최악의 브리지 손실, 가장 뜨거운 FET, vdsRating, 각 손실, efficiencyLossModel이 있습니다.

    class-d-efficiency: outputPowerMin/outputPowerMax와 supplyVoltageMin/supplyVoltageMax. switchingFreq(kHz, 기본값 400), filterCutoff(kHz, 기본값 40), tSwitch, coss, qg, vGate, 그리고 필터 인덕터의 dcr과 coreLoss. 새 출력에는 계산값과 선정값의 출력 필터(TI SLAA701B), 5가지 손실, loadPower, efficiencyLossModel, 코너가 붙은 최악의 효율과 손실, headroomWorst(브리지가 출력을 충분히 스윙하지 못하면 음수), 필터의 리플 전류와 피크 전류, 각 정격이 있습니다.

  27. boost-converter: 듀티비는 TI SLVA372D의 식입니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    듀티비는 1 − V_in/(V_out·η)이어서 손실이 있으면 짧아졌고, 계산기 자체의 입력 전류와 맞지 않았습니다. 이제는 TI SLVA372D 식 1, D = 1 − V_in·η/V_out입니다. 기본값(5 V에서 12 V, 0.5 A, 100 kHz, 88 %)에서 dutyCycle은 52.65 %에서 63.33 %로, inductorValue는 64.35 µH에서 77.41 µH로, outputCapacitor는 4.388 µF에서 5.278 µF로 바뀝니다.

    거부와 경고도 그에 맞춰 바뀝니다. η·V_out과 V_out 사이의 입력은 이전에는 거부되었지만 이제 계산되며(V_out ≤ V_in만 거부), 95 % 듀티비 경고는 V_in·η/V_out ≤ 0.05에서 나옵니다.

  28. switching-regulator-ripple: 입력 이상의 출력은 거부됩니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    이 계산기는 벅 방식입니다. outputVoltage가 inputVoltage 이상이면 99 % 듀티비와 음의 리플을 반환했지만, 이제는 "Output voltage must be less than input voltage"로 거부하고 값을 반환하지 않습니다.

  29. buck-converter: 입력 범위, 고른 부품과 그 스트레스, 효율을 포함한 손실 모델

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    vinMin과 vinMax로 입력을 범위로 지정합니다(기본값 0은 공칭 vin). 인덕터는 리플이 가장 큰 지점에서 크기를 정하고 E12에서 그 이상인 값을 고릅니다(inductorMinWorstUH, inductorChosenUH). 각 스트레스는 가장 큰 지점에서, 그것이 생기는 입력 전압과 함께 보고됩니다: rippleWorstA/rippleWorstVin, ilPeakWorst/ilPeakWorstVin, outputRippleMV/outputRippleVin, cinMinWorstUF, cinRmsA, q1RmsA, q2RmsA(각각 해당 …Vin 포함), 그리고 dutyMin, dutyMax. 출력 커패시터 뱅크는 coutEach µF 커패시터 coutCount개입니다. 부품의 전압 정격은 vdsRating, cinVoltageRating, coutVoltageRating입니다(전압의 1.5배 이상으로 판매되는 정격).

    손실 모델의 입력은 모두 선택 사항입니다: rdsOnHigh, rdsOnLow, tSwitch, qg, vGate, tDead, vBody, dcr, coreLoss, esrOut, esrIn. 공칭 입력과 부하에서의 손실은 lossDcr, lossCore, lossHsConduction, lossLsConduction, lossHsSwitching, lossGateDrive, lossDeadTime, lossCapEsr, lossTotal(W)이며, outputPower와 efficiency(%)도 반환됩니다. 새 입력을 지정하지 않은 요청은 이전과 같은 5개의 출력을 받습니다. 단, cinUF는 예외입니다(buck-converter-input-capacitance 참고).

  30. buck-converter: 입력 커패시터는 입력의 리플을 기준으로 정합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    cinUF는 출력의 리플 전압(vout에 대한 deltaVout)으로 나누었습니다. 이제는 TI SLVA477B 식 12처럼 입력 자체의 리플인 새 입력 deltaVin(vin의 %, 기본값 1)을 씁니다: C_in = I_out·D·(1 − D)/(f_sw·ΔV_in). 기본값(12 V에서 5 V, 1 A, 500 kHz)에서 9.72 µF가 4.05 µF로 바뀝니다.

  31. 계산기 23종이 추가로 부품 계열을 받고, 만든 그대로의 설계를 보고합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    eSeries(이상값이면 0, 또는 12, 24, 48, 96)는 계산기가 설계하거나 읽는 각 저항, 커패시터, 인덕터를 그 계열의 가장 가까운 값으로 맞추며, 모든 출력은 맞춘 설계의 값이 됩니다. 기본값은 지정하지 않은 요청이 이전과 같은 답을 받도록 정했습니다. attenuator-designer, led-resistor, zener-diode에서는 24이며, 이들의 E24 출력(piR1Nearest~tR2Nearest, rNearest, iActual, pNearest, e24Resistor)은 이제 이를 따릅니다. voltage-divider, opamp-gain, comparator-hysteresis, schmitt-trigger, transistor-switch, current-mirror, crystal-load-capacitance, photodiode-transimpedance, lm317-resistors, rs485-termination, pll-loop-filter, wilkinson-power-divider, rc-snubber, rcd-clamp-snubber, emi-filter-lc, power-supply-ripple-filter, conducted-emissions-filter, differential-mode-filter, speaker-crossover, tweeter-capacitor에서는 0입니다. directional-coupler의 부품은 선로이므로 받지 않습니다.

    새 출력은 맞춘 설계를 나타냅니다: attenuator-designer의 piAttenuationBuilt(dB)와 piInputImpedanceBuilt(Ω), wilkinson-power-divider의 isolationBuilt(f₀에서의 dB, 정확한 저항값에서는 상한이 없으므로 null), rcd-clamp-snubber의 clampVoltageBuilt, rippleVoltageBuilt, clampPowerBuilt, peakDrainVoltageBuilt, pll-loop-filter의 crossoverBuilt(kHz, 루프의 0 dB 교차점, pmActual은 그 지점의 여유), rs485-termination의 failsafeVoltage(mV, 유휴 버스의 A–B 전압), emi-filter-lc의 insertionLossBuilt(10·f_c에서의 dB), conducted-emissions-filter의 cornerBuilt, attenuationBuilt, outputLevelBuilt, speaker-crossover의 wooferCutoffBuilt와 tweeterCutoffBuilt, tweeter-capacitor의 crossoverBuilt, zener-diode의 zenerCurrentBuilt(mA)와 zenerPowerBuilt(mW). 이는 고른 저항을 통한 전부하에서의 값이며, 저항이 부하를 감당하지 못하면 전류가 음수입니다.

    레이블 변경(키는 그대로): 감쇠기의 맞춘 저항은 "(E24)" 대신 "(rounded)"로 표시됩니다. rNearest는 "Nearest Series Value", pNearest는 "Power (series R)", e24Resistor는 "Nearest Series Resistor", current-mirror의 error는 "Output Current Error"로, N·I_ref에 대한 부족분입니다(계열을 지정하면 반올림 영향이 포함되며, Widlar 출력은 맞춘 R_E로 V_T·ln(I_ref/I) = I·R_E에서 풉니다).

    목표 출력에 대해 부품을 역산할 수 있도록, 다음 입력에 최댓값을 정했습니다(그보다 큰 값도 출처 정보의 경고와 함께 계속 계산됩니다): comparator-hysteresis의 r1과 r2는 10 000 kΩ, photodiode-transimpedance의 feedbackResistance는 1e7 kΩ, feedbackCapacitance는 100 000 pF, differential-mode-filter의 inductance는 100 000 µH, capacitance는 1 000 µF, power-supply-ripple-filter의 inductance는 100 000 µH, capacitance는 100 000 µF.

  32. schmitt-trigger: + 입력에서의 중첩으로 임계값을 구합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    이전의 히스테리시스 폭은 V_cc·R2/(R2 + R3)로 R1이 빠져 있었고, 분압기 전압을 중심으로 대칭으로 놓였습니다. 이제 임계값은 + 노드에서의 중첩입니다(TI SNOA997A): V_TH+ = V_cc·R1/(R1 + R2∥R3), V_TH− = V_cc·(R1∥R3)/(R2 + R1∥R3). centerVoltage는 폭의 중앙입니다. 기본값(5 V, 10 kΩ, 10 kΩ, 100 kΩ)에서 vth_high, vth_low, hysteresis는 2.727, 2.273, 0.4545 V에서 2.6190, 2.3810, 0.2381 V로 바뀝니다. 이 회로는 반전형 트리거인데, 설명에는 비반전형으로 되어 있었습니다.

  33. conducted-emissions-filter: L과 C를 부하에 맞춥니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    L과 C를 √(LC·Z)와 √(LC/Z)로 나누었기 때문에 √(L/C)가 √Z가 되었습니다(50 Ω에 대해 7.07 Ω, 전압원으로 구동하면 필터가 47 kHz에서 17 dB의 피크를 보였습니다). 이제는 L = Z/ω₀, C = 1/(ω₀·Z)입니다. 기본값(150 kHz에서 80 dBµV, 20 dB, 50 Ω)에서 lValue는 23.7 µH에서 167.8 µH로, cValue는 0.475 µF에서 0.0671 µF로 바뀝니다. 코너 주파수와, 따라서 40 dB/decade 감쇠는 바뀌지 않습니다.

  34. attenuator-designer, led-resistor, zener-diode: 10 Ω 미만의 E24 값

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    이들의 E24 탐색은 10 Ω에서 시작했기 때문에 10 Ω 미만의 부품은 10 Ω으로 맞춰졌습니다. 1 dB, 50 Ω T형 패드의 2.875 Ω 직렬 저항은 10 Ω이 되었고(만든 패드는 1.336 dB, 54 Ω), 5 Ω LED 저항도 10 Ω이 되었습니다. 이제 탐색은 0.10 Ω에서 시작합니다(3.0 Ω과 5.1 Ω). 10 Ω을 넘으면 아무것도 바뀌지 않습니다.

  35. pll-loop-filter와 class-d-efficiency: 거부할 때는 값을 반환하지 않습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    pll-loop-filter(모든 거부)와 class-d-efficiency(API)는 오류와 함께 0을 반환했습니다. 이제 다른 계산기처럼 값을 반환하지 않습니다.

  36. filter-designer: 만든 그대로의 래더 응답, 정확한 차단 주파수 이동, 1 GHz까지의 차단 주파수

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    6개의 새 출력은 부품 값으로 만든 래더를 Z₀와 그 부하 사이의 ABCD 행렬 종속 연결로 풀어 나타냅니다: loadImpedance(Z₀, 또는 짝수 차수 체비쇼프에서는 Z₀/g_{N+1}, 하이패스에서는 g_{N+1}·Z₀), cutoffBuilt_Hz(−3 dB 주파수, 로우패스와 하이패스), fLowBuilt_Hz와 fHighBuilt_Hz(밴드패스의 −3 dB 양 끝), passbandLoss_dB(0.8·f_c까지, 1.25·f_c 위, 또는 대역 중앙 80 %에서의 최악 손실), stopbandBuilt_dB(프로토타입이 차단 주파수의 2배에 이르는 지점의 손실). eSeries를 지정하면 맞춘 설계의 값이며, 이상적인 부품에서는 저지 대역 값이 attenuation_at_2fc와 같습니다.

    fcShiftPercent는 가장 큰 부품 오차의 절반이었습니다. 이제는 반올림 때문에 만든 래더의 −3 dB 주파수(밴드패스에서는 −3 dB 대역의 중심)가 이상적인 래더에서 얼마나 움직였는지를 나타냅니다. E24 부품을 쓴 100 MHz 5차 버터워스는 +0.997 %이며, 이전 추정값은 +1.31 %였습니다. eSeries가 0이면 이전과 같이 0입니다.

    fc는 1 GHz까지 받습니다(이전에는 10 MHz까지).

  37. voltage-drop: 모든 게이지를 계산하며, 알루미늄은 IEC 60889 값을 씁니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    표에 없는 wireGauge(홀수 게이지나 소수 게이지)는 12 AWG의 저항으로 계산되었습니다. 이제는 표와 같은 식, 즉 IEC 60028 구리(1/58 Ω·mm²/m)를 그 게이지의 ASTM B258 단면적으로 나눈 값을 씁니다. 표에 있는 게이지는 바뀌지 않습니다.

    conductorType 1(알루미늄)은 구리의 1.61배 저항을 썼습니다. 이제는 IEC 60889의 0.028264 Ω·mm²/m, 즉 구리의 1.6393배를 쓰므로 모든 알루미늄 전압 강하가 1.8 % 커집니다. 120 V에서 15 A, 30 m의 10 AWG는 3.96 %였던 강하가 4.03 %가 됩니다.

  38. coax-loss: 제조사 데이터로 구한 감쇠량, 케이블 8종 추가, 입력 전력과 출력 전력

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    케이블 표는 데이터시트의 dB/100 ft 기준으로 약 1.7배였기 때문에 모든 케이블의 손실이 너무 낮았습니다. 100 m당 감쇠량은 이제 k₁√f + k₂f(f는 MHz)입니다. LMR 케이블에는 Times Microwave가 공개한 계수(25 °C)를, 나머지에는 Belden과 CommScope 표(20 °C)에 대한 최소제곱 피팅을 씁니다. 100, 435, 2400 MHz에서 lossPer100m의 이전 → 새 값: LMR-400 2.15 → 4.10, 4.62 → 8.74, 11.50 → 21.70; LMR-240 3.60 → 8.05, 7.69 → 17.04, 19.40 → 41.51; LMR-200 4.80 → 10.64, 10.35 → 22.43, 26.00 → 54.18; LMR-100A 10.80 → 23.84, 23.45 → 51.01, 61.00 → 127.68; RG-58/U 10.00 → 12.45, 22.65 → 28.77, 64.00 → 84.61; RG-8X 6.10 → 10.10, 13.50 → 22.74, 38.00 → 63.62; RG-213/U 4.70 → 6.30, 10.35 → 15.21, 28.50 → 48.34; RG-174/U 19.00 → 28.12, 43.33 → 65.75, 120.00 → 197.64; Belden 9913 2.50 → 4.34, 5.42 → 9.23, 13.70 → 22.75; Andrew LDF4-50A 0.70 → 2.17, 1.53 → 4.66, 3.95 → 11.81. attenuation_dB과 전력·전압 비율도 이를 따릅니다. Andrew LDF4-50A는 1/2 in 케이블인데 7/8 in으로 표시되어 있었습니다.

    cableIndex 0–9는 케이블이 그대로이며, 이제 17까지 이어집니다: LMR-600, LMR-195, LMR-400-UltraFlex, LMR-400-LLPL(플레넘), RG-316, RG-6(75 Ω), Andrew LDF5-50A(7/8 in), LMR-900. 새 선택 입력 inputPower(dBm, 기본값 30). 새 출력 powerOut_dBm, powerOut_W, lossPerMeter. 케이블의 정격 최대 주파수를 넘는 주파수, 피팅한 표의 마지막 점을 지난 주파수, 또는 피팅이 10 % 이내로 맞는 주파수보다 낮은 주파수에는 거부가 아니라 경고가 붙습니다.

  39. 계산기 18종이 목록을 받습니다: 단, 손실, 항, 층, 부하, 부품, 면

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    각 목록은 개수와 인덱스가 붙은 입력(numLoads와 load1Current, load2Current, …)으로 나타내므로, 요청은 중첩되지 않은 평면 객체로 유지됩니다. 모든 개수의 기본값은 계산기가 이전에 가지고 있던 목록이므로, 새 입력을 지정하지 않은 요청은 이전과 같은 답을 받습니다(거부를 포함해 계산기마다 201개의 요청으로 확인했습니다). 개수를 넘는 인덱스의 입력은 무시됩니다.

    noise-figure-cascade: numStages는 이제 10까지 받으며(이전에는 4까지), stage5Gain, stage5NF, stage5IIP3부터 stage10IIP3까지, 그리고 선택 사항인 bandwidth(MHz, 기본값 1)가 추가되었습니다. 새 출력은 cascadedGain, noiseTemperature(290 K × (F − 1)), noiseFloor(kT₀B에 종속 잡음 지수를 더한 값)입니다.

    lora-link-budget, ble-link-budget, 5g-nr-link-budget: extraLossCount(0–6)개의 extraLoss1~extraLoss6(dB)과 totalLoss. clock-jitter: jitterTerms(0–6)개의 term{n}Jitter_ps, 제곱합의 제곱근으로 더합니다. emi-margin-budget: marginTerms(0–6)개의 term{n}Allowance와 totalAllowance. sensor-accuracy-budget: errorTerms(0–6)개의 term{n}Error, 제곱합의 제곱근. 4-20ma-transmitter: loopElements(0–6)개의 element{n}Resistance와 totalLoopResistance.

    heatsink-calculator, heatsink-selection, thermal-resistance-network, junction-temperature: 케이스와 히트싱크 사이에 직렬로 들어가는 numLayers(0–6)개의 layer{n}Theta(°C/W). 두 히트싱크 계산기는 thetaJS와 heatsinkTemp도 반환합니다.

    battery-life: numLoads(0–7)개의 load{n}Current와 load{n}Duty, 그리고 selfDischargeCurrent. battery-runtime-motor: motorDuty(%, 기본값 100)와 numLoads(0–5)개의 load{n}Current, load{n}Duty, load{n}Efficiency, 그리고 batteryCurrent. solar-panel-sizing: loadHours(하루 시간 수, 기본값 24)와 numLoads(0–9)개의 load{n}Power와 load{n}Hours.

    gear-ratio: extraStages(0–5)개의 stage{n}Driver, stage{n}Driven, stage{n}Efficiency, 그리고 totalEfficiency. series-parallel-resistor: numParts(1–8, 기본값 4)와 r5~r8, 그리고 sumOfValues. 다른 위치가 이미 그랬듯이 r1도 0(실장하지 않은 부품)일 수 있습니다. rt60-reverberation: numSurfaces(0–8)개의 surface{n}Area와 surface{n}Alpha, 그리고 otherArea와 meanAbsorption.

  40. 링크 버짓은 거리 0에 경로 손실 없이 답합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    lora-link-budget, ble-link-budget, 5g-nr-link-budget은 거리 0을 거부했습니다. 이제는 경로 손실 0 dB로 답합니다. 이는 경로가 없는 링크이며, 페이지에서 경로 이전의 버짓을 보여 주는 데 씁니다. 음의 거리는 여전히 거부됩니다.

  41. clock-jitter: 타이밍 예산이 남지 않으면 0 %가 아니라 상한 없는 비율입니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    셋업 시간과 홀드 시간이 클록 주기 전체를 차지하면 budgetUsed_pct는 0이었고, 이는 지터가 전혀 없는 것처럼 읽혔습니다. 이제는 null(상한 없는 비율)이며, 보고할 셋업 위반이 없으면 타이밍 예산이 남지 않았다는 경고가 붙습니다.

  42. series-parallel-resistor: 분압비는 실장한 두 부품으로 구합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    정확히 두 부품을 실장하면 voltDividerRatio는 어느 두 부품이든 R2/(R1 + R2)였기 때문에, R1과 R3를 실장하면 0이었습니다. 이제는 실장한 두 번째 부품을 두 부품의 합으로 나눈 값이며, R1과 R2일 때는 바뀌지 않습니다.

  43. optical-sensor-range: 거부할 때는 값을 반환하지 않습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    0 이하의 안전 계수는 오류와 함께 0인 maxRange와 normalizedRange를 반환하며 거부되었습니다. 이제 다른 모든 거부처럼 값을 반환하지 않습니다.

  44. broadside-coupled-pair: 플레인이 없으면 공통 모드, 비결합 임피던스, 플레인까지의 높이가 없습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    차폐되지 않은 페어(shielded 0)에는 기준 플레인이 없으므로, 경고에서 이미 밝혔듯이 commonImpedance, uncoupledImpedance, heightToPlane은 정의되지 않습니다. 이전에는 0이었고 이제 null입니다.

  45. rise-time-bandwidth: 클록이 없으면 고조파 차수도 없습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    clockFrequency가 0이면(이 입력으로 클록을 생략할 수 있습니다) harmonicNumber는 0이었는데, 이는 어떤 클록도 내지 않는 값입니다. 이제는 값이 존재하지 않을 때의 다른 출력처럼 null입니다.

  46. 계산기 13종이 결과를 공개된 규격에 비추어 판정합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    각 계산기는 규격(해당하면 등급도)을 선택 입력으로 받아, 한도, 그 한도에 대한 결과의 백분율(100을 넘으면 불합격), 그리고 규격을 만족하는 입력값을 반환합니다. 한도는 계산 안에서 구하므로 API는 페이지와 같은 판정을 냅니다. 새 입력은 모두 선택 사항이며, 기본값에서는 기존 출력이 모두 바뀌지 않습니다. 단, 아래 항목에 적은 예외가 있습니다.

    power-density: standard(0은 FCC 47 CFR §1.1310, 1은 ICNIRP 2020), exposureClass, groundReflection. limitDensity, limitPercent, minDistance, maxEirp를 반환합니다. trace-width-current: standard(API가 이미 받는, 실제로 그리는 traceWidth를 읽음). limitCurrent, limitPercent, minTraceWidth. microvia-current-capacity: standard, conductorClass. limitCurrent, limitPercent, minVias, minViaDiameter. pcb-trace-temp: standard, laminate. chartRise, limitRise, limitPercent, minTraceWidth, maxCurrent.

    minimum-conductor-spacing: conductorSpacing. spacingPercent, maxVoltage(한도는 spacing). padstack-annular-ring: standard, padDiameter, producibilityLevel. minLandDiameter, landPercent, maxDrillDiameter. solder-paste-volume: releaseCriterion. maxStencilThickness, stencilPercent, maxApertureReduction. bga-land-pad: ballType, landDiameter. ipcLand, landDeviation, landTolerance, landPercent, compliantLand.

    i2c-pullup: pullup. riseTime, riseTimePercent, maxBusCap(한도는 riseTimeTarget_ns, 모드는 speedMode). usb-termination: impedanceError, impedanceTolerance, impedancePercent, compliantImpedance(규격은 usbVersion). esd-tvs-diode: standard, testLevel, esdRating. testVoltage, limitPercent. esd-clamp-selection: standard, testLevel. testVoltage, limitPercent. radiated-emission-estimate: standard, emissionClass. eFieldUvm, limitField, limitPercent, maxCurrent, maxLoopArea.

    규격이 한도를 정하지 않는 경우(30 MHz 미만의 ICNIRP, 30 MHz–6 GHz 밖의 CISPR 32, IPC-6012 Class 2 애뉼러 링, 3,050 m를 넘는 A6 간격), 새 출력은 NaN이며 null로 반환되고, 이유를 밝히는 경고가 붙습니다.

  47. 전송 선로 계산기 11종이 관내 파장을 반환합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    microstrip-impedance, controlled-impedance, asymmetric-stripline, dual-stripline, differential-pair, edge-coupled-internal-symmetric, edge-coupled-internal-asymmetric, edge-coupled-embedded, broadside-coupled-pair, coplanar-waveguide, coax-impedance는 선택 입력 frequency(GHz, 기본값 2.4)를 받아 guidedWavelength와 quarterWavelength(mm)를 반환합니다. λg = c/(f·√εeff)이며, 결합 선로는 홀수 모드 εeff로 구합니다. frequency가 없는 요청은 기존 출력을 모두 그대로 반환하고, 2.4 GHz에서의 새 출력 두 개를 더합니다.

  48. radiated-emission-estimate: 여유는 고른 규격과 등급을 따릅니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    margin은 요청한 주파수와 거리에서 고른 규격과 등급의 한도에서 전계를 뺀 값입니다: standard 0은 CISPR 32, 1은 FCC Part 15 15.109절이며, emissionClass 0은 Class B, 1은 Class A입니다. 이를 지정하지 않은 요청은 이전처럼 CISPR 32 Class B이므로 여유가 바뀌지 않습니다. FCC 한도는 30 MHz부터 40 GHz까지 적용되며, 규격 범위 밖에서는 여유가 null입니다. 출력의 레이블은 이제 "Margin to Limit"입니다.

  49. minimum-conductor-spacing에 부품 리드 열 A6과 A7, 그리고 B4 출력이 추가되었습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    condition 4는 A6(외부 부품 리드 또는 단자, 코팅 없음, 해발 0~3,050 m), 5는 A7(외부 부품 리드 또는 단자, 컨포멀 코팅)이며, 둘 다 IPC-2221B Table 6-1에 따른 것입니다. 3,050 m를 넘으면 표가 A6을 3,050 m까지만 제시하므로, A6 요청은 경고와 함께 null 간격을 반환합니다. 새 출력 spacingB4는 B4 열(외부 도체, 영구 폴리머 코팅)이며, spacingB1, spacingB2, spacingB3과 나란히 있습니다. 조건 0~3과 기존 출력은 바뀌지 않습니다.

  50. bga-land-pad는 IPC-7351B처럼 볼 지름으로 랜드 크기를 정합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    랜드는 밀도 레벨에 따라 볼 지름의 1.0, 0.9, 0.8배였는데, 이는 어떤 IPC 표에도 없습니다. 이제 IPC-7351B를 따라, 찌그러지는 볼은 볼 크기에 따라 볼보다 25, 20, 15 % 작게 합니다. 기본값에서 padDia는 0.55에서 0.45 mm로 바뀌며, 이로부터 구하는 출력도 이를 따릅니다. IPC-7351B는 BGA 랜드에 밀도 레벨을 적용하지 않으므로 densityLevel 입력은 폐지했습니다. 이를 보내는 요청에는 값을 읽지 않았다는 경고와 함께 답합니다.

  51. bldc-winding: 코일은 적어도 한 슬롯에 걸칩니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    슬롯 수를 극수로 나눈 값이 반올림해서 0이 되면(예: 14극에 6슬롯), 코일 피치가 0, 권선 계수가 0이었고 actualKv와 deltaEquivKv는 null이었습니다. 집중권 코일은 티스 하나에 감으므로, 이제 피치는 적어도 한 슬롯이고 이 출력들은 숫자입니다.

  52. emi_radiated 작업은 대역 경계에서 더 엄격한 한도를 적용합니다

    • POST /api/py/v1/jobs

    정확히 88, 216, 960 MHz(FCC Part 15)와 230 MHz(CISPR 32)에서는 인접한 두 한도 중 느슨한 쪽을 썼습니다. 47 CFR 15.109(c)는 대역 경계에서 더 엄격한 한도를 적용한다고 하며, CISPR 32는 전이 주파수에서 낮은 쪽 한도를 적용합니다. 이제 둘 다 그대로 적용합니다.

  53. 계산기 31종의 입력 범위

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    계산기 30종의 입력에 최댓값을 두어(대부분 선로, 패드, 안테나, 도파관 같은 형상 계산기) 페이지에서 이를 역산할 수 있게 했으며, i2c-pullup의 버스 커패시턴스는 이제 Fast-mode Plus의 한도인 550 pF까지 받습니다. API는 입력 범위를 넘는 값을 거부하지 않으며, provenance.validRange가 범위 밖으로 보고합니다.

  54. 센서 계산기 12종에 프런트엔드가 추가되었습니다: 그 전압, ADC 코드, 분해능

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    ntc-thermistor, rtd-temperature, pt100-resistance, thermocouple-voltage, wheatstone-bridge, strain-gauge-bridge, pressure-bridge-output, load-cell-amplifier, hall-effect-sensor, current-shunt, accelerometer-sensitivity, lvdt-sensitivity는 선택 사항인 프런트엔드 입력을 받아 새 출력 3개를 반환합니다. 입력은 분압기(fixedResistor, sensorPosition 또는 ntcPosition)나 증폭기(frontGain), 그리고 ADC(adcRef, adcBits)이며, 계산기에 이미 있던 입력(gain, amplifierGain, adcVoltage, supplyVoltage)을 재사용합니다. 출력은 프런트엔드의 전압(dividerVoltage 또는 amplifiedVoltage), adcCode(단극성 N비트 코드, 0~2^N − 1 사이로 제한), resolution(그 지점에서 ADC 한 스텝당 물리량)입니다.

    load-cell-amplifier는 셀에 걸린 하중(appliedLoad)을 받아 그 출력(bridgeOutputMv)을 반환하며, accelerometer-sensitivity는 acceleration을 받아 outputVoltage를 반환합니다.

    새 입력은 모두 선택 사항이며, 기본값에서는 기존 출력이 모두 바뀌지 않습니다. 이 변경 전에 작성한 요청은 이전과 같은 값에 새 출력을 더해 반환합니다.

  55. current-shunt: 증폭기 이득의 기본값은 20입니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    요청에서 amplifierGain을 생략하면 current-shunt는 이제 50 대신 20을 씁니다. 다른 기본값(10 mΩ에 10 A, 3.3 V ADC)에서 이득 50은 ADC에 5 V를 걸어 기준 전압을 넘었습니다. 이득 20이면 2 V입니다. 이런 요청에서는 amplifiedVoltage와 adcResolutionCurrent가 바뀌며, amplifierGain을 지정한 요청은 영향을 받지 않습니다.

  56. hall-effect-sensor: 0 이하의 자기장은 거부됩니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    hall-effect-sensor는 사이트가 이미 그랬듯이 0 mT 이하의 Bfield에 오류를 반환합니다. 이전에 API는 그 값으로 계산한 값을 반환했습니다.

  57. frequency-ppm-tolerance: 경고는 해당하는 클록 허용 오차를 인용합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    frequency-ppm-tolerance의 경고는 ±50 ppm UART 예산을 인용했고(UART가 허용하는 것은 약 2 %), ±100 ppm이 USB에는 너무 느슨하다고 했습니다(USB는 풀 스피드에서 ±2500 ppm을 허용). 이제 ±50 ppm을 넘을 때의 경고는 100BASE-TX Ethernet과 Bluetooth LE 무선 클록을 인용합니다. ±100 ppm을 넘으면 모든 Ethernet 클록을, ±500 ppm을 넘으면 USB 2.0 하이 스피드를 인용합니다. 50 ppm과 100 ppm 임계값은 바뀌지 않으며, 500 ppm 임계값은 새로 추가되었습니다.

  58. rftools 자체 열 모델로 구한 기판별 배선 폭과 온도 상승

    • POST /api/py/v1/calculate (trace-width-current, pcb-trace-temp)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    trace-width-current에 이 기판에서의 최소 폭 widthBoardMm가, pcb-trace-temp에 그 기판에서의 상승과 최고 온도 tempRiseBoard와 maxTempBoard가 추가되고, 둘 다 inModelRange를 얻습니다. 이 값들은 rftools 자체 열 모델에서 나오며, IPC-2152로 표시하지 않습니다. 배선, 적층판, 플레인, 정지 공기(대류와 복사)를 푸는 테스트 전용 2차원 유한 체적 솔버에 피팅한 닫힌 형식의 열 회로망으로, 공개된 측정(IPC-TM-650 2.5.4.1A 조건, Brooks와 Adam이 IPC-2152 차트에 맞춘 식 등)과 대조하며, 그중 최악의 경우를 바탕으로 상승에 15 %의 여유를 둡니다. 검증된 범위(배선 폭 0.25–5.1 mm, 기판 1.4–3.2 mm, 내층 배선은 폭 1.27 mm부터, 상승 5–100 °C, 플레인은 0.1 mm 이상) 안에서는 피팅이 솔버와 2.81 % 이내로 일치합니다.

    새 입력은 기본값과 함께 끝에 추가했으므로 기존 요청은 바뀌지 않고 계산됩니다: 두 계산기의 boardThickness(mm, 기본값 1.6), planeDistance(구리 플레인까지의 mm, 0은 플레인 없음), planeCopperWeight(oz, 기본값 0.5), 그리고 pcb-trace-temp의 isExternal. 기존 출력은 모두 바뀌지 않습니다. 기본값에서 widthBoardMm는 0.30212 mm(Figure 5-1에서는 0.78144 mm), tempRiseBoard는 10.2818 °C입니다.

    검증된 범위 밖에서도 결과는 보고되며, inModelRange가 0이 되고 경계를 밝히는 경고가 붙습니다. 1.4 mm 미만의 기판에서는 모델과 IPC-2152가 공개한 두께 데이터가 일치하지 않으므로 Figure 5-1을 안내합니다. 열폭주가 일어나면 기판별 상승은 null을 반환합니다. 이 두 계산기에서는 provenance.validRange에 models가 추가되며, 피팅한 각 모델이 자체 inside를 가집니다: 먼저 IPC-2152 Figure 5-1의 피팅, 다음으로 열 모델이며, 둘 중 하나라도 범위 밖이면 status는 outside입니다. 이 계산기들에 전류, 상승, 구리 무게, 길이가 0이거나 음수인 요청은 API처럼 브라우저에서도 거부되며, 음의 전류는 500으로 답하지 않고 거부됩니다.

  59. 계산기가 계산할 수 없던 출력 7개를 제거했습니다

    • POST /api/py/v1/calculate (differential-via, usb-termination, parabolic-dish-antenna)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    differential-via는 더 이상 diffImpedance, commonImpedance, oddImpedance, evenImpedance, singleEndedImpedance를 반환하지 않습니다. 전자기장 해석(닫힌 형식 4개로 검증한 3차원 준정적 솔버로, openEMS 풀웨이브 해석과 0.4 %로 교차 확인)에 따르면, 비아 페어의 임피던스는 그것이 지나는 플레인의 피치에 따라 달라지며, 이는 입력에 없습니다. 기본값에서 플레인 피치 0.1 mm일 때 85.6 Ω, 1.0 mm일 때 96.0 Ω인데, 계산기는 44.10 Ω으로 표시했습니다. 계산기의 입력으로 만든 어떤 관계식도 모든 경우에 10 % 이내로 맞지 않으며, 공통 모드 임피던스는 귀환 전류가 흐르는 위치에도 따라 달라집니다. 스터브 공진과 손실은 계속 반환됩니다. 수정 항목을 참고하세요.

    usb-termination은 어떤 USB 규격에도 정의되지 않은 경험적 값인 eyeOpening을 더 이상 반환하지 않습니다. parabolic-dish-antenna는 noiseTemperature를 더 이상 반환하지 않습니다. 이 값은 290·(1 − η)였지만, 안테나의 잡음 온도는 앙각, 스필오버, 하늘에 따라 달라지며 계산기는 그중 어느 것도 받지 않습니다.

    이 키를 읽는 호출자는 읽기를 멈춰야 합니다. 키는 null이 아니라 아예 없습니다. 세 계산기의 다른 모든 출력은 계속 반환됩니다.

  60. 존재하지 않는 값은 0이나 센티널 값이 아니라 없거나 null입니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    다음 출력은 양이 정의되지 않을 때 이전에는 숫자였지만 이제 null입니다: 송신기 상승 시간을 규정하지 않는 USB 3.0에서 usb-termination의 signalRiseTime(USB 2.0은 최솟값 500 ps, T_HSR를 읽음), 집중 정수 모델이 성립하지 않는 약결합 한계 (x_C + x_L)/2 = 0.1을 넘는 경우 pcb-crosstalk-emc의 결합 출력, 밀폐형 정렬이 존재하지 않는 Qts ≥ 0.707에서 subwoofer-box의 vbSealed와 f3Sealed(2·Vas로 표시), 자기 공진 주파수 이상에서 planar-spiral-inductor의 qFactor, 재고 공구가 맞지 않을 때 aperture-diagonal의 커버 드릴과 라우터 비트(0으로 표시), 저항이 없을 때 lc-resonance의 qFactor(무손실 회로의 상한 없는 Q. 9999로 표시되었고 대역폭은 f₀/9999였으나 이제 대역폭은 0), 스터브가 없을 때 differential-via의 stubResonance(0 GHz로 표시). 각 null에는 이유를 밝히는 경고가 붙습니다.

    이 계산기들이 0이나 일부 값을 반환하던 경우, 거부된 입력은 이제 오류와 함께 값을 반환하지 않습니다: power-density, thermal-via-array, 채널이 없는 bga-breakout-width, h₂ ≤ 0인 dual-stripline, fresnel-zone, 그리고 doppler-shift, reactance-calculator, broadside-coupled-pair, fusing-current, rise-time-bandwidth, current-divider, delta-wye-conversion, voltage-drop, rt60-reverberation, vfd-motor-speed의 모든 거부. 오류 옆의 0은 결과로 읽혔습니다.

    이 값을 숫자로 다루던 호출자는 null인지, 또는 오류 옆에 키가 없는지 확인해야 합니다. /calculate/solve는 이미 그 출력이 없는 점을 건너뜁니다.

  61. 계산기를 참고 문헌에 맞춰 수정하고, 새 입력 3개와 새 출력을 추가했습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • POST /api/py/v1/jobs (emi_radiated)
    • MCP run_calculation
    • MCP simulate_emi_radiated
    • rftools-io SDK

    상수. 구리 저항률은 모든 곳에서 IEC 60028의 1/58 Ω·mm²/m입니다(trace-resistance는 기본값에서 100.217 → 100.458 mΩ, 다른 구리 계산기는 0.008 %, 표피 깊이는 0.004 % 바뀝니다). 마이크로스트립 엔진은 60 대신 η₀/2π와 정확한 빛의 속도를 쓰므로, 마이크로스트립 기반 임피던스가 모두 −0.069 % 바뀝니다(microstrip-impedance 80.954 → 80.898 Ω, differential-pair 99.983 → 99.914 Ω, 역산한 폭도 함께 바뀜). 이제 모든 계산기가 하나의 η₀ = µ₀·c(CODATA 2018)를 공유합니다. power-density의 파동 임피던스는 µ₀·c, 376.730 Ω입니다(이전에는 120π). controlled-impedance의 지연은 √εeff/0.299792458 ps/mm입니다(6.52995 → 6.53447). emi_radiated 작업은 전자기장에 π·µ₀/c와 µ₀를 쓰므로, 이제 radiated-emission-estimate와 일치합니다(이전에는 0.021 dB와 0.023 dB 높게 표시).

    모델. planar-spiral-inductor는 Jow와 Ghovanloo의 기생 성분과 그 형상의 배선 길이를 씁니다. 기본값에서 자기 공진은 68.0 → 601.7 MHz, 100 MHz에서의 Q는 814.5 → 116.8이며, Q를 위한 새 선택 입력 frequency(MHz, 기본값 100)가 추가되었습니다. pcb-crosstalk-emc는 Paul의 양단 모델입니다. 기존 키는 한쪽 끝당 값(이전 값의 절반)이며, farEndCrosstalk가 새로 추가되었고, 기본값은 3.3 V, 25 MHz 클록입니다. subwoofer-box는 Margolis와 Small의 방법으로 포트를 튜닝하며(20.246 → 40.273 Hz) f3Vented를 추가합니다. pcb-crosstalk는 새 입력 dielectricConst(기본값 4.5, 결합 6.77 → 5.72 %)와 함께 결합 마이크로스트립 엔진으로 계산합니다. patch-antenna의 가장자리 저항은 정확한 η₀를 쓴 Balanis의 방사 슬롯 모델이며, 제한을 두지 않습니다(306.80 → 321.22 Ω, 급전 저항과 50 Ω 인셋도 이를 따름). lc-resonance는 어느 토폴로지에서든 직렬 저항을 직렬 손실로 보고 Q = Z₀/R로 계산하며(병렬 모드는 R/Z₀로 계산했습니다), impedanceAtResonance_ohm을 추가합니다: 직렬이면 R, 병렬이면 L/(C·R). differential-via의 스터브 공진은 무부하 상한으로 표시되며, 도체 손실은 조밀한 플레인에서의 상한입니다(0.030 → 0.011 dB).

    규칙. 마이크로비아 어레이는 단면적의 합으로 정격을 정합니다(IPC-2221 주 5, 비아 10개에서 2.762 → 1.466 A). 비아 자기 발열은 via-voltage-drop(0.2506 → 0.0313 °C)과 microvia-current-capacity에서 배럴의 피크 값 P·L/(8kAN)입니다. bga-breakout-width는 가장 바깥 열을 셉니다(escapeRows 1 → 2). padstack-annular-ring은 종횡비를 IPC-2222 Table 9-4에 비추어 판정하고(모든 등급에서 8:1), Table 9-6에 따른 최소 드릴 지름을 확인하며, Class 3의 내층 링은 0.025 mm입니다. thermal-via-array는 비아를 정수 개로 셉니다. i2c-pullup과 rs485-termination은 저항값을 반올림하지 않고 반환합니다(표시는 여전히 반올림합니다). aperture-diagonal은 새 입력 routerBit를 받습니다.

    새 입력 중 하나를 생략한 요청에는 그 기본값이 적용됩니다.

  62. 어떤 입력에서도 한 값만 갖던 출력 4개를 제거했습니다

    • POST /api/py/v1/calculate (balun-transformer, opamp-bandwidth, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    다음 출력은 입력과 관계없이 같은 값을 반환했으며, 어느 것도 계산 결과가 아니었습니다: balun-transformer의 vswr(1.0, "VSWR (ideal)")과 insertionLoss(0.3 dB, "Typical Insertion Loss"), opamp-bandwidth의 slewLimited(0, 계산기에 없는 슬루율과 진폭 입력이 필요한 확인을 위한 자리 표시 값), capacitor-code의 voltageCode(0 V, 3자리 코드가 담지 않는 정격). 이 출력들은 거부 옆에서도 더 이상 반환되지 않습니다.

    이 키를 읽는 호출자는 읽기를 멈춰야 합니다. 키는 null이 아니라 아예 없습니다. 각 값이 나타내던 내용은 대신 provenance.assumptions에 적혀 있습니다: balun-transformer의 ideal-transformer(구조상 정합되어 있으며, 코어와 권선 손실은 모델링하지 않습니다. 페라이트 발룬의 손실은 보통 0.1-1 dB입니다)와 capacitor-code의 capacitance-only. 세 계산기의 다른 모든 출력은 바뀌지 않습니다.

  63. loop-antenna의 이득에 방사 효율이 포함됩니다

    • POST /api/py/v1/calculate (loop-antenna, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    loop-antenna의 gain은 어떤 입력에서도 1.76 dBi였습니다. 이는 소형 루프의 지향성 3/2로, 손실이 전혀 반영되지 않았습니다. 이제는 그 지향성에, 계산기가 이미 반환하는 두 저항으로 구한 방사 효율 e = R_rad/(R_rad + R_loss)를 곱한 값입니다: G = 10·log₁₀(1.5·e)(Balanis, Antenna Theory, 4판, 2장과 5.2절). 기본값(7 MHz에서 지름 10 mm 구리로 만든 1 m 루프)에서는 −9.4043 dBi로, 이전 값보다 11.2 dB 낮습니다. 방사 저항에 비해 손실이 작은 루프는 여전히 1.76 dBi에 가깝습니다. 효율은 새 출력 radiationEfficiency(%)이며, 기본값에서 7.6467 %입니다.

    API의 capacitor-code는 소수 코드를 짝수 쪽으로 반올림했지만 페이지는 사사오입했기 때문에, 104.5는 API에서 100 nF, 페이지에서 1 µF로 해석되었습니다. 이제 둘 다 1 µF입니다.

  64. 결과를 바꾸지 않던 입력 8개가 이제 결과를 정하며, 새 출력 11개가 추가되었습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    아래의 각 입력은 선언되어 있었지만 어떤 출력도 읽지 않았습니다. 이제는 기존 출력 뒤에 추가한 새 출력을 정하며, 그 출력은 계산기가 이미 쓰는 관계식으로 계산합니다. 어떤 입력에서도 기존 출력은 바뀌지 않습니다. patch-antenna: feedOffset은 feedResistance_ohm, R_edge·cos²(π·y₀/L)를 정합니다(Balanis, Antenna Theory, 4판, 14.2.1절, 식 14-20a). 기본 가장자리 급전에서 306.795 Ω, 10 mm에서 65.501 Ω입니다. insetFeedPosition_mm는 50 Ω이 되는 인셋으로, 10.594 mm입니다. flyback-converter: fsw는 primaryInductance(µH)를 정합니다. 계산기 자체의 경계 전도 모드 피크 전류에 대한 Vin·D/(fsw·Ipk)로, 130.56 µH입니다. solar-panel-sizing: batteryCapacity는 batteryAutonomyDays를 정합니다. 필요 용량이 가정하는 50 % 방전 깊이에서의 C·V·0.5/(P·24 h)로, 0.25일입니다. rs485-termination: baudRate는 baudRateUtilisation(%)을 정합니다. 최대 10⁸ bit·m에 대한 속도의 비율로, 11.52 %입니다. adc-snr: samplingFreq는 nyquistZone, ⌊f_in/(f_s/2)⌋ + 1과 aliasFrequency(MHz), |f_in − f_s·round(f_in/f_s)|를 정합니다(Kester, Analog Devices MT-002). 기본값에서는 영역 1과 1 MHz, 100 MSPS에서 70 MHz이면 영역 2와 30 MHz입니다. bldc-thermal: continuousCurrent는 ratedCurrentShare(%)를 정합니다. 정격에 대한 동작 전류의 비율로, 75 %입니다. bldc-winding: supplyVoltage는 noLoadSpeed(rpm), Kv·V를 정하며, 11,406.44 rpm입니다. 수치는 각 계산기의 기본값에서의 값입니다.

    새 출력이 두 개 더 있습니다: yagi-antenna의 assumedBoomLength(m)는 소자 간격 0.2λ에서 나오는 붐 길이 (N − 1)·0.2λ로, 기본값에서 1.6655 m이며, 폐지한 붐 길이 입력을 대신합니다(해당 항목 참고). 그리고 loop-antenna의 radiationEfficiency(%)입니다(이득 항목 참고). 사이트에서만, ism-coexistence의 실시간 규제 정보 위젯이 이제 bandIndex로 고른 대역을 표시합니다. 계산 결과는 바뀌지 않습니다.

    이 입력 중 하나를 생략한 요청에는 그 기본값이 적용됩니다. feedOffset이 없는 patch-antenna와 batteryCapacity가 없는 solar-panel-sizing은 지금까지 400으로 답했지만, 이제 둘 다 답합니다.

  65. 결과를 전혀 바꾸지 않던 입력 12개를 폐지했습니다. 이를 보내는 요청에는 경고와 함께 답합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • MCP get_calculator_schema
    • rftools-io SDK

    다음 입력은 선언되어 있었지만, 어떤 값도 출력, 경고, 거부를 바꾸지 않았습니다: smith-chart의 frequency, via-calculator의 signalLayer, stackup-builder의 layerCount(모델은 고정된 4층 구성이며, 이제 제목에도 그렇게 적혀 있습니다), i2c-pullup의 numDevices, fm-modulation-index의 carrierFreq, quantization-noise의 frequency, 555-timer의 vcc, bldc-efficiency의 polePairs, opamp-bandwidth의 phase_margin, battery-internal-resistance의 temperature, rs485-termination의 numNodes, yagi-antenna의 boomLength. 이 입력들은 카탈로그, 출처 정보의 경계, MCP 스키마에서 빠지며, 각 계산기는 이를 날짜와 함께 retiredInputs에 기재합니다.

    이 입력을 여전히 보내는 요청에는 이전과 같은 값과 기존 경고 "Input '<key>' is not read by this calculator and was ignored."로 답합니다. 거부되지 않습니다. POST /calculate/solve는 선언되지 않은 다른 입력처럼 이 입력에 대한 역산을 거부합니다. 그 값을 어떻게 바꿔도 출력은 움직이지 않았기 때문입니다. boomLength가 없는 yagi-antenna 요청은 지금까지 400으로 답했지만, 이제 답합니다.

    다음 rftools-io 릴리스는 폐지된 각 키워드를 유지합니다. 이를 전달하면 키와 폐지 날짜를 밝히는 DeprecationWarning이 발생하며, 그 키는 전송되지 않습니다.

  66. trace-width-current는 IPC-2152 폭을 IPC-2152 Figure 5-1에서 읽고, pcb-trace-temp는 IPC-2152 상승을 보고합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    IPC-2152로 표시되던 trace-width-current의 width2152mm는 IPC-2221 폭에 외층에서 0.75, 내층에서 0.85를 곱한 값이었습니다. 이는 IPC-2152에 없는 계수이며, 2 A 이상에서는 어떤 IPC-2152 판독값보다도 좁았습니다. 이제는 IPC-2152가 모든 환경의 내층·외층 도체에 권장하는 차트인 IPC-2152(2009) Figure 5-1을 공개된 피팅 I = 0.024·ΔT^0.44·A^0.725로 씁니다. 어느 층에서나 같습니다. 기본값에서 0.7814 mm(이전 0.2266 mm), 외층에서 5 A, 상승 10 °C, 1 oz이면 7.194 mm(이전 2.086 mm)입니다. Olson(2010)의 Figure 5-1 판독값 300 sq mil과 680 sq mil을 5 % 이내로 재현합니다. 키는 바뀌지 않으며, 레이블은 이제 "Min Width (IPC-2152 Fig. 5-1)"입니다.

    두 계산기 모두 구리를 온스당 35 µm로 보므로 width2221mm는 −0.58 % 바뀝니다(기본값에서 0.3004 mm, 이전 0.3021 mm). trace-width-current의 resistance, voltageDrop, powerDiss는 IPC-2221 최소 폭 대신 새 입력인 실제로 그리는 배선 폭에 대해, IEC 60028의 1/58 Ω·mm²/m 구리로 계산합니다: 기본값에서 0.10433 Ω(이전 0.17326 Ω).

    새 선택 입력을 끝에 추가했으며, 생략한 요청에는 기본값이 적용됩니다: trace-width-current의 traceWidth(mm, 0.5). 새 출력: 두 계산기의 inChartRange(IPC-2152 Figure 5-1이 그리는 범위 안이면 1, 밖이면 0이며, 피팅의 최대 잔차와 함께 provenance.validRange에도 반영), 그리고 pcb-trace-temp의 tempRise2152와 maxTemp2152. 이는 IPC-2221 외층 상승과 나란히 보여 주는 Figure 5-1에서의 상승(k = 0.024, 모든 층)으로, 기본값에서 5.342 °C에 대해 25.815 °C입니다. pcb-trace-temp의 기존 출력은 키와 값이 그대로입니다.

    차트 범위 밖의 결과는 보고되고 표시되며, 거부되지 않습니다. 경고에는 양과 차트 경계가 적힙니다: Figure 5-1의 10~45 °C 곡선과 700 sq mil, 외층에서 IPC-2221 차트 A의 10~100 °C와 700 sq mil, 차트 B의 ½~3 oz. Figure 5-1 범위를 넘으면 provenance.validRange.status는 outside입니다.

    인용: trace-width-current, pcb-trace-temp, microvia-current-capacity, via-calculator는 전류 차트의 출처로 IPC-2221B를 인용했지만, 그 판(2012)에는 이 차트가 없습니다. 이제는 IPC-2221(1998)의 차트인 IPC-2221A(2003) Figure 6-4와 IPC-2152(2009) Figure 5-1을 인용합니다. 뒤의 두 계산기는 어떤 값도 바뀌지 않습니다.

  67. 계산기 12종이 페이지와 참고 문헌에 적힌 모델로 계산합니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    아래의 각 계산기는 페이지와 참고 문헌이 설명하는 모델의 일부만 계산했으며, 이는 브라우저, API, MCP 서버에서 모두 같았습니다. 이제 각각 공개된 모델로 계산하고 공개된 사례에 대해 테스트하며, 패리티 스윕으로 브라우저와 API가 같은 수치를 내도록 합니다. 저장한 계산은 입력을 저장하므로 다시 계산됩니다. 같은 변경에 포함된 bldc-winding은 2026-10-11 자 별도 항목이 있습니다.

    값이 바뀌는 계산기: cable-shield-effectiveness(전달 임피던스 R_T + jωM_T와 선로 임피던스에 대한 차폐 효과, Hähner & Mund 1998: 기본값에서 64.95 dB, 이전에는 1 Ω 기준 30.97 dB, 0 dB 하한 없음), ferrite-bead(Analog Devices AN-1368의 R_DC + (R_AC ∥ L ∥ C)를 입력한 100 MHz 임피던스에 맞추고, 신호원과 부하 사이의 복소 삽입 손실을 구함: 기본 600 Ω 비드는 1 GHz에서 94.9 Ω, 이전 1897 Ω), mosfet-operating-point(드레인 부하선 위의 동작점, Sedra & Smith 7판 5.3절. 아래의 호환되지 않는 변경 항목 참고), bldc-motor(모터와 프로펠러의 토크가 균형을 이루는 회전수에서의 추력, Drela 2007, C_P 0.047: 기본값에서 140.91 g, 이전에는 무부하 회전수의 고정 75 %에서 80.43 g), ethernet-cable(각 PHY의 신호 주파수 31.25, 62.5, 400 MHz에서의 ANSI/TIA-568-C.2 케이블 삽입 손실: 기본값에서 7.69 dB, 이전 16.5 dB. Category 8은 모든 속도에서 30 m 채널), radar-range-equation(P_d와 P_fa에 대해 Albersheim 식이 요구하는 SNR에서의 거리: 기본값에서 35.23 km, 이전에는 SNR = 1에서 74.96 km. snrAtMaxRange는 그 SNR을 보고하며 이전에는 0), bldc-efficiency(단자 간 저항에 의한 구리 손실 I²·R, Drela 2007과 maxon Formulae Handbook: 기본값에서 4.500 W, 이전 6.750 W), bldc-thermal(권선이 도달하는 온도에서의 권선 저항, maxon Formulae Handbook 9.2절, 같은 구리 손실: 기본값에서 207.61 °C, 이전 184.47 °C. 아래의 호환되지 않는 변경 항목 참고), class-d-efficiency(동시에 부하 전류를 흘리는 FET를 통한 전도 손실 I²·R_DS(on)·N/2: 기본값에서 0.625 W, 이전 1.250 W), motor-driver-power(전도하는 FET 2개와 하드 스위칭하는 FET 1개, TI SLVA504A: 기본값에서 브리지 0.1440 W, 이전 0.2088 W), 그리고 coax-impedance와 via-calculator(60 대신 CODATA 2018 상수로 구한 η₀/2π = 59.9585 Ω에서의 Z₀: 기본값에서 47.990 Ω과 35.2243 Ω, 이전 48.023 Ω과 35.2487 Ω).

    새 선택 입력을 끝에 추가했으며, 생략한 요청에는 기본값이 적용됩니다: cable-shield-effectiveness의 transferInductance(nH/m, 0.159155, 10 mΩ/m에서 이전의 전달 임피던스를 재현)와 lineImpedance(Ω, 50), ferrite-bead의 beadInductance(µH, 1.208), parasiticCapacitance(pF, 1.678), sourceImpedance(Ω, 0), mosfet-operating-point의 biasMode(0은 부하선을 풀고, 1은 입력한 V_DS를 그대로 사용, 기본값 0), radar-range-equation의 pd(0.9), pfa(1×10⁻⁶), pulses(1, 비코히어런트 적분), motor-driver-power의 transitionTime(ns, 50).

    새 출력: mosfet-operating-point의 vdsOperating, bldc-motor의 loadedRpm과 loadedCurrent, motor-driver-power의 gateDriveLoss(2·Q_g·V·f, 게이트 드라이버에서 소모).

    키는 그대로 두고 의미를 레이블에 맞췄습니다: motor-driver-power의 conductionLoss는 전도하는 한 위치의 손실(I²·R), switchingLoss는 하드 스위칭하는 FET 하나의 손실, totalLossPerFet은 가장 뜨거운 FET의 손실이며, efficiency는 V·I·D에 대해 구하고 게이트 구동을 포함합니다. bldc-efficiency와 bldc-thermal의 phaseResistance 입력은, 원래 그랬듯이 두 리드 사이에서 잰 단자 간 저항으로 표시됩니다.

    Category 8 삽입 손실은 IEEE 802.3bq 채널 모델이 TIA Category 8에 대해 인용하는 초안 계수(draft d0.7: 100 m당 1.8·√f + 0.005·f + 0.25/√f dB)를 쓰며, 모든 Category 8 결과에 이를 밝힙니다. 공개된 TIA-568.2-D 표를 확인할 수 없기 때문입니다.

    새 거부와 경고: ferrite-bead는 그 L과 C로 도달할 수 없는 100 MHz 임피던스를 거부하고, 도달할 수 있는 최댓값을 밝힙니다. radar-range-equation은 그 P_fa에서 어떤 검출기도 만족할 수 없는 P_d를 거부하고, Albersheim 식이 밝힌 범위 밖에서는 경고합니다. cable-shield-effectiveness는 케이블이 파장의 6분의 1보다 길거나 결합이 더 이상 약하지 않을 때 경고합니다. ethernet-cable은 카테고리가 규정된 주파수를 넘어 평가될 때 경고합니다.

  68. mosfet-operating-point는 기본적으로 부하선을 풀며, bldc-thermal은 권선이 열폭주하면 null을 반환합니다

    • POST /api/py/v1/calculate (mosfet-operating-point, bldc-thermal)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    mosfet-operating-point는 이제 기본적으로 제곱 법칙과 드레인 부하선 V_DS = V_DD − I_D·R_D를 함께 풉니다(Sedra & Smith, Microelectronic Circuits, 7판, 5.3절, 예제 5.5). 따라서 동작점은 vdd와 rdLoad로 정해지며, 입력한 vds로는 더 이상 정해지지 않습니다. 기본값에서는 V_DS 0.0401 V의 선형 영역에서 11.96 mA입니다. 이전에는 450 mA였는데, 1 kΩ 부하로는 12 V에서 그만한 전류를 흘릴 수 없습니다. 입력한 vds에 의존하는 호출자는 biasMode: 1을 보내야 합니다. 이는 이전 계산을 유지하며, V_DS + I_D·R_D가 V_DD에서 1 % 넘게 벗어나면 경고합니다. 새 출력 vdsOperating은 어느 모드에서든 동작점의 V_DS를 알려 줍니다.

    bldc-thermal은 이제 온도에 따른 권선 저항의 상승을 포함합니다(maxon Formulae Handbook, 2012, 9.2절). α·Rθ·R₂₅·I² ≥ 1이면 정상 상태가 없습니다. 온도에 따라 구리 손실이 늘어나는 속도가 열 경로가 열을 빼내는 속도보다 빠르기 때문입니다. 이 경우 tempRise, steadyStateTemp, thermalMargin, hotResistance는 null이며, 권선이 안정되는 전류의 상한을 밝히는 경고가 붙습니다. 이전에는 숫자였습니다(기본 모터에서 25 A일 때 467.97 °C. 이 모터는 이제 23.21 A를 넘으면 열폭주합니다). 이 값을 숫자로 읽는 호출자는 null을 처리해야 합니다. deratedCurrent와 timeToLimit은 항상 숫자입니다.

    bldc-thermal의 timeToLimit은 피크 전류에서 권선이 한계보다 낮은 온도로 안정되어 한계에 결코 이르지 않으면, 경고와 함께 null입니다. 이전에는 센티널 값 9999 s로, 실제 시간처럼 읽혔습니다.

  69. bldc-winding: 점적률은 양쪽 코일 변을 세고, 권선 계수는 스타 오브 슬롯 방법으로 구합니다

    • POST /api/py/v1/calculate (bldc-winding)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    fillFactor는 이제 각 슬롯의 양쪽 코일 변을 셉니다: 2·N·A_wire/A_slot(Pyrhönen, Jokinen & Hrabovcová, Design of Rotating Electrical Machines, 2008, 2.9절). 모든 티스에 코일을 하나씩 감으면 모든 슬롯에 코일 변이 두 개 들어갑니다. 이전에는 하나만 셌으므로 모든 점적률이 두 배가 됩니다. 100 %에서의 상한도 없어졌습니다. 들어가지 않는 권선은 실제 값을 반환하며, 75 %와 90 % 경고는 이전과 같습니다.

    windingFactor는 분포 계수를 스타 오브 슬롯 방법으로 구합니다: 기약분수 q = S/(3P) = z/n에 대해 k_d = sin(π/6)/(z·sin(π/(6z)))(Bianchi & Dai Pré, 2006). 이전에는 반올림해서 1이 되는 모든 q에서 1이었기 때문에 분수 슬롯 권선이 높게 나왔습니다. 12슬롯 14극은 이제 0.93301(이전 0.96593), 18슬롯 16극은 0.94521(이전 0.98481)입니다. 정수 슬롯 권선은 바뀌지 않습니다. turnsPerCoil, actualKv, deltaEquivKv, phaseResistance도 이를 따릅니다. 기본 935 Kv 권선은 4턴 그대로이며 1027.61 Kv(이전 992.59)가 되고, 23 × 10 mm 스테이터에서 920 Kv는 6턴(이전 5)이 필요합니다.

    계산기의 기본 maxCurrent는 5 A(이전 10 A)이므로 기본 EMAX MT2213 권선을 실제로 감을 수 있습니다: AWG 18로 4턴, 점적률 47.24 %. 10 A에서는 AWG 14와 119.44 %가 필요합니다. API는 기본값을 적용하지 않으므로, maxCurrent를 보내는 요청은 보낸 값으로 계산됩니다.

  70. 계산기 30종을 인용한 관계식에 맞게 수정했습니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    아래의 각 계산기는 인용한 참고 문헌과 다른 것을 계산했으며, 이는 브라우저, API, MCP 서버에서 모두 같았습니다. 이제 각각 참고 문헌의 관계식으로 계산하고 공개된 값에 대해 테스트합니다. 저장한 계산은 입력을 저장하므로 다시 계산됩니다.

    값이 바뀌는 계산기: equalizer-q-factor(정 Q 옥타브 대역폭), capacitor-code(승수 자리 8은 ×0.01, 9는 ×0.1), opamp-gain(대역폭은 GBW를 노이즈 이득으로 나눈 값), coax-impedance(평균 둘레에 따른 TE11 차단), h-bridge-selection(동시에 전도하는 FET는 2개), bldc-winding(√3 계수는 와이 결선에 해당, 기본값은 실제 12N14P 모터에서 가져옴), speaker-crossover(2차 인덕터는 √2·R/ω_c로 이전 값의 두 배, KiCad 내보내기도 마찬가지), esd-tvs-diode(IEC 61000-4-2 레벨은 규격의 첫 피크 3.75 A/kV를 사용), common-mode-choke(50 Ω/50 Ω 시스템에서의 복소 직렬 임피던스), uart-baud-rate(마크 패리티와 스페이스 패리티는 1비트로 셈), bldc-motor(정지 추력 C_T·ρ·n²·D⁴, C_T 0.11), resistor-color-code(주황 ±0.05 %, 노랑 ±0.02 %, 흰색 허용 오차 띠는 거부), pt100-resistance(0 °C 미만에서 IEC 60751의 C와 완전한 기울기), torque-units, energy-units, torque-unit-converter(NIST SP 811의 정확한 계수), via-thermal-resistance(IPC-2221 피팅에 따른 전류 용량), thermal-via-array(도금한 배럴은 충전과 관계없이 구리), stackup-builder(L3는 스트립라인으로, L1은 구리 두께를 포함해 풀고, 총두께에 구리를 포함), coplanar-waveguide(접지 CPW는 넓은 도체에서도 유한), i2c-pullup(2 V 이하에서 V_OL은 0.2·V_DD), vibration-phase-noise(랜덤 항은 오프셋에 따라 감소, 편차는 피크 값), inrush-current-limiter(콜드 스타트 피크는 V/R_cold), shielding-effectiveness(반사 손실에 η₀ 포함, 다중 반사 추가), ethernet-cable(10 Gb/s에서 Category 5e는 불합격), ground-plane-impedance(인덕턴스 µ₀·h·l/w, 한쪽 면의 교류 저항), minimum-conductor-spacing(IPC-2221B Table 6-1을 대역별로, 500 V를 넘으면 볼트당 비율).

    새 선택 입력: ground-plane-impedance의 separation(mm, 기본값 1)과 via-thermal-resistance의 tempRise(°C, 기본값 10). 이를 생략한 요청에는 기본값이 적용되며, 공개된 계산 예를 재현합니다.

    새 출력: inrush-current-limiter의 hotRestartInrush와 shielding-effectiveness의 multipleReflectionLoss.

    값이 없는 출력은 이전에는 숫자였지만 이제 경고와 함께 null을 반환합니다: 차단 주파수 미만에서 waveguide-cutoff의 관내 파장, 위상 속도, 군속도, 그리고 층이 도달할 수 없는 목표 임피던스에 대한 stackup-builder의 폭.

    comparator-hysteresis와 pcb-trace-temp는 레이블과 적힌 수식만 바뀌며, 숫자는 바뀌지 않습니다.

    POST /api/py/v1/calculate/solve는 범위 크기의 1×10⁻¹²보다 촘촘한 grid를, 평가 전에 과금 없이 400 grid 거부로 거부합니다. 이런 그리드는 시간 초과될 때까지 요청을 붙잡아 둘 수 있었습니다.

  71. radiated-emission-estimate: CISPR 32 Class B에 대한 여유, 한도가 없으면 null

    • POST /api/py/v1/calculate (radiated-emission-estimate)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    여유는 이제 측정 거리에서의 CISPR 32 Class B 한도에 대해 구합니다: Tables A.4와 A.5에서 1 GHz까지는 √30 m 미만이면 3 m 행, 그 이상이면 10 m 행을, 1~6 GHz에서는 3 m 평균값 행을 쓰고, 표의 거리에서 20 dB/decade로 환산하며, 대역 경계에서는 낮은 쪽 한도를 씁니다. 이전에는 모든 주파수와 거리에서 일률적으로 40 dBµV/m였습니다.

    30 MHz 미만과 6 GHz 초과에서는 CISPR 32가 방사 한도를 정하지 않으므로, 그곳에서 margin은 경고와 함께 null입니다. 이전에는 숫자였습니다. margin을 숫자로 읽는 호출자는 null을 처리해야 합니다.

    전계는 자유 공간에서의 소형 루프 추정값이며, 이제 정확한 상수 π·µ₀/c를 씁니다. 페이지에 적힌 대로, 접지면 위에서 측정하면 최대 6 dB 높게 나올 수 있습니다.

  72. filter-designer와 RF 계산기 6종을 수정했습니다

    • POST /api/py/v1/calculate
    • MCP run_calculation
    • rftools-io SDK

    filter-designer: 체비쇼프 프로토타입 값이 4차부터 틀렸고(g3 1.5733, 이제 2.3661), 1차 버터워스는 g1 = 1이었으며(이제 2), 밴드패스 소자 값은 Q = 10에서 10분의 1로 작았습니다. 값은 이제 표에서 찾지 않고 계산합니다.

    waveguide-cutoff, free-space-path-loss, rf-link-budget, fresnel-zone, link-margin, radar-range-equation은 3×10⁸이 아니라 정확한 빛의 속도를 씁니다. 길이는 약 0.07 %, 경로 손실은 0.006 dB 바뀝니다. radar-range-equation은 정확한 볼츠만 상수도 씁니다.

    planar-spiral-inductor는 외경 이상인 내경에 대해 NaN을 반환하지 않고 거부합니다.

    2026-10-05와 2026-10-06에 새 iot 카테고리를 포함해 계산기 14종을 추가했습니다. 카탈로그를 GET하거나 list_calculators로 확인하세요.

  73. PDN 임피던스: 수렴하는 플레인 모델, 도출되는 포트, 새 매개변수 2개

    • POST /api/py/v1/jobs (pdn_impedance)
    • POST /api/py/v1/jobs/estimate
    • MCP simulate_pdn_impedance
    • rftools-io SDK

    portX_mm와 portY_mm를 생략하면 이제 포트가 기판 중심이 아니라 3분의 1 지점 (a/3, b/3)에 놓입니다. 중심은 홀수 인덱스를 가진 모든 공동 모드의 마디이므로, 기본 실행에서 첫 공진이 전혀 나타나지 않았습니다. 포트를 지정한 요청에는 지정한 포트가 쓰입니다.

    선택 매개변수 두 개: portSize_mm(기본값 1 mm, 0.25–20)는 IC의 전류가 플레인으로 들어가는 정사각형의 한 변이며, boardInductance_nh(기본값 1 nH, 0–20)는 레귤레이터와 플레인 사이의 인덕턴스로 이전에는 1 nH로 고정되어 있었습니다. 기판 가장자리 밖으로 나가는 포트는 받아들이며 그 거울상으로 모델링합니다. 중심이 기판 밖에 있거나 기판보다 큰 포트는 거부됩니다.

    결과가 바뀝니다. 플레인의 모드 합은 freqMax_hz에 따라 잘렸고, 점 포트에서는 수렴하지 않았으므로 결과가 스윕 범위에 따라 움직였습니다. 이제는 수렴하며, 첫 모드 아래에서는 스윕 범위에 따라 달라지지 않습니다. 기본 포트에서 플레인의 확산 인덕턴스는 약 0.2 nH에서 약 1.5 nH가 되므로, 플레인 단독의 직렬 공진은 약 550 MHz에서 약 210 MHz로 내려가고, 추천 커패시터 조합도 바뀝니다. 과거의 결과는 다시 계산하지 않습니다.

    판정과 summary.maxZPdnDb은 이제 기판의 첫 공동 모드의 0.8배에서 끝나는 디커플링 대역 전체를 다루며, 최악의 값은 그리드 점 사이에서 정밀하게 구합니다. 새 결과 필드: summary.band, summary.worstHz, summary.unreachable, resonances[].portCoupling, 그리고 params 아래에 사용한 포트, 포트 크기, 기판 인덕턴스. 기존 필드는 모두 유지됩니다.

  74. 목표값 역산 호출: 목표 출력이 되는 계산기 입력을 탐색합니다

    • POST /api/py/v1/calculate/solve

    POST /api/py/v1/calculate/solve는 계산기 출력 하나를 목표값으로 만드는 입력 하나의 값(50 Ω이 되는 배선 폭, 목표 차동 임피던스가 되는 간격 등)을 찾아, 정확히 그 값에서의 순방향 결과와 함께 반환합니다: values, warnings, errors, provenance로, 그 입력에 대해 /calculate가 반환하는 것과 같습니다. 집계되는 호출 한 번으로, 클라이언트가 직접 탐색할 때 쓰는 여러 번의 순방향 호출을 대신합니다.

    탐색은 그 입력에 정해진 범위에서, 선택 사항인 range로 좁혀 이루어집니다. 범위가 정해지지 않은 입력에는 범위가 필요합니다. 선택 사항인 grid는 반환값을 범위 안의 가장 가까운 배수로 맞추며, 반올림 전의 해도 함께 반환합니다. 탐색이 목표에 도달하지 못해도 성공으로 처리되어 reached: false와 찾은 가장 가까운 값을 반환하며, 집계도 됩니다. 거부(알 수 없는 계산기, 계산기가 선언하지 않은 입력이나 출력 이름, 유한하지 않은 값, 범위가 없는 입력에 range가 없는 경우)는 다른 모든 계산기 경로처럼 비용이 들지 않습니다.

    Python SDK의 Client.solve()(rftools-io 0.4.0)와 MCP 서버의 solve_calculation 도구(2.2.0)도 같은 호출을 제공합니다.

  75. 계산기 경로에서 할당량을 다 쓰면 401이 아니라 402입니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    계산기 경로는 유효하지 않은 키와 할당량을 다 쓴 경우 모두에 401 "Invalid or quota-exceeded API key"를 반환했기 때문에, 스크립트는 잘못된 키와 사용량이 많은 달을 구분할 수 없었습니다. 이제 할당량을 다 쓰면 작업 경로가 이미 그랬듯이 402이며, errorKind: "rate_limited", reason, limit, used, resetAt, upgradeUrl, overageUrl, 그리고 Retry-After 헤더가 붙습니다.

    이제 401은 키가 없거나, 형식이 잘못되었거나, 알 수 없거나, 폐기되었다는 뜻일 뿐이며, 할당량은 언급하지 않습니다. 키가 전혀 없는 요청은 401이며, 무료 키를 받을 수 있는 keyUrl이 붙습니다.

    호출은 집계 전에 확인됩니다. 알 수 없는 계산기(404)나 유한한 숫자가 아닌 입력(400)은 비용이 들지 않으며, 실패한 계산은 돌려받습니다. 배치에서는 이 확인을 통과한 항목만 집계되며, 계산에 실패한 항목은 돌려받습니다. 메시지 문구가 아니라 상태와 errorKind로 분기하세요.

  76. 월간 할당량은 계정에 속하며 모든 키가 함께 씁니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/jobs

    이전에는 키마다 월간 할당량이 따로 있어서, 키를 여러 개 가진 계정은 키마다 할당량을 쓸 수 있었습니다. 이제 할당량은 계정의 것입니다. 폐기된 키를 포함해 계정이 가진 모든 키의 호출이 하나의 월간 수치에 집계되며, 이 수치는 UTC 기준으로 매월 초에 초기화됩니다.

    키가 하나인 계정은 달라지는 것이 없습니다. 호출은 여전히 그 호출을 한 키에 귀속되며, 대시보드와 GET /api/py/v1/usage는 키별로 나열합니다.

  77. 사용량 엔드포인트와, 집계되는 모든 응답의 사용량 헤더

    • GET /api/py/v1/usage
    • X-Usage-Allowance
    • X-Usage-Used
    • X-Usage-Reset
    • X-Usage-Overage

    GET /api/py/v1/usage는 키(X-API-Key 또는 Authorization: Bearer rfc_…)나 로그인한 세션에 대해 요금제, 할당량, 사용량과 남은 양, 초기화 시점, 초과 사용 상태, 계정의 각 키에 귀속된 호출 수를 반환합니다. 이를 읽는 것은 집계되지 않습니다.

    집계되는 모든 응답에는 X-Usage-Allowance, X-Usage-Used(그 호출 포함), X-Usage-Reset이 붙으며, 초과 사용이 집계되면 X-Usage-Overage도 붙습니다. 브라우저에서도 읽을 수 있습니다.

  78. 모든 결과가 계산 방법을 알려 줍니다

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • GET /api/py/v1/jobs/{jobId}

    계산기 결과와 각 배치 항목에는 멤버 9개를 가진 provenance 객체가 붙습니다: method, version, formulaRef, assumptions, validRange, computedAt, inputs, seed, elapsedSeconds. 작업 결과에는 이미 provenance가 있었는데, 두 번째 객체를 더하지 않고 여기에 formulaRef, assumptions, validRange, computedAt이 추가되며, version은 리비전만이 아니라 worker@<revision>으로 적힙니다.

    계산기의 대상 범위 밖에 있는 입력도 계산됩니다. validRange가 그 입력을 밝히고 경고가 추가됩니다. 이 변경 전에 저장된 결과는 당시의 멤버를 그대로 가지며, 없는 멤버는 알 수 없음으로 해석하세요.

  79. 프로그램이 디바이스 권한 부여로 키를 받을 수 있습니다

    • POST /api/py/v1/oauth/device/code
    • POST /api/py/v1/oauth/device/token
    • /device/

    브라우저가 없는 프로그램도 사용자가 키를 붙여 넣지 않고 키를 받을 수 있습니다(OAuth 2.0 디바이스 권한 부여, RFC 8628). 프로그램은 /oauth/device/code에 코드를 요청하고, 사용자에게 그 코드와 주소 https://rftools.io/device/를 보여 준 뒤, 받은 간격으로 /oauth/device/token을 폴링합니다. 사용자가 로그인해 코드를 승인하면, 다음 폴링에서 일반 API 키가 한 번 반환됩니다.

    이 키는 다른 키처럼 집계되고, 목록에 표시되며, 폐기할 수 있고, 계정의 키 한도에 포함됩니다.

  80. 클라이언트를 위한 키 링크와 키 레이블

    • POST /api/py/v1/apikeys
    • /dashboard/?newKey=1

    POST /api/py/v1/apikeys는 선택 사항인 {"label", "client"} 본문을 받아 둘 다 반환합니다. 본문을 생략하면 이전처럼 동작합니다. 클라이언트는 사용자를 https://rftools.io/dashboard/?newKey=1&client=<clientId>로 보내 그 클라이언트용 레이블이 붙은 키를 만들게 할 수 있으며, 키는 한 번만 표시됩니다.

  81. 거부에는 한도와 이를 넘는 방법이 적힙니다

    • 429 responses
    • 402 from POST /api/py/v1/jobs
    • Authorization: Bearer rfc_…

    분당 429에는 다른 모든 거부가 errorKind를 가지듯이, detail 옆에 errorKind: "rate_limited", limit, windowSeconds, upgradeUrl이 붙습니다. 할당량을 다 쓴 경우 작업 경로의 402에는 reason, limit, used, upgradeUrl, overageUrl이 추가되며, fdtd_sparam 해석 모드 할당량을 다 쓴 경우의 402에는 reason: "solve_mode"가 붙습니다. 기존 필드는 바뀌지 않습니다.

    계산기 경로는 작업 경로가 이미 그랬듯이 X-API-Key뿐 아니라 Authorization: Bearer rfc_…로도 키를 받습니다.

전체 레퍼런스는 API 문서이고, 기계가 읽을 수 있는 설명은 OpenAPI 플레이그라운드와 OpenAPI 문서입니다.