Field Guide · algorithm

Also known as: root-raised-cosine filter, RRC filter, square-root raised cosine, SRRC

A root-raised-cosine (RRC) filter is a pulse-shaping filter applied at both ends of a digital radio link — half the shaping at the transmitter, half at the receiver.1 Placed at only one end it does not, by itself, satisfy the zero-intersymbol-interference condition; but because the transmit RRC and the receive RRC multiply in the frequency domain, the two square-root halves combine into a full raised-cosine response that limits bandwidth while producing zero intersymbol interference (ISI) at the ideal sampling instants.2

peak at own symbol time, zero at every neighbouring symbol time → no ISI
A raised-cosine pulse peaks at its own sampling instant and crosses exactly zero at every other symbol time, so neighbouring symbols do not interfere.

How it works

The raised-cosine filter is a member of the Nyquist family: its impulse response is zero at every integer symbol period except the centre, so a stream of such pulses can be sampled at the symbol clock with no contribution from adjacent symbols. Splitting that response into two identical square-root (“root”) halves — one at the transmitter, one at the receiver — keeps the composite Nyquist property while giving the receive filter a second job (below).

The single design knob is the roll-off factor β (0 to 1). It sets the excess bandwidth: the occupied bandwidth is (1 + β) times the Nyquist minimum of half the symbol rate. A small β (say 0.2) is spectrally tight but the pulse tails ring long, so timing error is punishing and the peak-to-average power ratio climbs; a large β (0.35–0.5) is more forgiving of timing jitter but eats more spectrum. Practical systems pick β as a compromise — TETRA uses β ≈ 0.35, for instance.

Variants: RRC vs. raised-cosine, and the matched pair

The distinction that trips people up: the raised-cosine is the end-to-end channel response that has zero ISI, while the root-raised-cosine is what you actually load into each individual filter so that TX × RX = raised-cosine. Crucially, an RRC pulse on its own is not ISI-free — its zero crossings do not land on the symbol grid — which is why you must have the matching RRC at the far end. That pairing is not a coincidence: the receive RRC is precisely the matched filter for an RRC-shaped transmit pulse, so the same filter that completes the Nyquist shaping also maximises signal-to-noise ratio at the sampling instant. One filter, two payoffs — zero ISI and optimal SNR — which is exactly why the square root is split symmetrically across the link.

In practice

Correctly applying the receive RRC is a required step in demodulating any linearly-modulated digital signal that specifies it. Related C4FM/CQPSK systems such as P25 use a raised-cosine / shaped-Gaussian family rather than a pure RRC, whereas π/4-DQPSK systems like TETRA and NADC specify RRC shaping outright. A clean, wide-open eye diagram after the receive RRC is the visual confirmation that the matched pair is doing its job.

Relevance to SDR

Linear digital modes carried by SDR receivers rely on the receiver reconstructing the correct RRC to recover symbols cleanly. GopherTrunk applies the appropriate receive pulse-shaping / matched filter for the linear modes it decodes, sharpening symbol decisions before the slicer; the C4FM family it handles most often uses a shaped-Gaussian variant of the same Nyquist idea rather than a textbook RRC, but the goal — bandwidth-limited pulses that don’t smear into one another — is identical.

Sources

  1. Root-raised-cosine filter — Wikipedia, on split RRC pulse shaping and its role as the receive matched filter. 

  2. Raised-cosine filter — Wikipedia, on the Nyquist zero-ISI response, roll-off factor, and excess bandwidth. 

See also