高维M-QAM调制与解调-MATLAB基带仿真

高维M-QAM调制与解调-MATLAB基带仿真

应几位小伙伴私信与评论的要求,博主把可实现的高维M-QAM误码率仿真代码呈上来啦,M-QAM的维度M满足是2的正整数次幂即可。用的方法是二维矩阵表示星座图,二进制转十进制表示映射关系,下面的程序是256QAM的示例。

说实话,博主真的不清楚高维的QAM有什么用,只在书本上见过64QAM,应用上博主只用到过16QAM。有小伙伴要256QAM甚至4096QAM我也是很惊讶=_=。

16QAM的基本原理请移步:
16QAM调制与解调-MATLAB基带仿真

MATLAB基带仿真程序

clc
clear
close all
% Title:  高维M-QAM调制与解调 %
% Data:   2020.05.06 %
% Author: K.X.Song % 

% 注:1.解调方法为传统MAP,256QAM由于星座点多,解调复杂度高。若要改进,可以考虑其他低复杂度译码算法。
% 注:2.仿真次数在第12行中修改,k*是因为保证数据能被log2(M)整除,否则在二进制转换会报错。若要统计到10E-5的误码率,大约需要100w个符号,现在仿的是1w的。
M = 256;                                % 调制阶数
k = log2(M);
L_data = k*10000;                       % 数据长度
L_symbol = L_data/log2(M);              % 符号长度
data = round(rand(1,L_data));           % 原始数据
EbN0_dB = 0:30;                         % Eb/N0 dB形式
EbN0 = 10.^(EbN0_dB/10);                % Eb/N0
EsN0 = k * EbN0;                        % Es/N0
error = zeros(1,length(EbN0_dB));       % 预置错误符号个数
ser = zeros(1,length(EbN0_dB));         % 预置仿真误符号率
tser_BPSK = zeros(1,length(EbN0_dB));   % 预置BPSK理论误符号率
tser_QPSK = zeros(1,length(EbN0_dB));   % 预置QPSK理论误符号率
tser_16QAM = zeros(1,length(EbN0_dB));  % 预置16QAM理论误符号率
% QAM调制
send = zeros(1,L_symbol);               % 预设发送信号
send_set_1 = -15:2:15;	% 这里的范围视QAM维度M而定
send_set_2 = -15:2:15;
send_set = zeros(16,16);
for w1 = 1:length(send_set_1)
    for w2 = 1:length(send_set_1)
        send_set(w1,w2) = send_set_1(w1) + 1j * send_set_2(w2);     % 256QAM星座点
    end
end
Es_avg = sum(sum(abs(send_set).^2)) / M;      % 平均能量,用了两个sum是因为二维矩阵
N0 = Es_avg ./ EsN0;
% 调制进程
mod = zeros(1,L_symbol);
for q = 1:L_symbol
    mod(q) = bin2dec(num2str(data(k*q-k+1:k*q))) + 1;         % +1是因为二进制范围是从0到255
    send(q) = send_set(mod(q));
end
for q = 1:length(EbN0_dB)
    noise = sqrt(N0(q)/2)*randn(1,L_symbol) + 1j*sqrt(N0(q)/2)*randn(1,L_symbol);   % AWGN
    receive = send + noise;             % 接收信号
    demod = zeros(1,L_symbol);          % 预置检测信号
    distance = zeros(1,M);              % 解调:距离检测 
    for t = 1:L_symbol
        for w = 1:M
            distance(w) = norm(receive(t) - send_set(w))^2;     % 接收信号到所有星座点的距离
        end
        demod(t) = find(distance == min(distance));      % 最小距离星座点的位置
        if (demod(t) ~= mod(t)) 
            error(q) = error(q) + 1;                % 统计错误符号数
        end
    end
    ser(q) = error(q) / L_symbol;                     % 16QAM仿真误符号率
    tser_BPSK(q) = qfunc(sqrt(2*EbN0(q)));          % BPSK理论误比特率
    tser_16QAM(q) = 3*qfunc(sqrt(4/5*EbN0(q)))*(1-3/4*qfunc(sqrt(4/5*EbN0(q))));        % 16QAM理论误符号率
end
figure
semilogy(EbN0_dB,ser,'o',EbN0_dB,tser_BPSK,'k',EbN0_dB,tser_QPSK,'r',EbN0_dB,tser_16QAM,'b');     % 画图
grid on;                                        % 坐标轴开启
axis([0 30 10^-5 10^-1])                        % 限制作图范围
xlabel('Eb/N0 (dB)');                           % 横坐标
ylabel('SER');                                  % 纵坐标
legend('256QAM仿真误符号率','BPSK理论误符号率','16QAM理论误符号率');   % 图例

你可能感兴趣的:(高维M-QAM调制与解调-MATLAB基带仿真)