Skip to content

Repository files navigation

OMP-mmWave-FPGA: mmWave MIMO Channel Estimation with FPGA Acceleration

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.

Overview

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.

Key Features

  • 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

Project Structure

├── 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

System Configuration

Default Parameters

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

Hardware Target

  • 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)
  • Clock: 100 MHz
  • Problem Size: 576 equations × 10 unknowns (solver matrix dimensions)

Workflow

1. Simulation (MATLAB_mmWaveMIMO_OMP_new.m)

  • 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

2. Channel Generation (mmWaveMIMO_ChannelGenerator.m)

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

3. RF/Baseband Matrices (RF_BB_matrices.m)

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

4. FPGA Export (fpga_export_vitis.m)

Prepares data for hardware:

  1. Quantizes sensing matrix (A) and measurement vector (y) to 18-bit fixed-point
  2. Generates vitis_data.h with quantized test vectors
  3. Outputs expected results for testbench validation
  4. Prints hardware-ready values for integration

5. Hardware Solver (pinv_solver.cpp / pinv_solver.h)

Computes pseudoinverse-based solution:

x = pinv(A) * y

Where:

  • 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.

Getting Started

Prerequisites

  • MATLAB (R2019b or later) with Signal Processing Toolbox
  • Xilinx Vitis HLS 2021.1+ (for FPGA synthesis)
  • Xilinx Vivado Design Suite (for deployment)

Running the Simulation

>> MATLAB_mmWaveMIMO_OMP_new.m

This script will:

  1. Simulate channel estimation across SNR range
  2. Compare OMP vs. Reduced Omnidirectional OMP (ROOM) performance
  3. Generate performance curves
  4. Export FPGA-ready test data

Deploying to FPGA

  1. Generate HLS project:

    vitis_hls -f hls_config.cfg
  2. Synthesize and package:

    • Open Vivado with HLS output
    • Create wrapper IP and integrate into design
    • Generate bitstream
  3. Validate on hardware:

    • Load bitstream to Zynq-7020
    • Execute pinv_solver_tb.cpp testbench to verify correctness

Algorithm Details

Orthogonal Matching Pursuit (OMP)

Iterative greedy algorithm for sparse recovery:

  1. Initialize: Residual = measurement vector
  2. 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
  3. Output: Sparse coefficient vector

Fixed-Point Representation

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)

Performance Metrics

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

References

  • 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

Configuration & Customization

Adjusting System Parameters

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 range

Modifying FPGA Precision

In 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 accumulator

Regenerate testbench and re-run HLS synthesis.

Troubleshooting

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

Contributing

To extend this project:

  1. Modify MATLAB algorithm in OMP_mmWave_Est.m
  2. Update channel model in mmWaveMIMO_ChannelGenerator.m
  3. Adjust FPGA precision in pinv_solver.h
  4. Re-run simulation and HLS synthesis
  5. Validate testbench results

Contact

For questions or contributions, please open an issue or contact the repository maintainer.


Last Updated: 2026
Status: Active Development

About

mmWave MIMO channel estimation with FPGA acceleration

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages