<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>W5ISP</title>
    <subtitle>Amateur radio, RF, and software — notes from W5ISP.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://w5isp.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://w5isp.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-04-29T00:00:00+00:00</updated>
    <id>https://w5isp.com/atom.xml</id>
    <entry xml:lang="en">
        <title>How a transistor actually amplifies</title>
        <published>2026-04-23T00:00:00+00:00</published>
        <updated>2026-04-23T00:00:00+00:00</updated>
        <author>
          <name>
              Graham McIntire
          </name>
        </author>
        <link rel="alternate" type="text/html" href="https://w5isp.com/blog/how-a-transistor-amplifies/"/>
        <id>https://w5isp.com/blog/how-a-transistor-amplifies/</id>
        
        <content type="html" xml:base="https://w5isp.com/blog/how-a-transistor-amplifies/">&lt;link rel=&quot;stylesheet&quot; href=&quot;&#x2F;css&#x2F;scene.css&quot;&gt;
&lt;div class=&quot;scene-host&quot; data-scene-host&gt;
&lt;p&gt;The phrase &lt;em&gt;small-signal gain&lt;&#x2F;em&gt; is one of those engineering expressions that manages to sound both technical and unhelpful at the same time. A transistor amplifies. Fine. How?&lt;&#x2F;p&gt;
&lt;p&gt;The answer, when you work through it, is not that a transistor makes electrons stronger. Nothing in the device multiplies anything in a physical sense. It controls how hard a separate, already-energized current is allowed to flow, and then a nearby resistor turns that variable current back into a variable voltage, and the variable voltage is bigger than the one you started with. That is it. Everything else is details, and the details are where it gets fun.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ll build this up one scene at a time using an NPN &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Bipolar_junction_transistor&quot;&gt;bipolar junction transistor&lt;&#x2F;a&gt;, the sort of thing that still comes in a TO-92 three-legged black lump if you buy a bag from Mouser.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-is-a-bjt&quot;&gt;What is a BJT?&lt;&#x2F;h2&gt;
&lt;p&gt;A bipolar junction transistor is a three-terminal semiconductor device: a sandwich of doped silicon with a wire attached to each of its three layers. The NPN kind we&#x27;ll be using stacks n-type silicon, p-type silicon, and n-type silicon, in that order. The three terminals attached to those layers are called, from outside to middle to outside, the &lt;strong&gt;collector&lt;&#x2F;strong&gt;, the &lt;strong&gt;base&lt;&#x2F;strong&gt;, and the &lt;strong&gt;emitter&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;N-type&quot; and &quot;p-type&quot; are just two versions of silicon that have been doped with impurities to give them either a surplus of free electrons (n-type) or a surplus of the absence of free electrons, which solid-state physicists call &lt;em&gt;holes&lt;&#x2F;em&gt; and treat like positive charge carriers that move around independently. The &lt;em&gt;bipolar&lt;&#x2F;em&gt; in the name is an admission that both kinds of carriers end up doing useful work inside the device. Most semiconductor designs try to avoid that. The BJT embraces it.&lt;&#x2F;p&gt;
&lt;p&gt;The practical consequence is simple: a small current flowing into the base lets a much larger current flow from the collector to the emitter. That is the whole trick, and once you accept that it happens, the amplifier parts follow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-transistor-is-a-valve&quot;&gt;A transistor is a valve&lt;&#x2F;h2&gt;
&lt;p&gt;Start with the classical way a ham thinks about a BJT. A small current flowing into the base allows a much larger current to flow down through the collector. The ratio between the two is called β, and for most small-signal transistors it sits somewhere between 100 and 300. It is also the one number on the datasheet that is most likely to be wrong about your specific part.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-valve&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;That&#x27;s it. Move the base current up, the collector current moves up in lockstep. You have not yet amplified a voltage, because nothing in the picture is a voltage source. All you&#x27;ve done is built a current-controlled current source. Interesting, but not a radio.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-load-line-where-current-meets-a-resistor&quot;&gt;The load line: where current meets a resistor&lt;&#x2F;h2&gt;
&lt;p&gt;To get a voltage out, stick a resistor in series with the collector. The supply provides V_CC. The transistor pulls some collector current. The voltage dropped across the resistor is whatever Ohm&#x27;s law says it has to be, and V_CE is whatever&#x27;s left over.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-curves&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;The family of curves shows how I_C depends on V_CE for various base currents. They&#x27;re nearly flat because an ideal BJT is a current source, not a resistor. The orange line is the load line, the set of all (V_CE, I_C) points compatible with your V_CC and R_C. Wherever the load line meets the base-current curve you chose, that is the operating point (or, more ceremoniously, the Q-point). Turn the base current up, Q-point slides up the load line toward the top-left. Turn it up too far and you hit the saturation wall, where V_CE flattens against the supply rail minus a few tenths of a volt and the transistor gives up on being a current source. Turn it down to zero and you&#x27;re in cutoff, V_CE sitting at the full V_CC because no current is flowing.&lt;&#x2F;p&gt;
&lt;p&gt;The useful region is the one in the middle. The entire game of building an amplifier is making sure you stay there on purpose.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-happening-as-v-be-changes&quot;&gt;What&#x27;s happening as V_BE changes&lt;&#x2F;h2&gt;
&lt;p&gt;The base current is actually controlled by the voltage across the base-emitter junction, V_BE. That junction is a forward-biased diode, and diodes respond exponentially to voltage: small changes near the knee produce large changes in current, until eventually you drop the entire supply across the collector resistor and can&#x27;t go any further.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-transfer&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Drag V_in (which is V_BE here) and watch V_out. The three regions of the earlier scene show up as three regions of the curve: a flat portion at the top where nothing happens, a steep diagonal in the middle where a few millivolts of input produce volts of output, and a flat portion at the bottom where you&#x27;re welded to the rail. The slope of the steep part is the voltage gain. It is not an especially well-behaved function of V_in, but it&#x27;s enormous, and that&#x27;s enough.&lt;&#x2F;p&gt;
&lt;p&gt;Notice that the amplifier is upside down. V_in going up makes V_out go down. This is the standard &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Common_emitter&quot;&gt;&quot;common-emitter&quot; amplifier&lt;&#x2F;a&gt;, and its inversion is a consequence of the fact that more base drive means more collector current means more voltage dropped across R_C means less voltage left on the collector. The inversion does not bother anyone except people reading their first schematic.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;amplification-live&quot;&gt;Amplification, live&lt;&#x2F;h2&gt;
&lt;p&gt;Pick a bias near the middle of the steep part. Add a small AC signal on top of the bias. The signal walks V_BE back and forth by a few millivolts. That walks I_C by a few milliamps (multiplied by the exponential). That walks V_CE by a few volts (multiplied by R_C). The result is a bigger, flipped version of the input.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-amp&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Crank the input amplitude high enough and the output swing starts slamming into the rails. The peaks clip. A real amplifier design is mostly the art of picking a bias point such that the signal you care about fits cleanly between V_CC and V_CEsat with some margin. Hi-fi engineers and ham radio operators fight about exactly how much margin. The transistor does not have strong opinions on this either way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-the-number-comes-from&quot;&gt;Where the number comes from&lt;&#x2F;h2&gt;
&lt;p&gt;All of the above is captured in two small formulas that turn the exponential behavior into linear behavior near a chosen operating point.&lt;&#x2F;p&gt;
&lt;p&gt;The rate at which collector current changes per volt of base drive is called transconductance:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;g_m = I_C &#x2F; V_T&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;where V_T is the thermal voltage, about 26 mV at room temperature. That is a number that comes directly from the physics of a PN junction and has been the same temperature coefficient since semiconductor devices were invented.&lt;&#x2F;p&gt;
&lt;p&gt;The voltage gain of this common-emitter stage is then:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A_v = -g_m * R_C&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;div id=&quot;scene-gain&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;A BJT biased at 2 mA with a 1 kΩ collector resistor has a transconductance of about 77 mA&#x2F;V and a voltage gain of about 77. Run it at 5 mA and the gain climbs to around 190. Run it at 100 μA and you have a gain of about 4 and should probably consider a different amplifier topology. None of this depends on β, by the way, which is why a well-designed amplifier doesn&#x27;t care very much that β varies from part to part.&lt;&#x2F;p&gt;
&lt;p&gt;Everything else, and there is a lot of &lt;em&gt;else&lt;&#x2F;em&gt;, is decoration on this core. Bypass capacitors, emitter degeneration, cascode stages, differential pairs, current mirrors, Darlingtons, bootstraps. They all exist to make the basic idea above more linear, more bandwidth-y, more stable with temperature, or less dependent on a specific transistor&#x27;s specific quirks. But underneath the decoration there&#x27;s still a valve controlling a current, and a resistor turning that current into a voltage, and the voltage is bigger than the one you started with. The rest is bookkeeping.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;script src=&quot;&#x2F;js&#x2F;transistor.js&quot; defer&gt;&lt;&#x2F;script&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Why signals bend (and why your 10 GHz signal sometimes goes through a hill)</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        <author>
          <name>
              Graham McIntire
          </name>
        </author>
        <link rel="alternate" type="text/html" href="https://w5isp.com/blog/why-signals-bend/"/>
        <id>https://w5isp.com/blog/why-signals-bend/</id>
        
        <content type="html" xml:base="https://w5isp.com/blog/why-signals-bend/">&lt;link rel=&quot;stylesheet&quot; href=&quot;&#x2F;css&#x2F;nlos.css&quot;&gt;
&lt;div class=&quot;nlos&quot; data-nlos&gt;
&lt;p&gt;A line-of-sight microwave link is easy to reason about. Two antennas, straight line, if nothing touches the line the path works.&lt;&#x2F;p&gt;
&lt;p&gt;Ham radio doesn&#x27;t cooperate with that story. People working the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.arrl.org&#x2F;10-ghz-up&quot;&gt;ARRL 10 GHz and Up contest&lt;&#x2F;a&gt; log contacts over hundreds of kilometers where a string between the two stations would go straight through an Oklahoma mesa. The path profile looks broken. The contact happens anyway. The universe has, as usual, not consulted the path profile.&lt;&#x2F;p&gt;
&lt;p&gt;Below, one layer at a time, with scenes you can interact with. We start from the straight-line-and-obstacle model and break it four times.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;start-simple-a-line-between-two-antennas&quot;&gt;Start simple: a line between two antennas&lt;&#x2F;h2&gt;
&lt;p&gt;Two antennas, flat ground, a hill in the middle. If the hill sticks above the line, you get nothing.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-los&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;That model is how nearly every commercial point-to-point microwave link is designed. WISPs, utility SCADA, carrier backhaul, all of it. The model is accurate enough that entire industries have been built on top of it, which is a minor miracle, because it rests on two small lies it would prefer nobody mention. The Earth isn&#x27;t flat, and the signal isn&#x27;t a line.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;earth-gets-in-the-way-too&quot;&gt;Earth gets in the way too&lt;&#x2F;h2&gt;
&lt;p&gt;Zoom out far enough and the ground curves. From an antenna of height &lt;em&gt;h&lt;&#x2F;em&gt; the geometric horizon sits at about √(2&lt;em&gt;R&lt;&#x2F;em&gt;h). Two 30-meter towers can each see a horizon roughly 20 km away. Push them 80 km apart and the Earth bulges more than 120 meters up between them.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-curve&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;No mast is tall enough to beat that on its own. The Earth has spent four and a half billion years being round and is unlikely to stop on anyone&#x27;s account.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-signal-is-fatter-than-a-line&quot;&gt;The signal is fatter than a line&lt;&#x2F;h2&gt;
&lt;p&gt;One thing helps NLOS along a little even in the geometry-only model. Radio energy doesn&#x27;t ride a pencil-thin ray. It fills an ellipsoid between the antennas called the first &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Fresnel_zone&quot;&gt;Fresnel zone&lt;&#x2F;a&gt;, and you want about 60% of that zone clear for the path to behave like free space.&lt;&#x2F;p&gt;
&lt;p&gt;The ellipsoid is fattest at the middle of the path. Its radius there is √(λ*d&#x2F;4), so it grows with wavelength. A 40 km path on 50 MHz has a midspan radius around 24 meters. Same path on 10 GHz is 1.7 meters.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-fresnel&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;This is why microwave links behave so much worse than HF over the same obstructed path. Higher frequency, skinnier ellipsoid, easier to clip with a ridge that doesn&#x27;t look like much on the path profile. The ridge does not care how it looks on the path profile. The ridge is, in fact, indifferent to every document that has ever been written about it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ridges-leak-signal&quot;&gt;Ridges leak signal&lt;&#x2F;h2&gt;
&lt;p&gt;When the line of sight is fully blocked, a sharp ridge doesn&#x27;t eat everything. The wavefront hitting that edge keeps going, and some energy diffracts into the shadow. The usual way to describe it is the Fresnel-Kirchhoff parameter ν, which mashes together the geometry and the wavelength into a single dimensionless number with the virtue of fitting on one axis of a graph. ITU-R &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.itu.int&#x2F;rec&#x2F;R-REC-P.526&#x2F;&quot;&gt;P.526&lt;&#x2F;a&gt; gives the loss curve. ITU publications are not known for brevity, but they do, eventually, tell you what you need to know.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-knife&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;A knife edge grazing the LOS already costs 6 dB. Stick it one Fresnel zone above and you&#x27;re down 20+. It&#x27;s cheap power on VHF. On 10 GHz the same geometry is almost never workable on its own.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;real-hills-are-rounded-which-costs-more&quot;&gt;Real hills are rounded, which costs more&lt;&#x2F;h2&gt;
&lt;p&gt;Knife edges are a convenient fiction. A rounded summit scatters more energy away from the shadow zone, so actual loss is worse than the knife-edge baseline. P.526 tacks on an extra term based on the crest&#x27;s radius of curvature.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-round&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;This is where path profile software starts lying to you, politely and with conviction. If it says a ridge clears by 5 meters and you&#x27;ll be +3 dB over the noise floor, you can usually subtract another 5–10 dB once you account for the rounding. Most of the time that subtraction puts the link under water. Except the link works. So something else is going on.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;air-isn-t-empty&quot;&gt;Air isn&#x27;t empty&lt;&#x2F;h2&gt;
&lt;p&gt;Air, it turns out, cares quite a bit about radio waves. Microwaves travel a hair slower through it than through vacuum, and the slowness changes with pressure, temperature, and humidity. Radio engineers express it as N-units:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;N = (n − 1) * 10⁶&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;where &lt;em&gt;n&lt;&#x2F;em&gt; is the refractive index. At sea level N is usually around 315. It falls off with altitude, and the slope of that fall is what bends rays.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-refractivity&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;The dashed line is the international standard atmosphere. Drag the slope and the regime label changes with it. At VHF and UHF, useful tropo propagation starts happening as soon as you leave standard. At 10 GHz and above it takes a much steeper gradient to do useful work, and the gradient also has to sit on a &lt;em&gt;thick enough&lt;&#x2F;em&gt; inversion to trap the wavelength. Many of the atmospheres that ducting-detection code flags as &quot;ducting&quot; are only strong enough to carry 1 to 5 GHz, and the shape the slider has to make for a reliable 24 GHz contact is rare enough that you can count the nights per year it happens.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rays-follow-the-gradient&quot;&gt;Rays follow the gradient&lt;&#x2F;h2&gt;
&lt;p&gt;A horizontal ray in a medium whose refractive index falls with altitude bends downward. The tighter the gradient, the tighter the curve. Under the standard atmosphere the bend is gentle, about a quarter of Earth&#x27;s own curvature, and engineers handle this by quietly pretending the Earth is 4&#x2F;3 its real size and the rays are straight. Nobody points out that this is a slightly strange thing to do. That&#x27;s the familiar &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Effective_Earth_radius&quot;&gt;k = 4&#x2F;3 effective-Earth factor&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The slider below is labeled &lt;strong&gt;dN&#x2F;dh&lt;&#x2F;strong&gt;, which reads as &quot;the change in N per unit of altitude.&quot; It&#x27;s just the slope of the refractivity curve from the previous scene, in N-units per kilometer. If N drops from 315 at the surface to 275 at 1 km up, dN&#x2F;dh is −40 N&#x2F;km. That&#x27;s the international standard atmosphere, and it&#x27;s also the zero point for everything that follows. More negative numbers mean refractivity is falling &lt;em&gt;faster&lt;&#x2F;em&gt; with altitude, which is what bends rays harder:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;around −40 N&#x2F;km&lt;&#x2F;strong&gt;, standard. k ~ 4&#x2F;3, mildly bent rays, ordinary radio horizon.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;below −79 N&#x2F;km&lt;&#x2F;strong&gt;, super-refraction. Rays bend meaningfully more than normal. A lot of VHF&#x2F;UHF tropo propagation lives here.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;below −157 N&#x2F;km&lt;&#x2F;strong&gt;, the asymptotic trapping boundary. Rays curve tighter than the Earth itself curves away. Textbooks draw the line here. In practice a usable duct needs the gradient to be stronger still. The actual step from &quot;rarely ducting&quot; to &quot;almost always ducting&quot; in real atmospheric soundings sits closer to −200 to −300 N&#x2F;km, because the duct also has to be thick enough to hold the wavelength you care about.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;div id=&quot;scene-raytrace&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Drag dN&#x2F;dh through those thresholds and watch the traced ray. Standard air, ray exits into space eventually. Super-refractive air, the ray stays close to the surface far longer. Trapping air, the ray never gets out at all, which is where the next scene picks up.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s a second way to write the same thing that propagation engineers use, called the &lt;strong&gt;modified refractivity&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;M = N + 0.157 * h&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;where h is altitude in meters. The 0.157 term is chosen so that M flattens Earth&#x27;s curvature into the math: a ray in a medium with &lt;code&gt;dM&#x2F;dh = 0&lt;&#x2F;code&gt; travels parallel to Earth&#x27;s surface, and a layer where &lt;code&gt;dM&#x2F;dh &amp;lt; 0&lt;&#x2F;code&gt; is, by definition, a duct. It&#x27;s the same statement as &quot;dN&#x2F;dh below −157 N&#x2F;km&quot; said in nicer coordinates, and most duct papers use it because the condition becomes a single sign check rather than a threshold to remember.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-signal-gets-trapped&quot;&gt;The signal gets trapped&lt;&#x2F;h2&gt;
&lt;p&gt;Propagation models talk about &quot;rays&quot; because the math is a lot easier when you treat a radio wave as a bundle of straight (or curving) lines, each representing the direction the wavefront is moving at that point. In practice, those lines are the actual paths your RF follows out of the antenna. When the atmosphere bends them, your signal goes where the lines go.&lt;&#x2F;p&gt;
&lt;p&gt;A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Atmospheric_duct&quot;&gt;&lt;em&gt;duct&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; is a layer of atmosphere where the refractivity drops steeply enough that any signal launched into the layer at a shallow enough elevation angle can&#x27;t escape upward. Picture a slice of your antenna&#x27;s radiation pattern between about −0.5° and +0.5° elevation. Normally that energy just keeps rising into space and is lost. Under a duct, it climbs into the layer, curves back down, hits the ground (or a lower boundary of the duct) and reflects, climbs again, curves back down again, and keeps repeating. The signal skips along inside the duct for hundreds of kilometers, losing very little on each bounce because the reflections are shallow and the layer is keeping the wavefront collimated.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-duct&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Green paths in the scene are the rays (ray = the direction the wavefront is traveling) that stay trapped inside the duct. Orange ones escape. The &quot;critical angle&quot; is the elevation window that stays trapped, and it&#x27;s tiny, usually a fraction of a degree. That&#x27;s why ducting is so fickle. Your antenna has to be radiating useful power inside that window, &lt;em&gt;and&lt;&#x2F;em&gt; the duct has to exist above your station, &lt;em&gt;and&lt;&#x2F;em&gt; the station on the other end has to be inside it or close enough for its energy to enter, &lt;em&gt;and&lt;&#x2F;em&gt; the duct has to be thick enough in meters to actually trap whatever wavelength you&#x27;re running. When all four line up, your 10 GHz rig works a contact 400 km away and you feel briefly invincible. When any one of them is off, the path behaves the way the terrain profile says it should, which is to say, not at all. The atmosphere is happy to support this arrangement, briefly, before rearranging itself into something less interesting, usually right around the time you reach for the microphone.&lt;&#x2F;p&gt;
&lt;p&gt;The reframing buried in that list is the one I keep coming back to. &quot;Is there a duct, yes or no&quot; is a surprisingly bad predictor of whether a 10 GHz contact will work. In the contact logs we&#x27;ve collected, the median distance on days with a duct and the median on days without one are almost identical. What actually correlates with distance is the &lt;em&gt;magnitude&lt;&#x2F;em&gt; of the gradient, the &lt;em&gt;thickness&lt;&#x2F;em&gt; of the trapped layer, and how well that thickness matches the wavelength. The same inversion that supports 1 GHz beautifully might do nothing at 24 GHz because it&#x27;s a few meters too thin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;flavors-of-duct&quot;&gt;Flavors of duct&lt;&#x2F;h2&gt;
&lt;p&gt;Four show up in the wild, same physics, different mechanisms for setting them up.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-ducttypes&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;&lt;strong&gt;Radiation (nocturnal) ducts&lt;&#x2F;strong&gt; are the ones that matter inland. Clear calm sky, ground radiates to space faster than the air can cool, an inversion forms 50 to 300 meters thick, gradient runs anywhere from −100 to −300 N&#x2F;km. Forms one to three hours after sunset, peaks right before dawn, collapses an hour or two after sunrise when mechanical mixing chews it up. The dataset says about 70% of June-July pre-dawn mornings in Texas have one. Almost every inland 10 GHz DX contact you will ever make is riding a radiation duct.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Subsidence (elevated) ducts&lt;&#x2F;strong&gt; sit aloft under the ridge axis of a high-pressure system. Sinking air warms and dries, producing a sharp temperature rise and dewpoint drop at 800 to 900 hPa. The trapped layer sits 500 to 2000 meters up and can stay there for days. Both ends of the link usually need to be inside it, or aimed high enough to couple into it. This is the &quot;an elevated duct parks over North Texas&quot; situation people mean when they say a good weekend is forecast.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Advection ducts&lt;&#x2F;strong&gt; form when warm dry air moves over a cooler surface. Coastal and marine. Gulf Coast operators know these well. Not a mechanism inland North Texas sees.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Evaporation ducts&lt;&#x2F;strong&gt; exist almost continuously in the first 5 to 40 meters over warm oceans, driven by the humidity gradient at the sea surface. Every over-water microwave link above a few GHz lives inside one. Also irrelevant for anyone operating from Oklahoma.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-real-path&quot;&gt;A real path&lt;&#x2F;h2&gt;
&lt;p&gt;This is the 65 km path I&#x27;ve been staring at: my QTH at 205 m above sea level to the W5HN&#x2F;B beacon on top of the TWU dorms in Denton. Earth&#x27;s curvature (using the standard k = 4&#x2F;3 effective Earth) is added on top, which is why the middle of the profile bulges up about 62 m above the endpoints. The first Fresnel zone at 10 GHz has a midspan radius of about 22 m. The terrain is unambiguously in the way. On the right days the path works anyway.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-real&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Figuring out whether it&#x27;s going to work on any given day is the whole point of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&quot;&gt;https:&#x2F;&#x2F;prop.w5isp.com&lt;&#x2F;a&gt;. The app pulls &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rapidrefresh.noaa.gov&#x2F;hrrr&#x2F;&quot;&gt;HRRR&lt;&#x2F;a&gt; at its 50 native hybrid-sigma levels (not the standard 13 pressure levels, which are spaced about 250 m apart and completely miss the 50 to 100 m thin ducts we care about), corrects against ASOS surface observations and twice-daily radiosonde profiles, and computes the refractivity gradient along every tracked path. It also polls seven commercial 11, 24, and 68 GHz microwave links around Princeton TX every five minutes as an inverse sensor, because the same refractivity anomaly that helps beyond-LOS paths causes multipath fades on LOS ones. My QTH happens to be one endpoint of that network, so the commercial-link telemetry becomes a direct real-time signal on whether the atmosphere over this specific path is doing anything interesting.&lt;&#x2F;p&gt;
&lt;p&gt;A few things I didn&#x27;t expect going in, now painfully clear from the data.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-data&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;&lt;strong&gt;The path is almost always blocked.&lt;&#x2F;strong&gt; The numbers in this section come from the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.arrl.org&#x2F;10-ghz-up&quot;&gt;ARRL 10 GHz and Up Contest&lt;&#x2F;a&gt; logs I&#x27;ve been able to collect so far. In that dataset, 97 percent of logged amateur microwave contact paths are terrain-blocked at an average diffraction loss of 36 dB. Beyond-LOS is not the exceptional case, it is the default case. Clear LOS paths are short and rare. The long contacts that show up in contest logs are all riding atmospheric enhancement of some kind. The sample is as good as it currently is; if you have logs I don&#x27;t, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&quot;&gt;submit them&lt;&#x2F;a&gt; so the distributions sharpen instead of drift.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Binary duct detection is a coin flip.&lt;&#x2F;strong&gt; The median contact distance when HRRR says &quot;there is a duct&quot; is statistically identical to when it says &quot;there is not.&quot; What separates a working 10 GHz morning from a silent one is the &lt;em&gt;strength&lt;&#x2F;em&gt; of the gradient (how far past −200 N&#x2F;km it gets), the &lt;em&gt;thickness&lt;&#x2F;em&gt; of the layer in meters, and whether that thickness matches the wavelength. Ducting is a shape, not a switch.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Low pressure beats high pressure.&lt;&#x2F;strong&gt; The folklore says high pressure is a ham microwave operator&#x27;s friend. The data says otherwise: on 10 GHz, contacts made under 970 mb average 243 km; over 1020 mb average 103 km. Subsidence ducts under a ridge are real and matter, but on average the ridge itself is not actually the best time to be on the radio.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Shallow boundary layer beats deep.&lt;&#x2F;strong&gt; HPBL (planetary boundary layer height) under 200 m averages 230 km; over 2000 m averages 100 km. A calm cool morning with a shallow boundary layer is what you want.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The useful window is centered on sunrise, not midnight.&lt;&#x2F;strong&gt; Radiation ducts are strongest right before dawn and for an hour or two after. The contacts cluster in a window about an hour and a half either side of sunrise, and that&#x27;s where the app focuses its scoring.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Pre-dawn matters more the higher you go.&lt;&#x2F;strong&gt; At 10 GHz, time-of-day enhancement is about +4% over the daily median. At 24 GHz, +28%. At 75 GHz, +360%. If you are pointing a 3 mm dish at someone, you are almost certainly doing it before breakfast.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-band-time&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;&lt;strong&gt;Humidity is a trade.&lt;&#x2F;strong&gt; Precipitable water, or PWAT, is the total amount of water vapor in a column of atmosphere above you, expressed as the depth you would get if you condensed all of it into liquid and let it puddle on the ground. A PWAT of 25 mm means that if every water molecule above your antenna fell out of the sky at once, you would be standing in an inch of water. It is the number forecasters use to describe how wet the air is in bulk, and for microwave propagation it is the variable that matters, because the refractivity gradient that bends signals depends on water vapor more than any other single thing.&lt;&#x2F;p&gt;
&lt;p&gt;At 10 GHz, 20 to 30 mm of PWAT is the sweet spot. Too dry and the surface refractivity stays low, too wet and the column destabilizes. At 24 GHz, drier is always better, because the 22.235 GHz water vapor line happily eats whatever signal the atmosphere just delivered.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-pwat&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;&lt;strong&gt;Spring is the worst season. Summer is the best.&lt;&#x2F;strong&gt; I went into this thinking winter would be the dead period, but March and December turn out to be the two worst months of the year, and June and July are by far the best. The dominant Texas radiation-duct season runs May through August.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-seasonal&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Troposcatter is the floor under all of this, and fortunately the floor is higher than the arithmetic suggests it has any right to be. The average blocked path is 36 dB down from free space, and realistic duct enhancement caps out around 14 dB. On paper these numbers add up to the paths not working, which would be a compelling argument for abandoning the hobby, except that the paths work anyway. The gap gets made up by forward-scattered energy bouncing off small-scale refractive irregularities in the troposphere, which are present all the time whether you need them or not. Ducting is the spike on top of the troposcatter baseline, not the only mechanism in play.&lt;&#x2F;p&gt;
&lt;div id=&quot;scene-budget&quot;&gt;&lt;&#x2F;div&gt;
&lt;p&gt;The part that keeps me working on it is how often the path surprises me. People who have been operating these bands for forty years still show up on the post-contact mailing lists asking each other how a contact made it through, which is both humbling and a strong argument against ever finishing this project. The more verified contacts we log with atmospheric data behind them, the better the model gets.&lt;&#x2F;p&gt;
&lt;p&gt;If you run 50 MHz or up, submit your contacts or beacons at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&quot;&gt;https:&#x2F;&#x2F;prop.w5isp.com&lt;&#x2F;a&gt;. A continuous, known-distance path is worth a lot more to the model than a pile of contest contacts.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;script src=&quot;&#x2F;js&#x2F;nlos.js&quot; defer&gt;&lt;&#x2F;script&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>When Postgres isn&#x27;t the right choice</title>
        <published>2026-04-20T00:00:00+00:00</published>
        <updated>2026-04-20T00:00:00+00:00</updated>
        <author>
          <name>
              Graham McIntire
          </name>
        </author>
        <link rel="alternate" type="text/html" href="https://w5isp.com/blog/postgres1/"/>
        <id>https://w5isp.com/blog/postgres1/</id>
        
        <content type="html" xml:base="https://w5isp.com/blog/postgres1/">&lt;p&gt;I&#x27;ve been spending most of my recent unemployment working on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&quot;&gt;Microwave Propagation&lt;&#x2F;a&gt; prediction website.&lt;&#x2F;p&gt;
&lt;p&gt;The propagation map ingests HRRR weather every hour and re-scores the entire CONUS grid across many
amateur radio microwave bands. That is 95,000 grid points * 23 bands * 19 forecast hours = ~41.5
million score values per chain. For a long time those lived in a Postgres table called
propagation_scores.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-shape-mismatch&quot;&gt;The shape mismatch&lt;&#x2F;h2&gt;
&lt;p&gt;Each hourly run did this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DELETE FROM propagation_scores WHERE valid_time = $1;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;INSERT INTO propagation_scores (lat, lon, band_mhz, valid_time, score, factors) ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;475,000 rows per forecast hour (at the time it was only 5 bands, now it would be 2,185,000 per
forecast hour), funneled through four indexes (PK UUID, uniqueness tuple, valid_time, (band_mhz,
valid_time)), plus a JSONB factors blob for the analysis hour. Scoring + upsert took about 4m 40s
per forecast hour. Across 19 hours that&#x27;s more than an entire hourly cron cycle, so we had to back
off to once every 3 hours just to keep up.&lt;&#x2F;p&gt;
&lt;p&gt;I was originally running the Postgres server and app on a dell r630 server I have running proxmox
on some raid5 SAS spinny drives. It quickly became obvious IOPS were the primary issue. The first
mitigation I applied was to move the database to an nvme backed server.&lt;&#x2F;p&gt;
&lt;p&gt;The problem wasn&#x27;t Postgres. Postgres is an amazing database when you use it for what it&#x27;s good at.
The problem is trying to store ephemeral data that rotates once an hour. AUTOVACUUM couldn&#x27;t keep
up even on the faster nvme, so ANALYZE never got run. It compounded every hour.&lt;&#x2F;p&gt;
&lt;p&gt;The map is a canvas heatmap. It wants one dense (lat, lon) -&amp;gt; score array for a single (band,
valid_time). We were storing it as half a million row tuples with MVCC bookkeeping, toast pages,
and a B-tree index per column we&#x27;d never query by. Every write rematerialized metadata the reader
throws away.&lt;&#x2F;p&gt;
&lt;p&gt;Before rewriting the store, we tuned what was there:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;DELETE + INSERT ... with no ON CONFLICT. The chain worker rewrites a full (valid_time, all bands) slice every hour, so conflict detection was pure waste. Skipping it shaved time off.&lt;&#x2F;li&gt;
&lt;li&gt;Skip factors on forecast hours. factors is a ~200-byte JSONB per row describing the ten scoring components (rain, humidity, refractivity, etc.). We only show it on the analysis hour (f00) when the user clicks a cell. Passing factors: nil for f01–f18 skips a JSONB encode plus a toast write for roughly half the volume.&lt;&#x2F;li&gt;
&lt;li&gt;UNLOGGED table. Writes bypass the WAL entirely. On unclean shutdown the table truncates — fine, because PropagationGridWorker rebuilds it from HRRR every hour. Durability was never the point, this was a cache with extra steps.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;These helped, but the per row overhead of a row oriented store against a dense numeric grid is a
ceiling you can&#x27;t tune past. I was still running into issues with Postgres not being able to keep
up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;enter-the-binary-file&quot;&gt;Enter the binary file&lt;&#x2F;h2&gt;
&lt;p&gt;Each (band_mhz, valid_time) grid now lands in one file at &#x2F;data&#x2F;scores&#x2F;{band}&#x2F;{iso}.ntms that&#x27;s
mounted over NFS by the pods:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;magic      : 4 bytes   &amp;quot;NTMS&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;version    : 1 byte    0x01&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;band_mhz   : 4 bytes   uint32 LE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;valid_time : 8 bytes   int64 unix seconds LE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;lat_min    : 4 bytes   float32 LE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;lon_min    : 4 bytes   float32 LE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;step_deg   : 4 bytes   float32 LE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_rows     : 2 bytes   uint16 LE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_cols     : 2 bytes   uint16 LE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores     : n_rows * n_cols bytes (uint8, 0–100; 255 = no-data)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;33-byte header, dense uint8 array. A full CONUS grid serializes to ~93 KB per band per hour. A cell
at (lat, lon) is at byte offset row * n_cols + col, so a point lookup is arithmetic plus a single
File.read&#x2F;1. No index, no query planner, no lock manager.&lt;&#x2F;p&gt;
&lt;p&gt;Writes go through the temp-then-rename pattern:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tmp = path &amp;lt;&amp;gt; &amp;quot;.tmp.&amp;quot; &amp;lt;&amp;gt; unique_suffix()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;File.write!(tmp, binary, [:binary])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;File.rename!(tmp, path)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With Postgres off the hot path, the full f00–f18 chain dropped from ~170 min to ~45–60 min, so we
ran the cron back up to hourly. The 15-minute prune cron reaped expired files with rm which is instant.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-f00-factor-breakdown&quot;&gt;The f00 factor breakdown&lt;&#x2F;h2&gt;
&lt;p&gt;One thing binary files don&#x27;t handle well is the analysis-hour factor breakdown (the 10-component
panel you see when you click a cell). Those factors are heterogeneous Elixir maps, not a numeric
grid.&lt;&#x2F;p&gt;
&lt;p&gt;The solution was a second file format, ProfilesFile: one compressed ETF file per valid_time at
&#x2F;data&#x2F;scores&#x2F;profiles&#x2F;{iso}.etf.gz, storing the enriched HRRR grid keyed by {lat, lon}. On a click,
we reload the relevant cell&#x27;s profile and rescore on demand. Same atomic-rename write pattern,
different payload — ETF where heterogeneity matters, raw binary where density does.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;The whole propagation project has been fun to write and tweak continuously. I continue to find and
fix various bottlenecks and limitations. Each individual component in the stack is great at what it
does, but sometimes when you start throwing millions of rows per hour and then deleting them it
gets a little fussy.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>How can microwave contacts be made non-LOS?</title>
        <published>2026-04-18T00:00:00+00:00</published>
        <updated>2026-04-18T00:00:00+00:00</updated>
        <author>
          <name>
              Graham McIntire
          </name>
        </author>
        <link rel="alternate" type="text/html" href="https://w5isp.com/blog/prop1/"/>
        <id>https://w5isp.com/blog/prop1/</id>
        
        <content type="html" xml:base="https://w5isp.com/blog/prop1/">&lt;p&gt;TL;DR non line of sight ham radio microwave contacts are possible, weather is neat, and check out my new site &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&quot;&gt;https:&#x2F;&#x2F;prop.w5isp.com&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;How to make microwave contacts non-line-of-sight (NLOS) is a question I&#x27;ve had for
a while now. From running a WISP I&#x27;m very familiar with point-to-point microwave
links. However, amateur radio operators have been making NLOS contacts for years
that technically shouldn&#x27;t work at all.&lt;&#x2F;p&gt;
&lt;p&gt;As an example, this is the elevation path between my station and an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&#x2F;beacons&#x2F;dddca785-c3e7-45f8-8f9f-edc748f881d6&quot;&gt;NTMS beacon on top of Texas
Woman&#x27;s University&#x27;s dorm building&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;path_profile.png&quot; alt=&quot;Path profile&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This led to a deep rabbit hole to investigate why contacts work sometimes and HOW they work.
There are already known propagation methods such as EME (moonbounce), rain scatter, and meteor
scatter, but it&#x27;s also possible to form ducts within the lower levels of the atmosphere with
favorable conditions. An easy visual analogy: ships sometimes appear to float above the horizon.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;atmospheric_ducting.jpg&quot; alt=&quot;Atmospheric ducted ship&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This is because there&#x27;s a duct with favorable conditions for refracting visible light, the same
thing happens with microwave signals.&lt;&#x2F;p&gt;
&lt;p&gt;At one of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ntms.org&quot;&gt;NTMS&lt;&#x2F;a&gt; meetings, KM5PO presented on this exact topic and had used
Claude to write some client-side pages to help predict and analyze the propagation. It was based
on limited data, but did an okay job guessing at why the propagation worked. That talk is what
kicked off this project.&lt;&#x2F;p&gt;
&lt;p&gt;Fast forward a few weeks and I&#x27;ve now built an Elixir&#x2F;Phoenix app at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&quot;&gt;https:&#x2F;&#x2F;prop.w5isp.com&lt;&#x2F;a&gt; that
collects and processes everything. For a quick import of some known contacts, I pulled in results
from the ARRL 10 GHz and Up and 222 MHz and Up contests, VHF&#x2F;UHF&#x2F;microwave events where stations
log long-distance contacts on those bands.&lt;&#x2F;p&gt;
&lt;p&gt;With known contacts in place, it was time to backfill them with data. To predict ducting we need
atmospheric data at fine vertical resolution, so the app pulls from a mix of weather models,
surface observations, upper-air soundings, and terrain:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;atmospheric&quot;&gt;Atmospheric&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;HRRR (NOAA 3 km), hourly f00–f18 propagation scoring hot path; native hybrid-sigma levels for fine-grained duct detection&lt;&#x2F;li&gt;
&lt;li&gt;GEFS (NOAA 0.5° ensemble), Day 2–7 extended-horizon outlook&lt;&#x2F;li&gt;
&lt;li&gt;HRRR native (hybrid σ), best-duct-band per cell, refractivity gradient at 10–50 m resolution&lt;&#x2F;li&gt;
&lt;li&gt;IEMRE (Iowa State 0.125° reanalysis), gridded hourly weather for per-contact enrichment&lt;&#x2F;li&gt;
&lt;li&gt;NARR (NCEI 32 km reanalysis), pre-2014 historical backfill for old contacts (HRRR archive doesn&#x27;t cover them)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;surface-observations&quot;&gt;Surface observations&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;ASOS (via IEM), airport station surface weather, used by per-contact enrichment and the 10-minute score nudge&lt;&#x2F;li&gt;
&lt;li&gt;MRMS (NOAA PrecipRate), 2-minute radar-derived rain rate that overlays HRRR&#x27;s hourly precip for fast-moving cells&lt;&#x2F;li&gt;
&lt;li&gt;NEXRAD (Level II composite reflectivity), current-hour precip cell detection for f00 scoring&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;upper-air&quot;&gt;Upper air&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;RAOB (US radiosondes via IEM), twice-daily soundings for duct&#x2F;inversion analysis&lt;&#x2F;li&gt;
&lt;li&gt;UWYO (Canadian radiosondes), 00&#x2F;12 Z Canadian profiles&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;terrain-geography&quot;&gt;Terrain &amp;amp; geography&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;SRTM (90 m local tile cache + fallback API), ITU-R P.526-16 path diffraction + viewshed&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It&#x27;s taken a mountain of work and time to get all of this implemented, but most of the contacts
have now been backfilled with this information. Feeding all of this in to Claude, we end up with an
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prop.w5isp.com&#x2F;algo&quot;&gt;algorithm&lt;&#x2F;a&gt; that understands and can predict future conditions based
on weather data.&lt;&#x2F;p&gt;
&lt;p&gt;This algorithm gets turned into code, and then we can fetch HRRR data hourly, amend with ASOS
when available, and feed it through the algorithm to determine if any given area&#x27;s atmosphere is
favorable to propagation. The predictions are still experimental and not yet validated against
enough real-world contacts to be trusted.&lt;&#x2F;p&gt;
&lt;p&gt;Now our mission is to continue collecting as many verified contacts on 50 MHz and up (the bands
where ducting and other exotic modes are most useful to amateurs) and use them to refine the
prediction model gradually over time. Another sub-project is automated beacon monitoring. Any
NLOS beacon that can be monitored continuously provides an enormous amount of training data,
since both endpoints are known and fixed.&lt;&#x2F;p&gt;
&lt;p&gt;The effort has been growing and we now have help from a senior meteorologist in Lubbock, TX and
many hams submitting verified contacts. If you&#x27;d like to help out, we need as many contacts as
possible during non-contest times, contest weekends concentrate activity into a few days, but
the model needs samples spread across all conditions. We also need volunteers for future
automated beacon monitoring. You can reach me at my first name at my last name dot me (it&#x27;s in
the footer).&lt;&#x2F;p&gt;
</content>
    </entry>
</feed>
