A comprehensive implementation of Orthogonal Matching Pursuit (OMP) based channel estimation for mmWave MIMO systems, optimized for FPGA acceleration using Xilinx Vitis HLS on Zynq-7020.
This project combines MATLAB signal processing with hardware-accelerated FPGA implementation to perform efficient channel estimation in millimeter-wave (mmWave) MIMO communication systems. The system uses compressed sensing techniques with the OMP algorithm to recover sparse channel representations.
- MATLAB Simulation: Full mmWave MIMO channel modeling and OMP algorithm implementation
- FPGA Hardware Accelerator: Optimized pseudoinverse solver for channel estimation
- Fixed-Point Arithmetic: Efficient 18-bit fixed-point quantization for FPGA implementation
- RF/Baseband Architecture: Hybrid analog-digital precoding and combining
- Performance Evaluation: SNR-based performance analysis with plotting capabilities
├── MATLAB_mmWaveMIMO_OMP_new.m # Main simulation and FPGA export orchestration
├── OMP_mmWave_Est.m # OMP algorithm implementation for channel estimation
├── mmWaveMIMO_ChannelGenerator.m # mmWave MIMO channel generation with sparse representation
├── RF_BB_matrices.m # RF and baseband precoding/combining matrix generation
├── fpga_export_vitis.m # FPGA data export and testbench generation
├── pinv_solver.h # HLS hardware solver header file
├── pinv_solver.cpp # HLS pseudoinverse solver implementation
├── pinv_solver_tb.cpp # Hardware testbench for solver verification
├── random_unitary.m # Utility for generating random unitary matrices
├── hls_config.cfg # Vitis HLS configuration for synthesis
└── README.md # This file
| Parameter | Value | Description |
|---|---|---|
| Transmit Antennas (t) | 32 | Number of transmitter array elements |
| Receive Antennas (r) | 32 | Number of receiver array elements |
| RF Chains | 8 | Number of analog RF chains (both TX/RX) |
| Number of Beams | 24 | Beam codebook size for RF matrices |
| Grid Size (G) | 32 | Spatial grid resolution for angle estimation |
| Iterations | 100 | Number of Monte Carlo simulation runs |
| Sparsity Level (L) | 10 | Number of significant multipath components |
| OMP Threshold | 5 | Stopping threshold for OMP iterations |
| SNR Range | 5–50 dB | Signal-to-noise ratio evaluation range |
- FPGA: Xilinx Zynq-7020
- Tool: Vivado HLS (Vitis) 2021.1+
- Precision:
- Input (A, y):
ap_fixed<18,2>(18-bit, 2 integer bits, 16 fractional bits) - Accumulator:
ap_fixed<48,12>(48-bit, 12 integer bits, 36 fractional bits)
- Input (A, y):
- Clock: 100 MHz
- Problem Size: 576 equations × 10 unknowns (solver matrix dimensions)
- Initializes random channel with sparse multipath components
- Generates RF/baseband precoding and combining matrices
- Creates received signal with controlled SNR levels
- Runs software OMP algorithm for performance baseline
- Exports fixed-point test vectors to
vitis_data.h
Generates sparse mmWave channel with:
- Spatial signatures: Uniform linear arrays (ULA) with angle-based steering vectors
- Path gains: Random complex channel coefficients
- Spatial grid: Discretized angle-of-arrival/departure representation
- Output: Sparse channel matrix factorization for OMP sensing
Constructs hybrid precoding architecture:
- Analog (RF) Stage: Phase-only beam steering matrices
- Digital (Baseband) Stage: Beam selection and combining weights
- Enables efficient beam training through reduced-complexity codebook
Prepares data for hardware:
- Quantizes sensing matrix (A) and measurement vector (y) to 18-bit fixed-point
- Generates
vitis_data.hwith quantized test vectors - Outputs expected results for testbench validation
- Prints hardware-ready values for integration
Computes pseudoinverse-based solution:
x = pinv(A) * yWhere:
- A: 576×10 sensing matrix (complex, fixed-point)
- y: 576×1 measurement vector (complex, fixed-point)
- x: 10×1 solution vector (channel coefficients)
Uses Householder QR decomposition or Gram-Schmidt orthogonalization optimized for synthesis.
- MATLAB (R2019b or later) with Signal Processing Toolbox
- Xilinx Vitis HLS 2021.1+ (for FPGA synthesis)
- Xilinx Vivado Design Suite (for deployment)
>> MATLAB_mmWaveMIMO_OMP_new.mThis script will:
- Simulate channel estimation across SNR range
- Compare OMP vs. Reduced Omnidirectional OMP (ROOM) performance
- Generate performance curves
- Export FPGA-ready test data
-
Generate HLS project:
vitis_hls -f hls_config.cfg
-
Synthesize and package:
- Open Vivado with HLS output
- Create wrapper IP and integrate into design
- Generate bitstream
-
Validate on hardware:
- Load bitstream to Zynq-7020
- Execute
pinv_solver_tb.cpptestbench to verify correctness
Iterative greedy algorithm for sparse recovery:
- Initialize: Residual = measurement vector
- Iterate:
- Find atom (column of A) with highest correlation to residual
- Add atom to support set
- Update residual using least-squares
- Stop when residual energy below threshold or max iterations reached
- Output: Sparse coefficient vector
ap_fixed<18,2>:
Range: [-2, 2)
Resolution: 2^-16 ≈ 1.5e-5
Fits: One DSP48 multiplier on Zynq-7020
ap_fixed<48,12> (accumulator):
Range: [-2^11, 2^11)
Resolution: 2^-36
Supports: Sum of 576 products (18-bit × 18-bit)
The simulation evaluates:
- Mean Squared Error (MSE): Channel estimation accuracy across SNR
- Convergence Rate: Number of OMP iterations required
- Computational Complexity: FLOPs and memory bandwidth
- Hardware Resource Utilization: FPGA slice and DSP usage
- OMP Algorithm: Y. C. Eldar and G. Kutyniok, Compressed Sensing, Cambridge University Press
- mmWave MIMO: A. Alkhateeb et al., "Channel Estimation and Hybrid Precoding for Millimeter Wave Cellular Systems," IEEE JSAC, 2014
- Fixed-Point HLS: Xilinx Vitis HLS User Guide
Edit MATLAB_mmWaveMIMO_OMP_new.m (lines 8–17):
t = 32; % Transmit antennas
r = 32; % Receive antennas
numRF = 8; % RF chains
N_Beam = 24; % Beam count
G = 32; % Grid size
ITER = 100; % Simulation iterations
L = 10; % Sparsity
omp_thrld = 5; % OMP threshold
SNRdB = 5:5:50; % SNR rangeIn pinv_solver.h:
// Change precision (wider = more accurate, fewer iterations)
typedef ap_fixed<20, 3> din_t; // Increased to 20 bits
typedef ap_fixed<56, 16> solver_t; // Wider accumulatorRegenerate testbench and re-run HLS synthesis.
| Issue | Solution |
|---|---|
| Mismatched fixed-point results | Verify quantization in fpga_export_vitis.m matches pinv_solver.h |
| HLS synthesis failures | Check DSP resource availability; reduce matrix size if needed |
| Low SNR performance | Increase sparsity level or OMP threshold |
| MATLAB export errors | Ensure vitis_data.h directory is writable |
To extend this project:
- Modify MATLAB algorithm in
OMP_mmWave_Est.m - Update channel model in
mmWaveMIMO_ChannelGenerator.m - Adjust FPGA precision in
pinv_solver.h - Re-run simulation and HLS synthesis
- Validate testbench results
For questions or contributions, please open an issue or contact the repository maintainer.
Last Updated: 2026
Status: Active Development