Array signal processing

Direction of arrival, on a board with no room to spare.

A row of antennas hears a signal. The system has to say which direction it came from before the next frame arrives, on a small board, with an answer that is the same every time so it can be signed off once. The step that decides all of that is an eigenproblem. VVE is built for that step.

In the field this is MUSIC and ESPRIT: the array covariance matrix is decomposed, signal is split from noise, and the spectrum is scanned, all inside one frame.

Wilkinson, N=16,383

89.6×


vs single-threaded reference netlib LAPACK dsyev (the default dense path) — wilkinson, N = 16,383

Wilkinson, N = 45,056

5.16×


vs LAPACK's own expert O(N²) routine, single-threaded dstemr (MRRR)

libvve.so

1.4MB


libvve.so, zero external dependencies

x86Intel · AMDArmArmsame answer, bit for bit
The same bits on the Intel/AMD workstation and on the Arm board it ships to.

In four pictures

What a direction finder does.

  1. A signal arrives.

    angleantenna arraysignal
    A row of antennas, or microphones, all hear the same signal.
  2. Each one hears it a moment apart.

    a moment later
    The signal reaches the far end of the row a fraction later than the near end.
  3. The math turns those moments into one direction.

    the answerleftdirectionright
    An eigensolver takes a table of all those differences apart. Out comes a sharp peak at the direction the signal came from.
  4. Every frame, on a small board, the same answer.

    a small boardthe same answer, every frame
    Ready before the next frame, on a board with no room to spare, the same on every board so it is signed off once.

In plain terms

Why a radar cares about an eigensolver.

A direction finder has one expensive step. What the problem is, why that step is the one that hurts, and why the answer has to be the same on every board.

Direction of arrivalWhat is the problem?
angleantenna arraysignal
Each element hears the same signal a moment apart. The angle is the answer the system exists to produce.

An array of antennas or microphones hears the same signal at slightly different moments at each element. From those differences, software works out where the signal came from. The standard methods, MUSIC and ESPRIT, start by building a matrix of how every element's signal relates to every other, and then take that matrix apart with an eigensolver to separate the signals from the noise.

Latency budgetWhy is the eigensolver the hard part?

Every other stage in the chain is cheap and predictable. The eigendecomposition is the stage that sets how long a frame takes, how much memory the board needs, and how much of the system has to be re-examined when anything changes. It has to finish inside the frame, on a board with no room for a large tuned math library.

QualifiedWhy does determinism matter here?
x86Intel · AMDArmArmsame answer, bit for bit
The same answer on the workstation it was developed on and on the board it ships to.

A sensing product is tested and signed off, then shipped on many boards for years. If the answer shifts with the chip, every new board reopens that work. VVE EigenCore returns the same bits on x86 and Arm from the same source, so the evidence gathered on one does not have to be re-argued on the next.

The signal chain

Where the eigensolver sits.

Five steps from listening to a direction. Four of them are cheap and predictable. The third grows with the array, pulls in a math library, and produces the number that has to be identical next year on next year's board.

  1. 1

    Listen

    The antennas record a short burst of what they hear.

    array snapshots

  2. 2

    Compare

    A table of how each element's recording relates to every other.

    covariance matrix R

  3. 3the step that sets the clock

    Take it apart

    The eigensolver finds the directions hidden in that table. This is the one expensive step.

    eigendecomposition of R

  4. 4

    Keep the signal

    A few strong components are the signal. The rest is noise and is set aside.

    signal / noise subspace split

  5. 5

    Read the direction

    Every direction is tried. The one that fits stands out as a sharp peak.

    MUSIC / ESPRIT spectrum

Four requirements. Four advantages.

Array signal-processing requirements and the corresponding VVE advantage.
The workload requiresVVE answers with
A frame-rate latency budget.VVE SmartRoute, structure-aware O(N²) routing — 89.6× vs single-threaded reference netlib dsyev at N = 16,383, and up to 5.16× vs single-threaded LAPACK dstemr on clustered spectra; both comparisons are single-threaded on both sides.
A board with no room for a tuned BLAS.1.4 MB, zero external dependencies. Runtime dependencies are libc, libm and libpthread. Intel/AMD and Arm from the same source.
Evidence that survives qualification.The same bits across machine, chip family, compiler and chip generation — 96 fingerprint records across 12 groups, zero mismatches, 541 / 541 across chip generations.
Correlated sources.Clustered spectra are where VVE's margin is largest and where it holds at every size measured — the wilkinson and schrödinger families in the campaign.

Why correlated sources favour this solver.

Subspace methods need a clean split between the signal eigenvalues and the noise floor. Correlated and coherent arrivals collapse that separation — the signal eigenvalues bunch, and the classical response is to spend more work resolving them. MRRR resolves a cluster by refining its representation tree, and that refinement is exactly where its cost goes up. VVE's routing does not pay that penalty, which is why the two clustered families in the campaign are the two where it wins at every size measured.

Well separated and clustered eigenvalue laddersTwo eigenvalue ladders on the same axis. The left is evenly spaced. The right has several near-coincident values, the pattern correlated arrivals produce.well separatedclustered — correlated sources
Two eigenvalue ladders on the same axis. The left is evenly spaced. The right has several near-coincident values, the pattern correlated arrivals produce.

Scoped to this workload.

Wilkinson, N=16,383

89.6×


vs single-threaded reference netlib LAPACK dsyev (the default dense path) — wilkinson, N = 16,383, full decomposition

Full decomposition, N=45,056, Wilkinson spectrum

5.16×


vs LAPACK's own expert O(N²) routine, single-threaded dstemr (MRRR) — wilkinson, N = 45,056, accuracy gated on both sides

Wilkinson, N=45,056, wall clock

171.1s


dstemr vs VVE, wilkinson, N = 45,056, both single-threaded

96 / 96


SHA-256 records identical across Intel/AMD and Arm chips, GCC and Clang

The full measured record →

Two ways in.

Drop in

your programthe old libraryVVE EigenCorethe same call
You switch VVE on when the program starts. The calls it already makes are answered by VVE EigenCore, and nothing in the code changes.

This is the speed path. How the drop-in works.

Pass the band

One small code change, and the dense matrix never exists: your program hands VVE the band instead of the whole thing. This is the memory path, and it is what makes large arrays fit in a board's memory budget rather than a server's.

Send us your array geometry.

Array size, snapshot count, source correlation, target board and instruction set. We will run your case on the harness and send the numbers back with the build, so the first result you see comes from your problem rather than ours.