The Matter Power Spectrum
Physics intuition for this page was provided by Alejandro Aviles. Any mistakes in its implementation are mine.
Everything with mass in the universe is clumped, and this curve is the inventory of that clumping, scale by scale. Neutrinos are the one component that refuses to clump. They moved too fast, for too long, and the power they failed to contribute is missing from the small-scale end — a few percent, no more. That deficit is the most sensitive scale we have for weighing a neutrino.
Three panels. The top one is the linear matter power spectrum for your parameters, against the identical model with massless neutrinos. The middle one is their ratio, and the entire neutrino signal lives there — it is a few percent deep, which is why it needs its own panel. The bottom one is the measurement: the posterior on Σmν from DESI DR2, with a marker showing where you have put the slider.
Constraint: DESI Collaboration, DESI DR2 results II: measurements of baryon acoustic oscillations and cosmological constraints, arXiv:2503.14738, combined with Planck and ACT DR6 lensing; the curves plotted here are computed from the chains directly. Mass splittings from the Particle Data Group. Spectra from CAMB.
What the measurement says —
What the curve is
Take the density of matter everywhere in the universe, divide by the mean, subtract one. That gives a field of over- and under-densities. Decompose it into waves, and P(k) is the mean square amplitude of the wave with wavenumber k. Large k is small scales. The units are volume — cubic megaparsecs — because P(k) is a variance per unit volume in k-space, and the convention is to measure distance in Mpc/h so that the answer does not depend on the Hubble constant you assume to convert redshifts into distances.
The curve has a peak, at about k = 0.016 h/Mpc, and the peak is not primordial. Inflation handed over a spectrum that is very nearly a featureless power law, P ∝ kns, rising to the right. What bent it is the radiation era: a mode that came inside the horizon while radiation still dominated found its growth almost stopped, because the radiation was smooth and would not clump with it. Modes that came in later grew freely. So the turnover marks the horizon at matter–radiation equality, and everything to the right of it — the entire small-scale half of the plot — is suppressed relative to what inflation produced, by an amount that depends on how long radiation ran the universe. That is why the peak position measures Ωmh², and why it moves when you drag Ωm.
The small wiggles past the peak are baryon acoustic oscillations — the same standing sound waves that make the peaks in the microwave background spectrum, seen here in what the matter did rather than what the light did. They are a few percent in amplitude, and they are the standard ruler DESI uses. Where a power spectrum comes from covers the measurement side.
The wiggles on their own
Tick BAO wiggles and a panel appears with the broadband divided out. What is left is the acoustic oscillation by itself — a damped wave of a few percent, largest at its first crest near k = 0.07 h/Mpc and gone by about k = 0.6 h/Mpc. On the curve above it is a texture you can barely see; here it is the whole plot.
Two things are worth reading off it. The first is that the crests are evenly spaced, which is why that panel uses a linear k axis instead of the logarithmic one above. A standard ruler of length rd in real space is a pure sinusoid of period Δk = 2π/rd in Fourier space, and even spacing is exactly what one sharp scale looks like in this picture. The readout gives rd, the spacing that predicts, and the spacing measured off the curve itself; drag Ωbh² or Ωm and watch all three move together. This is the ruler DESI reads, and reading it is the whole of a BAO measurement.
The second is the damping. Each crest is smaller than the last, and past k ≈ 0.6 there is nothing left at all. That is Silk damping: in the last stretch before recombination the photons random-walk a finite distance, and on wavelengths shorter than that walk they carry their pressure out of the compressions and smooth the oscillation away. Only waves longer than the diffusion length survive. The same envelope closes down the high-ℓ end of the microwave background spectrum, for the same reason and at the same physical scale — these are two photographs of one sound wave, one taken in light and one in matter.
Now drag Σmν with this panel open. Almost nothing happens — and it is worth being careful about what that does and does not mean. This panel divides P(k) by its own smooth spectrum, so any suppression acting on the wiggles and the broadband alike cancels out of it exactly, by construction. Neutrino free-streaming is precisely such a suppression. Holding Ωch² fixed and going from massless neutrinos to 0.5 eV leaves the relative crest height at 6.5%, while the absolute size of the wiggles falls to 0.82 of what it was — closely tracking the broadband's own 0.77. The wave is damped very nearly as hard as the envelope carrying it.
So what this panel shows is that neutrinos do not change the wiggles' shape: not their spacing, not their phase, not their height relative to the curve they sit on. It does not show, and cannot show, that the wiggles are left alone. They are not.
To see the part that cancels, tick ride them on the neutrino suppression. The divisor changes from this model's own smooth spectrum to the one it would have with massless neutrinos, and the wiggle train drops away from one and settles onto a sinking dashed envelope — the broadband suppression, now drawn underneath the wave rather than divided out from under it. At 0.3 eV the crests sit near 0.85 instead of 1.0, and the whole pattern has come down with the envelope. Keep dragging the mass and watch the wave sink while its shape stays rigid: the ratio of crest to envelope holds at 1.0656 from zero to half an eV, to four figures. Those two facts together — the wiggles are damped, and damped by exactly the factor the broadband is — are the whole of what neutrinos do to the acoustic feature in linear theory.
Which of the two a survey can actually use is a live question, and the answer is not the obvious one. A BAO analysis deliberately throws the broadband away and fits only where the crests sit, which makes it a nearly pure measurement of geometry. You might then expect the neutrino mass to be the full shape's business, since the full shape is what keeps the suppressed broadband. Noriega and Aviles tested exactly that: they split linear spectra for 0 and 0.5 eV into broadband and wiggles and glued the pieces back together crosswise — a Frankenstein experiment, in their words — then fitted each hybrid. The fits followed the wiggles. A spectrum built from the massless broadband carrying the massive wiggles returned 0.5 eV; one with the heavily suppressed broadband but massless wiggles came back consistent with zero. Their conclusion is that a full-shape analysis is largely “blind to the suppression of the broadband”, because a smooth suppression is degenerate with galaxy bias and the counterterms that get marginalised away, while the wiggles are a sharp feature no smooth nuisance term can imitate. On that reading the mass is measured through how far the acoustic wave has been damped — which is the very quantity this panel is built to divide out. H. E. Noriega and A. Aviles, arXiv:2407.06117.
The wiggles do care intensely about one thing: baryons. Push Ωbh² from 0.0210 to 0.0240 and the crests grow from 6.0% to 7.0%, because baryons are the inertia in the photon–baryon fluid and a heavier fluid rings harder. It is the same parameter that sets the odd–even peak alternation in the CMB spectrum, doing the same job. Raising Ωm instead shrinks the ruler — rd falls from 103.8 to 97.1 Mpc/h between Ωm = 0.27 and 0.35, because more matter means an earlier equality and less time for sound to travel — and the crest spacing widens to match.
A no-wiggle spectrum is not a uniquely defined object, and different papers draw it differently. Here the broadband is flattened with a sparse spline in log–log and the oscillation is then removed from what remains by a moving average of exactly one acoustic period, which has an exact null at the fundamental and at every harmonic. Both pieces are smooth, so their sum is a legitimate smooth spectrum; the split between “broadband” and “wiggle” near the very ends of the band is the part that is convention rather than physics, which is why the panel stops at k = 0.03 rather than running into the turnover.
Why a neutrino shows up on this plot
There are about 336 relic neutrinos in every cubic centimetre of space, which makes them the second most abundant particle in the universe after the photons of the microwave background. They decoupled about a second after the big bang and have been cooling ever since; their temperature now is 1.95 K. They are everywhere, they are unavoidable, and the one thing about them we have never managed to measure is how much they weigh.
Their contribution to the mass budget is fixed by that abundance, so it is simply proportional to the total mass:
Ωνh² = Σmν / 93.14 eV
At the smallest mass the oscillation experiments allow, Σmν = 0.059 eV, that is Ωνh² = 0.00063: about 0.45% of the matter in the universe, or some 3% of what all the baryons weigh, carried by particles that outnumber those baryons a billion to one. Half a percent is not nothing, but a half-percent change in Ωm would be hopeless to detect on its own. Neutrinos are detectable because they do something no other half-percent of the matter does.
Free streaming
A neutrino of mass m stops being relativistic when its typical momentum drops below its mass, at a redshift 1 + znr ≈ 1890 (m/1 eV). For one species of 0.02 eV — a third of the minimum sum — that is z ≈ 37. So these particles spent essentially the whole history of structure formation moving at very nearly the speed of light.
A particle moving that fast does not stay in a gravitational well smaller than the distance it crosses in a Hubble time. It streams straight through. The consequence is a scale: above a wavenumber kfs, neutrino perturbations are erased as fast as they form, and the neutrinos contribute their mass to the expansion but nothing to the clumping. Below it, they are slow enough to be caught, and they behave like any other cold matter. The step you can see in the ratio panel is that boundary, smeared out because the neutrinos have a thermal spread of speeds and because kfs itself moves as the universe expands. The marker on the plot is where the suppression reaches half its final depth, computed from the curve rather than from a formula.
Two effects, and the second one is bigger
The obvious effect is that a fraction fν = Ων/Ωm of the matter simply fails to clump, which removes 2fν from the power on small scales. That is not the main term. The larger effect is that the neutrinos slow down the growth of everything else: cold dark matter and baryons falling together feel the neutrinos' gravity in the smooth background but get no help from their clustering, so instead of growing in proportion to the scale factor a, the surviving perturbations grow as a1−3fν/5.
That exponent looks harmless. It is not, because growth is an exponential in ln a and the deficit compounds for as long as the neutrinos are non-relativistic and matter is running the universe. A small change in a growth rate, integrated over many e-folds, is a large change in what comes out. Add the 2fν the neutrinos fail to contribute themselves, and the standard result for the small-scale plateau is
ΔP/P ≈ −8 fν
Eight, not two. The neutrinos suppress structure about four times more effectively than their share of the mass would suggest, and that factor is the entire reason a 0.06 eV particle is measurable at all. At the minimum mass fν = 0.0045, so eight times it is a suppression of 3.6% — small, but nothing else in ΛCDM produces a step of that shape at that scale.
The coefficient is not exactly eight, and this page will tell you what it actually is: the coefficient readout under the sliders is the measured depth divided by fν, and it moves as you drag. At the minimum mass it is about −7.9, a little short of eight, because a light neutrino turns non-relativistic late — each species is still relativistic until z ≈ 37 — which leaves fewer e-folds in which to do the damage. Raise the mass and it climbs past eight, to about −8.8 near 0.3 eV, because a heavier neutrino slows down sooner and suppresses growth for longer. Push further still and it eases back — −8.6 by 0.5 eV — because the suppression is an exponential and exponentials saturate. Eight is a good number to carry in your head and a poor one to quote to three figures.
Fixed Ωm, or fixed cold dark matter?
The −8fν result carries a condition that is easy to miss: it is the answer when you trade cold dark matter for neutrinos, holding the total Ωm fixed. That is the comparison in which nothing but the neutrinos has changed, and it isolates the free-streaming physics.
Untick hold Ωm fixed and the page instead keeps Ωch² fixed and lets the neutrinos add to the total. Now two things are happening at once: the free-streaming suppression, and a genuine increase in the matter density, which moves matter–radiation equality earlier and lifts the small-scale power back up. The two partly cancel, and the measured suppression is roughly a third smaller. The depth readout will tell you exactly how much.
Neither convention is wrong; they answer different questions. What is wrong is quoting a suppression without saying which one you used, and the factor between them is large enough to matter. A fit to real data does neither, of course — it lets every parameter move at once, which is what the posterior in the bottom panel represents.
The σ8 trap
Neutrino mass reduces σ8, the amplitude of matter fluctuations in spheres of 8 Mpc/h. So does simply lowering the primordial amplitude As. If the only thing you measured were σ8, the two would be indistinguishable, and you could buy off any neutrino mass you liked by turning As up.
Worse, you cannot expose the difference by moving these sliders. Raising As multiplies the model and its massless reference by exactly the same number, so it cancels out of the ratio panel completely — drag As and that panel does not move by one part in 1015. The compensation has to be done to the comparison instead.
That is what compare at fixed σ8 does. It leaves your model alone and gives the Σmν = 0 reference curve the value of As that makes its σ8 equal to yours — exactly, because σ8² is strictly proportional to As, so the rescaling is closed form and not a search. The readout reports the factor. The question the ratio panel answers then changes from “how much power did the neutrinos remove?” to “given two universes that are equally clumpy on 8 Mpc/h scales, how do they differ?”
Turn it on with the mass up around 0.2 eV and watch the step become a tilt. The curve now sits above one on large scales and below one on small scales, crossing at k ≈ 0.14 h/Mpc — and staying there, within a percent, whatever mass you choose, because that is where the 8 Mpc/h sphere does its weighting. No power has been removed on average; it has been moved, from small scales to large. That tilt is what As cannot imitate, because As has no scale dependence whatsoever. Neither can ns, which tilts but as a pure power law with no characteristic scale — drag ns and the curve pivots smoothly across five decades, with no step and no knee. The neutrinos put a knee at a particular wavenumber, and the wavenumber is set by the mass.
This is the real content of a neutrino mass measurement. It is not a measurement of how much structure there is. It is a measurement of the shape: of a feature at a particular wavenumber, set by how far a particle of a particular mass could travel. That is why the constraint comes from surveys that map a wide range of scales, and why the number quoted from σ8 alone would be worth very little.
What DESI actually does
DESI does not measure the curve in the top panel. It measures the positions of tens of millions of galaxies and quasars, from which it extracts two things: the BAO scale, which is a ruler, and the full shape of the clustering, which is closer to P(k) but is seen through galaxy bias and redshift-space distortions. Neither is the linear matter power spectrum, and the step from one to the other is most of the work in a cosmology analysis.
The neutrino limit comes from combining that with the microwave background, and the logic is a subtraction. The CMB fixes the amplitude of the fluctuations at z = 1100, when the neutrinos were still relativistic and had not yet suppressed anything, and it fixes the matter density and the expansion history very tightly. Given those, ΛCDM predicts how much structure there should be today. A neutrino mass makes the prediction come out lower than it otherwise would, and it also changes the distance–redshift relation, which BAO measures directly. The limit is how far you can push the mass before one or the other breaks.
The posterior in the bottom panel is that constraint, computed here from DESI DR2 BAO with Planck and ACT DR6 lensing. It gives
Σmν < 0.064 eV (95%)
The dropdown above the panel switches between that and three other combinations, including DESI DR1 full-shape, which adds the clustering shape to the BAO ruler and lands at 0.071 eV. These are not independent of one another — they share most of their CMB data — but the spread between them is a fair picture of how much the answer moves with the choice of CMB likelihood and galaxy analysis.
The squeeze
Oscillation experiments measure differences of squared masses and are blind to the absolute scale. Two splittings are known: Δm²21 = 7.5×10−5 eV² and |Δm²32| = 2.45×10−3 eV². Two orderings fit them. In the normal ordering the lone state is the heavy one, and setting the lightest mass to zero gives a minimum sum of 0.059 eV. In the inverted ordering it is the light one, two states sit at the top, and the minimum sum is 0.101 eV. Both are drawn on the bottom panel.
Put those next to the limit and the situation is uncomfortable. The inverted ordering is excluded — not marginally, but by a factor of one and a half in a quantity constrained to a few percent of an eV. And the normal ordering has about 0.005 eV of room left between its floor and the ceiling cosmology has put on it. Drag the slider to 0.059 and look at where the marker falls on the posterior. That is the whole of the remaining space.
| Σmν | fν | 8fν | suppression | coefficient | status |
|---|
Two caveats keep this from being a discovery. The first is that the limit is a ΛCDM limit. Let the dark energy evolve — the w0wa model that DESI's own data prefers — and the same combination gives Σmν < 0.16 eV instead of 0.064, a factor of two and a half, because a changing dark energy density can undo some of what the neutrinos did. A tight neutrino limit and an evolving dark energy cannot both be quoted from the same fit; they trade against each other.
The second is stranger. Several analyses now find that, if you allow the effective neutrino mass to go negative — a mathematical extension in which you add structure rather than remove it — the data prefer it. There is no particle that does that. What it means is that the low-redshift universe contains slightly more structure than the CMB predicts, which is a mild tension pointing somewhere other than at the neutrinos, and the physical limit at zero is then partly an artefact of where the boundary was put. It is worth knowing that the 0.064 is a number from a model that is itself under pressure.
How this is computed
A Boltzmann code cannot run in a browser, so the spectra come from an emulator trained offline on CAMB. This one is unusually small, for a reason worth stating: the linear transfer function does not depend on As or ns at all. Those two enter only through the primordial spectrum, as a multiplication and a power law, so they are applied in closed form in the browser and never emulated. That leaves four parameters — Ωbh², Ωm, H₀ and Σmν — where a naive emulator would have needed six, and four smooth dimensions can be fitted far more accurately than six.
The suppression is emulated as its own quantity rather than being read off as a ratio of two fits. Each training model was run twice, once at its neutrino mass and once with the same parameters and massless neutrinos, and what is stored is log[P/P₀] / fν, a smooth function of order −8 that goes to a finite limit as the mass goes to zero. The page rebuilds P = P₀ exp(fνS). Had the ratio been formed by dividing two independent emulator outputs, each accurate to a tenth of a percent, the errors would not have cancelled and the noise would have been a substantial fraction of a three-percent signal. This way the ratio panel is the thing that was fitted, and it is exact at zero mass by construction.
Both pieces are principal-component decompositions with polynomial coefficients — a polynomial rather than a neural network because in four smooth dimensions it is both more accurate and much smaller to ship. Against — held-out CAMB models never used in the fit and lying inside the range the sliders can reach, the emulator reproduces P(k,z) to a median of — and a worst case of —. The suppression ratio — the quantity the middle panel plots — is good to a worst case of —, which is — of the suppression being measured in the typical case and — of it at the very worst, that worst case falling at the smallest masses where the suppression is itself barely there. σ8 is not emulated at all; it is integrated from the reconstructed spectrum in the browser on every slider move, and agrees with CAMB's own value to —.
One deliberate limitation. Below Σmν = 0.02 eV the training quantity log[P/P₀]/fν is a small number divided by a small number, and CAMB's own numerical noise swamps it — at 0.001 eV the scatter is comparable to the whole value. Fitting through that strip corrupts the answer everywhere, so the suppression emulator is trained only above 0.02 eV and the page holds its input there for smaller masses. Because fν still multiplies the result, zero mass remains exactly zero suppression; the cost is a fraction of a percent of an effect that is under one percent in that strip, and oscillation data excludes the whole of it anyway.
The wiggle panel is a second, independent emulator, and it had to be, because the main one cannot see what it plots. That grid samples k logarithmically, about thirty-two points per decade, while the acoustic oscillation has a period that is constant in k — 2π/rd, about 0.062 h/Mpc. A log grid therefore thins out exactly where the wiggles keep going: it gives nine samples per oscillation at k = 0.1, four at 0.2, and barely one by k = 1, so past k ≈ 0.3 the main curve carries an aliased ghost of the oscillation rather than the oscillation. Dividing out a smooth spectrum would have magnified precisely that. The wiggle emulator is trained on its own grid, uniform in k with about fifteen points per period, and is fitted against x = k rd, the variable the oscillation is genuinely periodic in. The crests then sit at essentially fixed x whatever the cosmology, and where they land in k is handed to rd, which is emulated separately as a small polynomial accurate to —, rather than left to the reconstruction. What the fit still has to learn is the envelope, and that does move: between Ωm = 0.27 and 0.35 the crests drop from 7.9% to 4.8% while staying put in x.
An honest footnote on that choice. The obvious argument for fitting in x — that against k the whole train would slide and need many more components — turns out not to survive a check: rd varies by only about ±15% across the trained box, the crests never move far in k, and a decomposition in k compresses just as well (seven components for 99.99% of the variance against thirteen in x). The reason to prefer x is the structural one above, not compactness. Against — held-out models the wiggle is reproduced to — of its own amplitude at worst, and against fresh CAMB runs the shipped page reproduces rd to four parts in a million and the wiggle to about one percent of its amplitude.
Everything here is linear theory. Above k ≈ 0.1 h/Mpc at z = 0 the real universe has gone nonlinear and the true spectrum rises well above these curves; the neutrino suppression deepens there too, by a few tenths of a percent more than linear theory gives, before turning back — the “spoon” feature. A survey analysis has to model that, along with galaxy bias and redshift-space distortions, none of which is on this page. The curves are drawn to k = 10 h/Mpc because the free-streaming step is only fully developed there, not because linear theory is valid there. The emulator assumes a flat universe with three degenerate massive neutrinos and the helium fraction set by big bang nucleosynthesis. Redshifts other than zero are exact nodes of the training set, not interpolations.
Further afield: the CMB power spectrum for the same six parameters seen in light rather than matter; from sky map to power spectrum for how either is measured; ΛCDM and the six parameters for what the model is; evolving dark energy for the extension that loosens the limit above.