Skip to main content

MVDR in MATLAB (Minimum Variance Distortionless Response)

 

MATLAB Code

clc; clear; close all;
%% Step 1: Define Parameters
M = 8; % Number of array sensors
d = 0.5; % Sensor spacing (lambda/2)
K = 2; % Number of sources
N = 200; % Number of snapshots
theta = [-20 30]; % True signal angles (degrees)
SNR = 10; % Signal-to-noise ratio (dB)
fprintf('Step 1: Parameters Initialized\n');
%% Step 2: Generate Source Signals
t = 1:N;
s1 = exp(1j*2*pi*0.05*t); % Source 1
s2 = exp(1j*2*pi*0.1*t); % Source 2
S = [s1; s2];
figure;
plot(real(S(1,:))); title('Signal 1 (Real Part)'); xlabel('Samples'); ylabel('Amplitude');
figure;
plot(real(S(2,:))); title('Signal 2 (Real Part)'); xlabel('Samples'); ylabel('Amplitude');
fprintf('Step 2: Source Signals Generated\n');
%% Step 3: Construct Steering Matrix
A = zeros(M,K);
for k = 1:K
A(:,k) = exp(-1j*2*pi*d*(0:M-1)'*sin(theta(k)*pi/180));
end
fprintf('Step 3: Steering Matrix Created\n');
%% Step 4: Generate Received Signals with Noise
X = A*S;
noise = (randn(M,N) + 1j*randn(M,N))/sqrt(2);
noise = noise * 10^(-SNR/20);
X = X + noise;
figure;
plot(real(X(1,:))); title('Received Signal at Sensor 1'); xlabel('Samples'); ylabel('Amplitude');
fprintf('Step 4: Received Signals with Noise Generated\n');
%% Step 5: Estimate Covariance Matrix
R = (X*X')/N;
figure;
imagesc(abs(R)); colorbar; title('Covariance Matrix Magnitude'); xlabel('Sensors'); ylabel('Sensors');
fprintf('Step 5: Covariance Matrix Computed\n');
%% Step 6: Eigenvalue Decomposition
[Evec, Eval] = eig(R);
eigenvalues = diag(Eval);
figure;
stem(sort(eigenvalues,'descend')); title('Eigenvalues of Covariance Matrix'); xlabel('Index'); ylabel('Eigenvalue');
fprintf('Step 6: Eigen Decomposition Done\n');
%% Step 7: Sort Eigenvalues and Eigenvectors
[eigenvalues_sorted, idx] = sort(eigenvalues,'descend');
Evec_sorted = Evec(:,idx);
fprintf('Step 7: Eigenvalues Sorted\n');
%% Step 8: Separate Signal and Noise Subspace
Es = Evec_sorted(:,1:K); % Signal subspace
En = Evec_sorted(:,K+1:end); % Noise subspace
fprintf('Step 8: Signal and Noise Subspaces Separated\n');
%% Step 9: MUSIC Spectrum Calculation
angles = -90:0.1:90;
Pmusic = zeros(size(angles));
for i = 1:length(angles)
steering = exp(-1j*2*pi*d*(0:M-1)'*sin(angles(i)*pi/180));
Pmusic(i) = 1/(steering'*(En*En')*steering); % MUSIC denominator
end
Pmusic = abs(Pmusic);
Pmusic = 10*log10(Pmusic/max(Pmusic));
figure;
plot(angles,Pmusic,'LineWidth',2); grid on;
xlabel('Angle (degrees)'); ylabel('Spectrum (dB)'); title('MUSIC Spatial Spectrum');
fprintf('Step 9: MUSIC Spectrum Computed\n');
%% Step 10: MVDR Beamforming to Reconstruct Sources
S_beamformed = zeros(K,N); % Preallocate
for k = 1:K
a_k = A(:,k); % Steering vector for k-th source
% MVDR weights
w_mvdr = (R\ a_k) / (a_k' * (R\ a_k));
% Apply beamforming
S_beamformed(k,:) = w_mvdr' * X;
end
% Plot MVDR beamformed signals
figure;
for k=1:K
subplot(K,1,k);
plot(real(S_beamformed(k,:)));
title(['MVDR Beamformed Signal ', num2str(k)]);
xlabel('Sample'); ylabel('Amplitude');
end
fprintf('Step 10: MVDR Beamforming Completed\n');

Output

 

 

 

 

 

 

 

 


Workflow of the Multi-Antenna Signal Processing and MUSIC/MVDR Code

This section describes the step-by-step workflow of the MATLAB code that simulates multiple sources, separates them using subspace methods, and reconstructs signals via MVDR beamforming.

  1. Step 1: Parameter Initialization

    Define key parameters including:

    • Number of array sensors (M)
    • Sensor spacing (d)
    • Number of sources (K)
    • Number of snapshots (N)
    • True source angles (theta)
    • Signal-to-noise ratio (SNR)

    These parameters form the foundation for the simulation.

  2. Step 2: Generate Source Signals

    Create narrowband complex exponential signals representing the sources:

    s1 = exp(1j*2*pi*0.05*t);
    s2 = exp(1j*2*pi*0.1*t);

    These signals form the source matrix S.

  3. Step 3: Construct Steering Matrix

    Compute the steering vectors for each source direction and form the matrix A. Each column represents the array’s response to a source angle.

  4. Step 4: Generate Received Signals

    The array receives a combination of source signals and additive noise:

    X = A*S + noise;

    This models the real-world scenario of multiple antennas capturing overlapping signals with noise.

  5. Step 5: Covariance Matrix Estimation

    Compute the sample covariance matrix of the received signals:

    R = (X*X')/N;

    This matrix captures correlations between sensors and is essential for subspace separation.

  6. Step 6: Eigenvalue Decomposition

    Decompose the covariance matrix into eigenvalues and eigenvectors:

    [Evec, Eval] = eig(R);

    Eigenvalues indicate the power in each subspace, separating signal and noise components.

  7. Step 7: Sort Eigenvalues and Eigenvectors

    Sort eigenvalues in descending order to identify the signal subspace (largest eigenvalues) and noise subspace (smallest eigenvalues).

  8. Step 8: Subspace Separation

    Define:

    • Signal subspace: Es = Evec_sorted(:,1:K)
    • Noise subspace: En = Evec_sorted(:,K+1:end)

    Noise and signal subspaces are orthogonal, which is the foundation for MUSIC.

  9. Step 9: MUSIC Spectrum Calculation

    Scan angles using steering vectors and compute the pseudo-spectrum:

    Pmusic(i) = 1/(steering'*(En*En')*steering);

    Peaks in the spectrum indicate the directions of arrival (DOAs) of the sources.

  10. Step 10: MVDR Beamforming

    For each source, apply MVDR weights to reconstruct the signal while minimizing noise:

    w_mvdr = (R\ a_k) / (a_k' * (R\ a_k));
    S_beamformed(k,:) = w_mvdr' * X;

    This produces clean estimates of each source signal from the mixed array observations.

Summary: The workflow models a practical multi-antenna system: simulate sources, capture them with an array, compute correlations, separate signal/noise subspaces, find DOAs (MUSIC), and reconstruct signals (MVDR beamforming). This closely mimics real-world array signal processing in radar, wireless communications, and MIMO systems.


Try Interactive Online Simulators


Further Reading



Contact Us

Name

Email *

Message *

Popular Posts

OFDM Symbols and Subcarriers Explained

This article explains how OFDM (Orthogonal Frequency Division Multiplexing) symbols and subcarriers work. It covers modulation, mapping symbols to subcarriers, subcarrier frequency spacing, IFFT synthesis, cyclic prefix, and transmission. Step 1: Modulation First, modulate the input bitstream. For example, with 16-QAM , each group of 4 bits maps to one QAM symbol. Suppose we generate a sequence of QAM symbols: s0, s1, s2, s3, s4, s5, …, s63 Step 2: Mapping Symbols to Subcarriers Assume N sub = 8 subcarriers. Each OFDM symbol in the frequency domain contains 8 QAM symbols (one per subcarrier): Mapping (example) OFDM symbol 1 → s0, s1, s2, s3, s4, s5, s6, s7 OFDM symbol 2 → s8, s9, s10, s11, s12, s13, s14, s15 … OFDM sym...

Design of CMOS XOR/XNOR Gates

Design of CMOS XOR/XNOR Gates The semiconductor industry has experienced rapid integration of multimedia applications into mobile electronics, leading to very high integration density in CMOS VLSI. As operating frequencies increase, power consumption, speed, silicon area, and reliability become critical considerations. The XOR-XNOR circuits are fundamental building blocks in arithmetic circuits (Full Adders, Multipliers), compressors, comparators, parity checkers, code converters, error-detecting/correcting codes, and phase detectors. Their performance directly impacts the complex circuits they are used in. Design goals include full output voltage swing, low power consumption, reduced transistor count, minimal delay, and simultaneous non-skewed outputs. Static Logic (Static CMOS) Stat...

UGC NET Electronic Science Previous Year Question Papers with Solutions

Home / Engineering & Other Exams / UGC NET 2026 PYQ ⬇️ Download Papers and Solutions 📋 Exam Pattern 💡 Preparation Tips ❓ FAQs 📊 Exam Highlights: Electronic Science (88) Feature Details Junior Research Fellowship (JRF) ₹37,000 + HRA per month Eligibility M.Sc/M.Tech in Electronics (55%) Validity of Certificate JRF (3 Years) | Lectureship (Lifetime) 📥 Download UGC NET Electronics PDFs Complete collection of previous year question papers, answer keys and explanations for Subject Code 88. Start Downloading 📂 View All Question Papers June 2025 - Question Paper Download PDF June 2025 - Solved Paper + Explanation ...

DFTs-OFDM vs OFDM: Why DFT-Spread OFDM Reduces PAPR Effectively (with MATLAB Code)

Understanding PAPR in DFT-spread OFDM vs. Standard OFDM In modern wireless communications like 4G LTE and 5G NR, managing the Peak-to-Average Power Ratio (PAPR) is critical for hardware efficiency. While OFDM is the gold standard for high-speed data, its high PAPR poses significant challenges for mobile devices. This is where DFTs-OFDM (also known as SC-FDMA) comes in. DFT-spread OFDM (DFTs-OFDM) has lower Peak-to-Average Power Ratio (PAPR) because it "spreads" the data in the frequency domain before applying IFFT, making the time-domain signal behave more like a single-carrier signal rather than a multi-carrier one like OFDM. Deeper Explanation: Aspect OFDM DFTs-OFDM Signal Type Multi-carrier Single-carrier-like Process IFFT of QAM directly QAM → DFT → IFFT PAPR Level High (due to many...

Online Simulator for ASK, FSK, and PSK Signal Generation

Interactive Digital Signal Processing (DSP) Tutorial and Simulator for ASK, FSK, and BPSK modulation techniques. Try our new Digital Signal Processing Simulator!   •   Interactive ASK, FSK, and BPSK tools updated for 2025. Start Now Digital Modulation Visualizer: ASK, FSK, & BPSK Simulator Learn and visualize binary modulation techniques (ASK, FSK, BPSK) in real-time with adjustable carrier and sampling parameters. Perfect for DSP students and engineers. 📡 ASK Simulator 📶 FSK Simulator 🎚️ BPSK Simulator 📚 More Topics ASK Modulator FSK Modulator BPSK Modulator More Topics 1. ASK (Amplitude Shift Keying) Simulat...

Calculation of SNR from FFT bins in MATLAB

📘 Overview 💻 FFT Bin Method 💻 Kaiser Window 📚 Further Reading SNR Estimation Overview In digital signal processing, estimating the Signal-to-Noise Ratio (SNR) accurately is crucial. Below, we demonstrate how to calculate SNR from periodogram and FFT bins using the Kaiser Window . The beta (β) parameter is the key—it allows you to control the trade-off between main-lobe width and side-lobe levels for precise spectral analysis. 1 Define Sampling rate and Time vector 2 Compute FFT and Periodogram PSD 3 Identify Signal Bin and Frequency resolution 4 Segment Signal Power from Noise floor 5 Logarithmic calculation of SNR in dB Method 1: Estimation from FFT Bins This approach uses a Hamming window to estimate SNR directly from the spectral bins. MATLAB Source Code Copy Code clc...

OFDM Baseband and Passband

  MATLAB Code >> %% OFDM BPSK Full Simulation: All Plots clear all ; close all ; clc; % --- 0. Parameters (Matching your HTML UI) --- nSymbols = 2; % Number of OFDM Symbols N = 4; % Subcarriers nCP = 2; % Cyclic Prefix fs = 1000; % Sampling Frequency (Hz) fc = 5; % Carrier Frequency (Hz) baudRate = 1; % Baud Rate %% --- 1. Generate Message (Bitstream) --- totalBits = nSymbols * N; bits = randi([0 1], 1, totalBits); %% --- 2. Make OFDM Symbols (Serial to Parallel) --- % Each column is one OFDM Symbol bitMatrix = reshape(bits, N, nSymbols); %% --- 3. Apply BPSK Mapping --- % 0 -> -1, 1 -> 1 bpskSymbols = 2*bitMatrix - 1; %% --- 4. Perform IFFT (Baseband Time Domain) --- ofdmTimeDomain = ifft(bpskSymbols, N); %% --- 5. Add Cyclic Prefix --- cpPart = ofdmTimeDomain(end-nCP+1:end, :); ofdmWithCP = [cpPart; ofdmTimeDomain]; serialBaseband = ofdmWithCP(:); % Flatten for transmission %% --- 6. Generat...