Repository navigation
feat(rf): FCC RF-exposure (MPE/SAR) estimates and an exposure dialog - #14
Merged
leavesofgrass merged 1 commit intoSep 25, 2026
Conversation
Only rule text verified from primary sources is built in: 47 CFR 1.1310 Table 1 (MPE, both tiers, 6/30-minute averaging), the 1.1310(b)-(c) SAR limits, and the 1.1307(b)(3)(i)(C) exemption table with its lambda/2pi applicability limit. - 11 formula functions: MPELIMIT, MPEEFIELD, MPEHFIELD, PWRDENSITY, MPEDIST, MPEPERCENT, AVGPOWER, EXEMPTERP, EXEMPTMINDIST, SARLIMIT, SAR (frequencies in Hz, power density in the FCC's mW/cm2) - Ground reflection is a power-density factor: 1 (free space), 4 (full in-phase reflection) or user-entered. The tests show the 1.1307 exemption table is exactly the x4 model applied to ERP, and that the 1.1310 E-field and power-density columns agree via E^2/377. - Duty cycle and transmit time are inputs; OET-65's per-mode factors and reflection factor, the 1.1307(b)(3)(i)(B) P_th formula, and ICNIRP levels could not be verified and are documented as omitted. - Tools > Radio > RF exposure estimate (MPE): whole-station evaluation, verdicts stated in words, an accessible log-log density-vs-distance graph with limits and compliance distances marked, data table, and "Data -> new sheet". The estimate caveat is shown on the dialog. - GraphPanel/rows_to_new_sheet move into a shared dialogs module; vertical reference-line labels move to the plot bottom to avoid colliding with threshold labels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0157FDmhHjtSvT3pWABUTvmX
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR 2 of 3. This PR is stacked on #13 and targets that branch, so the diff shows only the exposure work. Merge #13 first; this PR will then retarget to
main.Why
US amateurs must evaluate RF exposure under 47 CFR § 97.13(c) and § 1.1307(b). abax had no tools for this. The requirement was to use only rule text verified from primary sources, so every number built in here comes from rule text I could read:
What
11 formula functions:
MPELIMIT,MPEEFIELD,MPEHFIELDPWRDENSITY,MPEDIST,MPEPERCENTAVGPOWEREXEMPTERP,EXEMPTMINDISTSARLIMIT,SARFrequencies are in Hz, as in all abax RF functions. Power density is in mW/cm², the FCC table unit.
Ground reflection is a power-density factor F in S = F·EIRP/(4πR²):
Two independent checks on the table transcription, both in the tests:
Tools → Radio → RF exposure estimate (MPE)
Deliberately not included
These could not be verified from primary text; the proxy blocked fcc.gov, ecfr.gov, arrl.org and icnirp.org:
The duty cycle is therefore an input (default 100 %, the worst case), and no reflection factor between 1 and 4 is preset. The docs say this and list these items as future work.
Also in this PR
GraphPanel/rows_to_new_sheetmove from the circuit dialog into a shareddialogs/_graphpanel.py.Verification
ruff check .passes.pytest -n auto: 4744 passed, 196 skipped. The skip count is unchanged.mkdocs build --strictpasses.python make_pyz.pybuilds, andabax.pyz --versionruns.=formula → valueexamples in the formula reference's RF section were evaluated against the engine, and all match. A test also pins the worked exposure example inrf-toolkit.md; while writing it I found and corrected two wrong numbers in my first draft of that example.🤖 Generated with Claude Code
https://claude.ai/code/session_0157FDmhHjtSvT3pWABUTvmX
Generated by Claude Code