Johnson noise rig — full chat transcript
Afiq
@"/Users/afiqhatta/Downloads/boltz_constants_fm_johnson_noise.pdf" can you shop for the materials required foor this electrical circuit in browser mode, dont buy anything, just add to cart
Claude
I'll read the paper first to work out exactly what components the circuit needs.
Read— /Users/afiqhatta/Downloads/boltz_constants_fm_johnson_noise.pdfmcp__Claude_Browser__tabs_context
Circuit read. Let me open the browser and start sourcing parts.
mcp__Claude_Browser__preview_start— https://www.mouser.co.uk/c/?q=LT1024mcp__Claude_Browser__get_page_textmcp__Claude_Browser__computer— screenshot
Mouser is blocking the automated browser. Trying Farnell UK instead.
mcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=LT1024mcp__Claude_Browser__get_page_textmcp__Claude_Browser__find— Reject All Cookies buttonmcp__Claude_Browser__read_pagemcp__Claude_Browser__resize_windowmcp__Claude_Browser__computer— screenshot
Farnell is workable. LT1024 is long obsolete, so I need to find an equivalent. Checking successors.
mcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=LT1124mcp__Claude_Browser__get_page_text
LT1124ACN8 (DIP-8) is the modern pin-compatible successor to the LT1024 — in stock. Now sourcing the passives.
mcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=metal%20film%20resistor%20kit
Noted — I'll keep everything through-hole/DIP and add a breadboard.
mcp__Claude_Browser__get_page_text
Kits are poor value here. Let me check whether Farnell has a bulk order-code paste page, which will make carting ~20 lines much faster.
mcp__Claude_Browser__navigate— https://uk.farnell.com/quick-ordermcp__Claude_Browser__computer— screenshot
There's a "Paste a List" bulk tool. Let me verify Farnell's resistor part-number scheme so I can batch the passives.
mcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=MCMF0W4FF1002A50mcp__Claude_Browser__get_page_text
Part-number scheme confirmed — I can bulk-paste manufacturer part numbers. Now the capacitors.
mcp__Claude_Browser__navigate— https://uk.farnell.com/c/passive-components/capacitors/ceramic-capacitors/mlcc-leaded?capacitance=1nf&dielectric-characteristic=c0g%7Cnp0&brand=multicomp-promcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=1nF%20C0G%20radial%20capacitormcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=tantalum%20capacitor%2010uF%2035V%20radialmcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=100nF%2050V%20ceramic%20capacitor%20radial%20X7R%20multicompmcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=solderless%20breadboard%20830%20tie%20pointmcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=breadboard%20jumper%20wire%20kit%20solid%20coremcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=breadboard%20wire%20kit%20jumpermcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=L7915CVmcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=PP3%209V%20battery%20clip%20leadmcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=9V%20PP3%20alkaline%20battery%20duracellmcp__Claude_Browser__get_page_text
Farnell's battery pricing is 3× the high street, so I'll skip those and flag it. Now the scope connection and shielding.
mcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=BNC%20plug%20to%20crocodile%20clip%20test%20leadmcp__Claude_Browser__get_page_text
Now I'll assemble the bill of materials into Farnell's bulk paste tool.
mcp__Claude_Browser__navigate— https://uk.farnell.com/quick-ordermcp__Claude_Browser__read_pagemcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshot
Format confirmed. Building the full parts list now.
mcp__Claude_Browser__read_pagemcp__Claude_Browser__form_inputmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__get_page_text
The bulk tool only accepts numeric order codes. Let me look up the resistor codes in one batch rather than a dozen page loads.
mcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__javascript_tool— javascript_exec
Some codes need verifying, and two values are missing. Checking both.
mcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=MCMF0W4DF1102A50mcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=11kohm%201%25%20250mW%20axial%20metal%20film%20resistormcp__Claude_Browser__get_page_text
Found an in-stock 11k. Dropping the regulators (battery rails make them unnecessary) and pasting the corrected list.
mcp__Claude_Browser__navigate— https://uk.farnell.com/quick-ordermcp__Claude_Browser__read_pagemcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__read_pagemcp__Claude_Browser__form_inputmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__find— Add to Basket buttonmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshot
All 20 lines added (basket badge shows 20). Let me verify the basket contents.
mcp__Claude_Browser__navigate— https://uk.farnell.com/basketmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__get_page_text
Two problems: the 8.45k line came to £268 (5000-piece minimum), and seven resistors ship from the US warehouse with a £15.95 surcharge. Finding UK-stocked replacements.
mcp__Claude_Browser__javascript_tool— javascript_exec
All seven have UK-stocked MF25 equivalents. I'll rebuild the basket cleanly.
mcp__Claude_Browser__read_pagemcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__resize_windowmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__javascript_tool— javascript_exec
There's a "Clear Basket" control. I'll clear and re-paste the corrected list.
mcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__find— Clear Basket buttonmcp__Claude_Browser__read_pagemcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshot
Clear Basket needs a login. I'll remove the seven US-warehouse lines individually instead.
mcp__Claude_Browser__read_pagemcp__Claude_Browser__computer— scrollmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— scrollmcp__Claude_Browser__computer— screenshot
Found the US-warehouse rows. Removing them one by one.
mcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— triple_clickmcp__Claude_Browser__computer— typemcp__Claude_Browser__computer— keymcp__Claude_Browser__computer— screenshot
Basket edits may need a 1:1 viewport for accurate clicks. Adjusting and retrying.
mcp__Claude_Browser__resize_windowmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— scrollmcp__Claude_Browser__computer— scrollmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__computer— scrollmcp__Claude_Browser__computer— screenshot
Deletions are blocked for guest sessions. I'll add the UK-stocked replacements so every correct part is present, and flag the seven lines to remove at checkout.
mcp__Claude_Browser__navigate— https://uk.farnell.com/quick-ordermcp__Claude_Browser__read_pagemcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__read_pagemcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__read_pagemcp__Claude_Browser__form_inputmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__computer— screenshot
All 27 lines are in. Verifying the seven replacements resolved to the right values.
mcp__Claude_Browser__javascript_tool— javascript_exec
Everything is in the basket and verified. Here's where things landed.
Basket: uk.farnell.com/cart — 27 lines, nothing purchased
Two things you must fix before checkout (Farnell won't let a guest session delete basket lines — I could add but not remove, so this needs your login):
- Delete order code
1128601— the 8.45 kΩ resistor. It only sells in 5000-piece ammo packs, so that single line is £268 and is inflating the basket total to £469. - Delete these six too — they ship from Farnell's US warehouse and trigger a £15.95 surcharge:
1128617,1126988,1129161,1126938,1126955,1126964.
I've already added UK-stocked, next-day equivalents for all seven (the MF25 series), so once you delete those lines the basket is complete and correct. After pruning it comes to roughly £100 ex VAT with free delivery.
What the circuit needs, and what I substituted
The op-amp is the one real problem. The paper specifies the LT1024, which has been obsolete for years — no distributor stocks it. I've used the LT1124ACN8#PBF, which is the pin-compatible dual successor from the same family and actually quieter (2.7 nV/√Hz vs ~3). DIP-8, so it plugs straight into a breadboard. The circuit needs seven amplifiers — three gain-of-10 stages, one buffer, and three in the state-variable filter — so that's four dual packages; I ordered five so you have a spare. At £9.20 each they're nearly half the total cost.
Everything is through-hole and breadboardable as you asked: axial leaded resistors, radial capacitors, DIP-8 op-amps, TO-92-free. I also swapped the stripboard I'd originally planned for two 830-point breadboards and a 140-piece kit of pre-formed solid-core jumper wire — the rigid pre-cut type rather than flying dupont leads, which matters here because loose loops of wire act as pickup antennas.
Filter resistors are nearest-E24 rather than exact. The paper's formulas give R_F = 8.38 kΩ, R_Q = 9.02 kΩ, R_G = 1.90 kΩ; I've used 8.2 k, 9.1 k and 1.69 k. This shifts the band centre from 6.0 to about 6.1 kHz, which doesn't matter at all — you measure the gain curve g(ν) empirically anyway and integrate it to get S, so the exact corner frequencies never enter the calculation of k. (Worth knowing: the paper's own Figure 1 and its equations disagree on R_G, showing 1.7 k against a calculated 1.9 k. The 1.69 k I've carted matches the figure.)
Power: I went with batteries rather than the paper's ±15 V. Two PP3s give ±9 V, comfortably inside the LT1124's ±4 V to ±18 V range, and the output only ever swings tens of millivolts so there's no headroom concern. For a measurement where the input signal is nanovolts per root hertz, batteries are genuinely quieter than any mains-derived supply. I carted four battery clips but not the batteries — Farnell wants £27 for four PP3s, which is about £8 at any supermarket.
Not in the cart
You'll need an oscilloscope of 20 MHz or more that can report RMS or variance, and a function generator covering roughly 100 Hz to 200 kHz. The generator isn't optional — measuring the gain curve to get S is what converts your voltage variance into a value for k. I've included a 100 Ω resistor to build the divider that knocks the generator output down to the ~1 mV the paper calls for. For shielding, don't buy an enclosure: the paper explicitly says a cardboard box wrapped in aluminium foil, grounded at a single point, is sufficient.
One honest caveat about breadboarding this: a solderless board will pick up considerably more mains hum and have worse stray capacitance than the PCB the authors used. The method tolerates it reasonably well — the 1–11 kHz bandpass rejects 50 Hz outright, and because you extract k from the slope of variance against R, the fixed noise of the electronics lands in the intercept rather than corrupting your answer. But keep the input resistor and first-stage wiring as short as you physically can, since that's the one node where added pickup does real damage.
Afiq
can you do a checkbox here for whats in there
mcp__visualize__read_memcp__visualize__show_widget— johnson_noise_farnell_basket_checklist
Claude
Tick as you go — the counter at the top tracks all 32 items.
The three groups do different jobs. The top 20 are already sitting correctly in the basket and need nothing from you. The middle 7 are the ones I couldn't remove myself, since Farnell blocks basket edits for guest sessions — you'll need to log in and delete them, and the 8.45 kΩ line is the urgent one at £268 because it only sells in 5000-piece ammo packs. Every value in that group already has a UK-stocked replacement sitting in the keep list, so deleting them costs you nothing. The bottom 5 are things I deliberately didn't cart.
Basket is at uk.farnell.com/cart.
Afiq
can you check whats in the basket now
mcp__Claude_Browser__navigate— https://uk.farnell.com/cartmcp__Claude_Browser__get_page_text
Claude
Basket has changed since I last looked — down to 19 lines. Let me check what's missing and whether stock has moved.
mcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=9.1kohm%201%25%20250mW%20axial%20metal%20filmmcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=MF25%2010Kmcp__Claude_Browser__get_page_text
Found in-stock replacements. Adding both.
mcp__Claude_Browser__navigate— https://uk.farnell.com/quick-ordermcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__read_pagemcp__Claude_Browser__form_inputmcp__Claude_Browser__computer— screenshotmcp__Claude_Browser__computer— left_clickmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__javascript_tool— javascript_exec
Good news mostly. The seven US-warehouse lines including the £268 one are gone — that problem is solved, and the £15.95 surcharge with it. The basket is now 21 lines, £120.55 including VAT (£100.49 ex VAT), with free delivery.
But checking against my list turned up two new problems, which I've fixed:
The 10 kΩ test resistor had vanished from the basket along with the deleted lines — it was a different part (MCMF0W4DF1002A50) that I'd never flagged for removal. Losing it would have cost you the middle point of your resistance sweep. I've re-added it as MF25 10K, order code 9341110, which is both cheaper and better stocked (471,000 in stock, next-day).
MF25 9K1 has gone onto a 22-week lead time since I added it three messages ago — it's no longer stock, just backorder. That's your R_Q filter resistor, so the build would have stalled on it. I've added LR0204F9K1 from TE Connectivity, order code 2329986, 4,549 in stock with express delivery, same 9.1 kΩ ±1% 250 mW metal film.
One line still needs deleting when you log in: MF25 9K1, order code 9342320 — the 22-week one. It's now redundant. That's the only stale line left; everything else in the basket is in stock and correct.
Worth knowing for whenever you do check out: this basket is a guest session, so it isn't durable. Stock and lead times clearly shift underneath it, and lines can disappear. If you're not ordering soon, it's worth logging in and saving it as a proper basket rather than trusting the guest one to still be intact.
Afiq
ok so everything's thjere?
Claude
Let me actually verify line by line rather than assume.
mcp__Claude_Browser__navigate— https://uk.farnell.com/cartmcp__Claude_Browser__javascript_tool— javascript_exec
Yes — every component the circuit needs is in the basket. I checked all 21 lines against the schematic.
The active parts and passives are all accounted for: five LT1124ACN8 duals (ten amplifiers, seven used), the 100 kΩ and 11 kΩ pairs for the three gain stages, 8.2 kΩ ×2 / 9.1 kΩ / 1.69 kΩ for the state-variable filter's R_F, R_Q and R_G, the 1000 pF ±1% C0G filter capacitors, rail decoupling, six test resistors spanning 4.7 k to 27 k for the sweep, the 100 Ω for the calibration attenuator, two breadboards, wire, battery clips and two BNC leads. Quantities have headroom everywhere — the resistors come in tens where the circuit needs one to five.
One line still to delete: MF25 9K1, order code 9342320, the 22-week backorder. LR0204F9K1 replaces it. If you check out without deleting it, Farnell will hold the whole order until that one 23p resistor arrives in the spring, so it genuinely matters. Everything else is in stock.
Still to get yourself, as before: four PP3 batteries, an oscilloscope of 20 MHz or better that reads RMS or variance, a function generator, a thermometer, and a cardboard box with kitchen foil for shielding.
Basket sits at £120.55 including VAT, free delivery.
Afiq
okok can yuou save this as an order sheet
Skill— anthropic-skills:xlsxBash— mkdir -p /Users/afiqhatta/johnson-noise-boltzmann && python3 -c "import openpyxl, pandas; print(openpyxl.version, pandas.version)"Bash— python3 -m pip install --quiet openpyxl 2>&1 | tail -5; python3 -c "import openpyxl; print('openpyxl', openpyxl.version)"Bash— cd /Users/afiqhatta/johnson-noise-boltzmann && python3 -m venv .venv && ./.venv/bin/pip install --quiet openpyxl && ./.venv/bin/python -c "import openpyxl; prin…Write— /Users/afiqhatta/johnson-noise-boltzmann/build_order_sheet.pyBash— ./.venv/bin/python build_order_sheet.pyBash— python3 "/Users/afiqhatta/Library/Application Support/Claude/local-agent-mode-sessions/skills-plugin/71f21a99-28ee-4e5b-b310-cec7fefb9fd5/2109990f-9fee-4102-b5c…Bash— ./.venv/bin/python "/Users/afiqhatta/Library/Application Support/Claude/local-agent-mode-sessions/skills-plugin/71f21a99-28ee-4e5b-b310-cec7fefb9fd5/2109990f-9f…Bash— ls -d /Applications/LibreOffice.app 2>/dev/null; ls /Applications/LibreOffice.app/Contents/MacOS/soffice 2>/dev/null; which soffice libreoffice 2>/dev/null; ech…
Claude
No LibreOffice on this machine, so the skill's recalculator can't run. I'll compute the values in Python and inject them as cached results so the numbers show up everywhere, not just after Excel recalculates.
Write— /Users/afiqhatta/johnson-noise-boltzmann/cache_values.pyBash— ./.venv/bin/python cache_values.py
Afiq
[Request interrupted by user]
just save this as a file so i can upload it next time
Bash— cd /Users/afiqhatta/johnson-noise-boltzmann && ./.venv/bin/python -c " from openpyxl import load_workbook wb = load_workbook('farnell-order-sheet.xlsx', data_on…Bash— ./.venv/bin/python -c " from openpyxl import load_workbook wb = load_workbook('farnell-order-sheet.xlsx', data_only=True) ws = wb['Order sheet'] print('I6', rep…
Claude
The empty <v /> openpyxl emits is winning over my injected value. Fixing the patch.
Edit— /Users/afiqhatta/johnson-noise-boltzmann/cache_values.pyBash— ./.venv/bin/python cache_values.py && ./.venv/bin/python -c " from openpyxl import load_workbook wb = load_workbook('farnell-order-sheet.xlsx', data_only=True) …SendUserFile
Saved to farnell-order-sheet.xlsx — attached above so you can upload it next time.
Four tabs. Order sheet is the main one: all 20 lines with Farnell order codes, manufacturer part numbers, what each part does in the circuit, quantity to order against quantity the circuit actually needs, and prices totalling £100.23 ex VAT / £120.28 inc VAT. Farnell paste list is just order code and quantity in two columns — copy them straight into uk.farnell.com/quick-order under "Paste a List" and the whole basket rebuilds in one action, which is the fastest way back in given the guest basket won't survive. Source yourself covers the batteries, scope, generator, thermometer and foil. Build notes records the reasoning you'd otherwise have to reconstruct: why the LT1124 replaces the obsolete LT1024, why the filter resistors are nearest-E24 and why that doesn't affect the value of k, the contradiction between the paper's Figure 1 and its equation 13 on R_G, and the breadboard noise caveat.
Two things worth knowing about how it was made. The prices are a snapshot from today and the sheet says so — you've already watched two parts change stock status mid-session, so treat them as indicative. And LibreOffice isn't installed on this machine, so I couldn't run the usual recalculation check; instead I computed the totals in Python and wrote them in as cached values, then read the file back to confirm every cell resolves and none contain errors. The formulas are live, so the sheet still recalculates normally if you edit a quantity.
Afiq
can you find the cost of an oscilloscope
Claude
Let me check current prices — including whether a scope that also has a built-in generator would cover both instruments.
mcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=digital%20storage%20oscilloscope%2070MHz%202%20channelmcp__Claude_Browser__get_page_textmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=DS1054Zmcp__Claude_Browser__get_page_textmcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=digital%20oscilloscope%202%20channel%20100MHz%20benchmcp__Claude_Browser__javascript_tool— javascript_execmcp__Claude_Browser__get_page_text
The handheld with a built-in generator looks like it could replace both instruments. Let me check its specs properly.
mcp__Claude_Browser__navigate— https://uk.farnell.com/search?st=MP720783mcp__Claude_Browser__get_page_text
Cheapest workable option is £169 ex VAT (£203 inc) — and it's one that solves your function generator problem at the same time.
Multicomp Pro MP720783, order code 3703267, £168.89 ex VAT, 106 in stock for next-day. It's a 70 MHz handheld that also contains a 25 MHz signal generator and a 4½-digit multimeter. That matters because you needed a generator anyway to measure the gain curve, and buying one separately would cost about as much again. The multimeter is a quieter bonus than it looks: you want each test resistor's measured value rather than its nominal one when you fit the slope, since a 1% tolerance error feeds straight through into k.
The alternatives, for context:
| Instrument | Price ex VAT | Notes |
|---|---|---|
| MP720782 (same, no generator) | £142.86 | Saves £26, costs you a generator |
| Rigol DS1054Z, 50 MHz bench | £309.48 | 10-week lead at Farnell, no generator |
| Multicomp MP720013 MSO, 100 MHz | £687.00 | Overkill here |
| Tektronix TBS2104B, 100 MHz | £2,970.00 | Very overkill |
The spec that actually constrains this experiment isn't bandwidth — it's memory depth, and it's worth thinking about before you buy. Your signal is band-limited to about 10 kHz, so you need roughly 25 kSa/s to satisfy Nyquist; the 70 MHz front end is irrelevant. What limits you is that the fractional error on a variance estimate is √(2/N) for N independent samples. The MP720783's 6 kpts buys you a 0.24 s capture, roughly 4,800 independent samples, so about 2% error per capture — worse than the 1.4% the paper achieved. You'd need to average ten or so captures per resistor to beat that down. The DS1054Z's 24 Mpts would get you there in a single acquisition. Whether that's worth £140 and a ten-week wait depends on how much patience you have for repeated captures.
One thing I couldn't confirm: Farnell's spec list doesn't enumerate the MP720783's measurement functions, so I can't promise it has a Vrms readout. I'd sidestep that entirely — it has USB-C and SCPI support, so pull the samples and compute the variance in Python. That's better practice regardless, since you get the histogram to confirm the noise really is Gaussian, you can subtract the DC offset honestly, and you can average captures properly rather than trusting whatever the scope's RMS function does internally.
I haven't added anything to the basket — say the word if you want the MP720783 in there.
Afiq
is there any cheaper oscilloscope, and what else do i need?
Claude
Two things worth separating here. Let me check real prices rather than guess.
ToolSearch— select:WebSearch,WebFetchWebSearch— Behringer UCA202 USB audio interface price UK 2026WebSearch— cheapest digital oscilloscope UK 2026 FNIRSI Hantek under £100 bandwidth
Yes, cheaper exists — but the more useful answer is that an oscilloscope is probably the wrong instrument for this experiment.
Cheaper scopes
Farnell's floor is the MP720782 at £142.86 ex VAT (the same handheld minus the generator). Outside Farnell, budget brands go lower: the Hantek 6022BE is around $85 for 20 MHz, and the FNIRSI 1014D is about $150 for 100 MHz with a built-in generator. Both would technically do the job.
But consider a USB audio interface instead
Your signal lives between 1 and 11 kHz. That is the audio band, and a Behringer UCA202 costs £24.30 — a seventh of the handheld's price.
The reason this isn't a downgrade is the point I raised last time: memory depth, not bandwidth, is what limits your precision. The fractional error on a variance estimate is √(2/N) over N independent samples. The handheld's 6 kpts buys you about 4,800 independent samples per capture, so roughly 2% error — worse than the 1.4% the paper achieved, forcing you to average many captures. An audio interface streams continuously to disk. Record for one minute at 48 kSa/s and you have of order 10⁶ independent samples, which puts the statistical error near 0.13%. Fifteen times better precision for a seventh of the cost, and your laptop generates the calibration sine sweep through the same device, so it replaces the function generator too.
The one real caveat, and it's worth taking seriously at your target accuracy: a 48 kHz interface can only measure the gain curve up to about 22 kHz. Reading Figure 2 of the paper, the response above the passband still contributes something like 1% of S — comparable to the accuracy you're chasing. Either bound that tail analytically from the filter's 40 dB/decade roll-off, or buy a 96/192 kHz-capable interface (a Focusrite Scarlett Solo or similar, expect roughly £100) which captures essentially all of it. I'd suggest measuring what you can and estimating the remainder; it's a cleaner physics exercise than throwing money at it.
What else you need
Beyond the components already in the basket:
- 4 × PP3 9 V batteries — about £8 at a supermarket, powers both rails
- Measurement — one of the options above, £24 to £203
- A thermometer — k scales linearly with T, so you want it good to a few tenths of a kelvin; a cheap digital probe is fine, around £10
- A multimeter — to measure each test resistor's actual resistance rather than trusting the 1% marking, since that error propagates straight into your slope. About £15, or free if you buy the MP720783, which includes one
- A cardboard box and kitchen foil — the paper's own shielding recommendation; ground the foil at exactly one point
- Side cutters and wire strippers, if you don't already have them
If you go the audio-interface route you'd also want a lead from the circuit's BNC output to the interface's RCA line input — the BNC-to-crocodile leads already in the basket plus a spare RCA cable will do it.
Sources: Muziker UCA202, Stack Junkie budget oscilloscopes, Electroz Lab FNIRSI vs Hantek
Afiq
are you sure thats everything?
Claude
Not quite. I went back through the build properly rather than just re-reading my own list, and found five things — one of which is a real hole in the plan I gave you.
The absolute voltage calibration is the dominant systematic, and it enters squared. Since k = ⟨V²⟩/(4TRS), any error α in your measurement chain's voltage scale gives α²k. Note that α doesn't cancel via S: the gain curve g(ν) is a ratio of two measurements on the same instrument, so the scale factor divides out there, leaving ⟨V²⟩ carrying the error alone. A typical oscilloscope's vertical accuracy is ±3%, which is ±6% in k — four times worse than the 1.4% the paper reports. This matters more than bandwidth or memory depth, and I didn't flag it before.
This is a genuine problem for the audio-interface route. A sound card's full-scale input in volts is simply not a specified quantity — it varies by unit. So you can't get an absolute ⟨V²⟩ from it out of the box. It's fixable: feed a sine of known amplitude, measure that amplitude with a decent multimeter, and note the digital level to establish volts-per-full-scale. But it's a calibration step I glossed over, and it upgrades the multimeter from "nice to have" to load-bearing. Buy a half-decent one with a true-RMS AC range rather than the cheapest thing available.
Two RCA-to-crocodile leads, about £10, if you go the audio route. The UCA202's input and output are both phono sockets, and the BNC leads in the basket won't mate with them. You need one lead in each direction — signal out of the circuit, calibration sine back in.
Tie off the spare op-amp. Four dual packages give eight amplifiers and the circuit uses seven. The unused one must not float: ground its non-inverting input and strap its output to its inverting input as a follower. A floating op-amp in a shared package can oscillate and couple noise into its neighbour through the supply pins — which in a noise experiment is exactly the failure you'd struggle to diagnose.
Run the laptop on battery during audio-interface measurements. A charging laptop ties the interface's ground to mains earth through the PSU, and the resulting loop injects hum straight into your input.
One smaller point: put the thermometer probe against the test resistor, not on the bench. Your electronics dissipate a few hundred milliwatts inside a closed foil box, so the interior will sit above room temperature, and T enters k linearly.
I did check the things that would have been embarrassing to miss — all the component footprints are breadboard-compatible (the Kemet capacitor is 2.54 mm pitch, the tantalums and 100 nF parts 5.08 mm, all axial resistors fine), two 830-point boards give ample room for four DIP-8s plus the passives, and four bus strips cover the three rails you need. The component list itself is complete.
Afiq
how is the variance measuresd
Claude
It's the mean square of the output voltage, and since ⟨V⟩ = 0 by construction, variance and mean square are the same thing. The practical question is how you estimate it well.
The estimator
Record N samples of the output and compute
σ̂² = (1/(N−1)) Σ (Vᵢ − V̄)²
Subtracting the sample mean matters — your three DC-coupled gain stages have an offset of order a few hundred millivolts at the output, and you want the fluctuation, not the pedestal. On a scope this means using the AC-coupled RMS measurement and squaring it, not the DC one.
Two traps that silently ruin this. Never use peak-to-peak: for Gaussian noise Vpp is not a fixed quantity at all, it grows logarithmically with how long you look, so it has no stable value to report. And turn off acquisition averaging — averaging repeated sweeps is designed to suppress exactly the uncorrelated fluctuation you are trying to measure, and it will quietly drive your signal toward zero.
How long you need to record
This is where the statistics bite. For Gaussian samples, (N−1)σ̂²/σ² follows χ²ₙ₋₁, whose variance is 2(N−1), so the fractional error on the variance is √(2/N).
The subtlety is that N counts independent samples, not ADC conversions. Band-limited noise decorrelates on a timescale ~1/(2Δν), so oversampling buys you nothing. With bandwidth Δν and record length T you get N ≈ 2ΔνT independent samples, and the fractional error collapses to a clean result:
δ⟨V²⟩/⟨V²⟩ ≈ 1/√(Δν·T)
With Δν = 10 kHz, one second of recording gives 1%, and a hundred seconds gives 0.1%. That's the calculation behind my earlier point about memory depth — and it also tells you something useful: the paper's 1.4% accuracy is not statistics-limited. Half a second of data would match it. Their error budget is dominated by systematics, principally the voltage calibration.
Checks worth doing
Histogram the samples. Johnson noise is Gaussian, so any departure is diagnostic: mains pickup shows up as broadened or bimodal tails, and clipping shows as hard edges. Clipping is the dangerous one because it biases the variance downward and is easy to miss — σ ≈ 16 mV means 4σ excursions occur a few times in ten thousand samples, so set your vertical range to at least ±5σ even though the trace looks like it is using a tiny fraction of the screen.
If you're capturing samples anyway, take the FFT and look at the power spectrum. You should see the bandpass shape with a flat top, and no spikes at 50 Hz harmonics.
What you do with the numbers
Measure σ̂² at each of your six resistances, plot against R, and fit a straight line. The slope is what you want, not the intercept — that's the elegance of the method. All the R-independent noise, meaning the op-amp's voltage noise and everything the electronics contributes, lands in the intercept and never touches k. Then k = slope/(4TS).
One caveat on that fit, which is worth knowing before you take the linearity for granted. The op-amp's input current noise iₙ flows through the source resistor and contributes iₙ²R² — quadratic in R, not linear. So the true model is
⟨V²⟩/S = eₙ² + 4kTR + iₙ²R²
For the LT1124, iₙ is around 0.3 pA/√Hz, and the ratio iₙ²/(4kT) works out near 5×10⁻⁶ per ohm, so at R = 27 kΩ the quadratic term is already north of 10% of the linear one. Fitting a straight line through that curvature biases the slope upward, which inflates k. It's a plausible contributor to the paper's result landing 1.4% high rather than low. You can check it directly: fit a quadratic as well and see whether the coefficient you recover is consistent with the datasheet iₙ, or simply restrict the fit to your lower resistances where the term is negligible and compare the two slopes.
Afiq
can you make a circuit diagram for me with the audio iunterface
mcp__visualize__read_meBash— ./.venv/bin/python -c " import json,re d=json.load(open('/Users/afiqhatta/.claude/projects/-Users-afiqhatta/56d548d5-5a76-4cf3-a786-ef56ab69e4e5/tool-results/to…Bash— /Users/afiqhatta/johnson-noise-boltzmann/.venv/bin/python -c " import json d=json.load(open('/Users/afiqhatta/.claude/projects/-Users-afiqhatta/56d548d5-5a76-4c…Bash— /Users/afiqhatta/johnson-noise-boltzmann/.venv/bin/python -c " import json d=json.load(open('/Users/afiqhatta/.claude/projects/-Users-afiqhatta/56d548d5-5a76-4c…Bash— /Users/afiqhatta/johnson-noise-boltzmann/.venv/bin/python -c " import json,re d=json.load(open('/Users/afiqhatta/.claude/projects/-Users-afiqhatta/56d548d5-5a76…Bash— /Users/afiqhatta/johnson-noise-boltzmann/.venv/bin/python -c " import json d=json.load(open('/Users/afiqhatta/.claude/projects/-Users-afiqhatta/56d548d5-5a76-4c…mcp__visualize__show_widget— johnson_noise_setup_with_audio_interface
Claude
The diagram is a signal-flow schematic rather than a component-level one — deliberately, and I'll say where you need to go for the missing detail.
Reading it as a loop: noise originates in the test resistor, gets amplified by 1000 through three LT1124 stages, is band-limited to 1–11 kHz, and leaves the shielded box into the interface's line input. The laptop records and computes the variance. The dashed path is the calibration run, where the laptop generates a sine sweep out through the interface, the ÷100 divider knocks it down to roughly a millivolt, and it enters at the same node the resistor occupies. You do these one at a time — during calibration the resistor comes out and the divider's ~100 Ω output impedance becomes the source.
One trick worth building into the calibration. You need g(ν) = V_out/V_in, but you can't measure a 1 mV input accurately in absolute terms. Instead, first loop the interface's output straight back to its own input and record the generator level in raw ADC units. Then measure V_out in the same units. Since V_in = V_gen × 100/10100, you get g = (V_out/V_gen) × 101 with the ADC scale factor cancelling entirely. This is why the interface being full-duplex matters. Note this only fixes g — you still need the absolute volts-per-full-scale calibration I flagged earlier to turn ⟨V²⟩ into real volts squared, and that still wants the multimeter.
On grounding, now that the laptop is in the loop. The interface's cable screen brings a ground reference into your shielded box, so that entry point should be your single ground: tie the foil, the battery midpoint and the circuit ground together there and nowhere else. Two ground connections and you have a loop enclosing area, which is exactly what picks up mains field.
What I left as a block, and why. The bandpass filter's internal wiring — how the two 100 kΩ resistors, R_Q and R_G attach around the summing node and the two integrators — I've drawn as a block rather than guessing. I'm confident about the component roles (two 8.2 kΩ and two 1 nF form the integrators, 1.69 kΩ sets input gain, 9.1 kΩ sets Q, the 100 kΩ pair sits around the summing amplifier), and those follow directly from the design equations in section 2 of the paper. But the exact node-by-node topology should come from Figure 1 of the paper itself, or the state-variable filter section of Horowitz and Hill that it cites — reproducing it from memory is how you end up with a filter that doesn't oscillate but also isn't the one you designed. The three gain stages are simple enough to trust: non-inverting, 100 kΩ from output to inverting input, 11 kΩ from there to ground.
Afiq
can you export this chat and images as a pdf
Claude
I'll check what's available for rendering and whether I can pull the actual transcript rather than reconstruct it.
Bash— ls -d "/Applications/Google Chrome.app" 2>/dev/null && echo CHROME_OK; which pandoc wkhtmltopdf weasyprint chromium 2>/dev/null; ls -d /Applications/Microsoft\ …
Afiq
[Request interrupted by user]
export it it to an obsidian essay in my vault
Bash— cat "/Users/afiqhatta/.claude/projects/-Users-afiqhatta/memory/feedback_obsidian_verbatim_only.md" 2>/dev/null; echo "=== diagram style ==="; cat "/Users/afiqha…