ML-ZF算法源码程序 - matlab算法设计 - 谷速源码
下载频道> 资源分类> matlab源码> 算法设计> ML-ZF算法源码程序

标题:ML-ZF算法源码程序
分享到:

所属分类: 算法设计 资源类型: 文件大小: 11.44 KB 上传时间: 2016-01-27 19:31:29 下载次数: 56 资源积分:1分 提 供 者: 马云 ML-ZF算法源码程序
内容:
ML-ZF算法源码程序,程序员在编程的过程中可以参考学习使用,希望对IT程序员有用,此源码程序简单易懂、方便阅读,有很好的学习价值!
clear all;clc
N = 2;                  % Number of Transmit antennas
M = 2;                  % Number of Receive antennas
EbNoVec = 5:3:11;       % Eb/No in dB
modOrd = 2;             % constellation size = 2^modOrd
numSym = N;             % number of symbols
 
% Seed states for repeatability
rand('twister', 12345); randn('state', 98765);
 
% Get all bit combinations for ML receiver
bits = de2bi(0:2^(modOrd*N)-1, 'left-msb')';
% Split them per Transmit antenna
b = zeros(N, modOrd, length(bits));
for i = 1:length(bits)
    b(:, :, i) = reshape(bits(:,i), modOrd, N)';
end
 
% Preallocate variables for speed
dist = zeros(length(bits), 1);
[BER_ZF, BER_MMSE, BER_ML] = deal(zeros(1, length(EbNoVec)));
 
% Create QPSK mod-demod objects
hMod = modem.pskmod('M', 2^modOrd, 'SymbolOrder', 'gray', 'InputType', 'bit');
hDemod = modem.pskdemod(hMod);
 
% Set up a figure for visualizing BER results
h = gcf; grid on; hold on;
set(gca,'yscale','log','xlim',[EbNoVec(1)-0.01, EbNoVec(end)],'ylim',[1e-4 1]);
xlabel('Eb/No (dB)'); ylabel('BER'); set(h,'NumberTitle','off');
set(h, 'renderer', 'zbuffer'); set(h,'Name','Spatial Multiplexing');
title('2x2 Uncoded QPSK System');
 
% Loop over selected EbNo points
for idx = 1:length(EbNoVec)
    nErrs_zf = 0; nErrs_mmse = 0; nErrs_ml = 0;
    nBits = 0;
    while ( ((nErrs_zf < 100) || (nErrs_mmse < 100) || (nErrs_ml < 100)) ...
            && (nBits < 1e4))
        % Create array of bits to modulate
        msg = randint(modOrd, numSym, 2);
 
        % Modulate data
        source = modulate(hMod, msg);
 
        % Split source among N transmitters (symbol-wise)
        Tx = reshape(source, N, numel(source)/N); clear source;
 
        % Flat Rayleigh Fading  - independent links
        RayleighMat = (randn(M, N) +  sqrt(-1)*randn(M, N))/sqrt(2);
 
        % Calculate SNR from EbNo
        snr = EbNoVec(idx) + 10*log10(modOrd);
 
        % Add channel noise power to faded data
        r = awgn(RayleighMat*Tx, snr); clear Tx;
        r_store = r;
 
        % Assume perfect channel estimation
        H = RayleighMat;
 
        % Zero-Forcing SIC receiver
        E_zf = zeros(modOrd, numSym); k = zeros(N, 1);
        %   Initialization
        G = pinv(H);
        [val, k0] = min(sum(abs(G).^2,2));
        %   Start Zero-Forcing Nulling Loop
        for n = 1:N
            % Find best transmitter signal using minimum norm
            k(n) = k0;
 
            % Select Weight vector for best transmitter signal
            w = G(k(n),:);
 
            % Calculate output for transmitter n and demodulate bitstream
            y = w * r;
            E_zf(:, k(n):N:end) = reshape(demodulate(hDemod, y), modOrd, numSym/N);
 
            % Subtract effect of the transmitter n from received signal
            z = modulate(hMod, demodulate(hDemod, y));
            r = r - H(:, k(n))*z;
 
            % Adjust channel estimate matrix for next minimum norm search
            H(:, k(n)) = zeros(M, 1);
            G = pinv(H);
            for aa = 1:n
                G(k(aa), :) = inf;
            end
            [val, k0] = min(sum(abs(G).^2,2));
        end
 
        % Restore variables for next receiver
        H = RayleighMat; r = r_store;
 
        % MMSE SIC receiver
        E_mmse = zeros(modOrd, numSym); k = zeros(N, 1);
        %   Initialization
        G = inv(H'*H + N/(10^(0.1*snr))*eye(N)) * H';
        [val, k0] = min(sum(abs(G).^2,2));
        %   Start MMSE Nulling Loop
        for n = 1:N
            % Find best transmitter signal using Min Norm
            k(n) = k0;
 
            % Select Weight vector for best transmitter signal
            w = G(k(n),:);
 
            % Calculate output for transmitter n and demodulate bitstream
            y = w * r;
            E_mmse(:, k(n):N:end) = reshape(demodulate(hDemod, y), modOrd, numSym/N);
 
            % Subtract effect of the transmitter n from received signal
            z = modulate(hMod, demodulate(hDemod, y));
            r = r - H(:, k(n))*z;
 
            % Adjust channel estimate matrix for next min Norm search
            H(:, k(n)) = zeros(M, 1);
            G = inv(H'*H + N/(10^(0.1*snr))*eye(N)) * H';
            for aa = 1:n
                G(k(aa), :) = inf;
            end
            [val, k0] = min(sum(abs(G).^2,2));
        end
 
        % Restore variables for next receiver
        H = RayleighMat; r = r_store;
 
        % ML receiver
        for i = 1:2^(modOrd*N)
            % Signal constellation for each bit combination
            sig = modulate(hMod, b(:, :, i)').';
 
            % Distance metric for each constellation
            dist(i) = sum(abs(r - H*sig).^2);
        end
        % Get the minimum
        [notUsed, val] = min(dist);
        E_ml = b(:,:,val)'; % detected bits
 
        % Collect errors
        nErrs_zf = nErrs_zf + biterr(msg, E_zf);
        nErrs_mmse = nErrs_mmse + biterr(msg, E_mmse);
        nErrs_ml = nErrs_ml + biterr(msg, E_ml);
 
        nBits = nBits + length(msg(:));
    end
 
    % Calculate BER for current point
    BER_ZF(idx) = nErrs_zf./nBits;
    BER_MMSE(idx) = nErrs_mmse./nBits;
    BER_ML(idx) = nErrs_ml./nBits;
 
    % Plot results
    semilogy(EbNoVec(1:idx), BER_ZF(1:idx), 'r*', ...
             EbNoVec(1:idx), BER_MMSE(1:idx), 'bo', ...
             EbNoVec(1:idx), BER_ML(1:idx), 'gs');
    legend('ZF-SIC', 'MMSE-SIC', 'ML');
    drawnow;
end
 
% Draw the lines
semilogy(EbNoVec, BER_ZF, 'r-', EbNoVec, BER_MMSE, 'b-', ...
         EbNoVec, BER_ML, 'g-');
hold off;
 
openfig('spatMuxResults.fig');

文件列表(点击上边下载按钮,如果是垃圾文件请在下面评价差评或者投诉):

ML-ZF算法源码程序/
ML-ZF算法源码程序/MMSE_ZF.m
ML-ZF算法源码程序/spatMuxResults.png

关键词: 算法 源码 程序

Top_arrow
回到顶部
联系方式| 版权声明| 招聘信息| 广告服务| 银行汇款| 法律顾问| 兼职技术| 付款方式| 关于我们|
网站客服网站客服 程序员兼职招聘 程序员兼职招聘
沪ICP备19040327号-3
公安备案号:沪公网安备 31011802003874号
库纳格流体控制系统(上海)有限公司 版权所有
Copyright © 1999-2014, GUSUCODE.COM, All Rights Reserved