300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 基于Matlab----16QAM调制与解调

基于Matlab----16QAM调制与解调

时间:2020-06-08 23:54:31

相关推荐

基于Matlab----16QAM调制与解调

基于Matlab----16QAM调制与解调

一、题目二、仿真要求三、主要代码3.1、16QAM调制3.2、16QAM解调3.3、全部代码四、仿真结果

一、题目

16QAM调制解调

二、仿真要求

用基带等效的方式仿真16-QAM在AWGN信道下的误码率和误比特率性能,并与理论值相比较。

三、主要代码

3.1、16QAM调制

16QAM调制代码:

% 16QAM调制send = zeros(1,L_symbol);% 预设发送信号send_set = [-3+3j,-1+3j,1+3j,3+3j,...-3+1j,-1+1j,1+1j,3+1j,...-3-1j,-1-1j,1-1j,3-1j,...-3-3j,-1-3j,1-3j,3-3j];% 发射端星座点Es_avg = sum(abs(send_set).^2) / length(send_set);N0 = Es_avg ./ EsN0;for q = 1:L_symbolif (data(4*q-3:4*q) == [1,0,1,1])send(q) = send_set(1);% 1001 => -3+3jelseif (data(4*q-3:4*q) == [1,0,0,1])send(q) = send_set(2);% 1001 => -1+3jelseif (data(4*q-3:4*q) == [1,1,1,0])send(q) = send_set(3);% 1110 => +1+3jelseif (data(4*q-3:4*q) == [1,1,1,1])send(q) = send_set(4);% 1111 => +3+3jelseif (data(4*q-3:4*q) == [1,0,1,0])send(q) = send_set(5);% 1010 => -3+1jelseif (data(4*q-3:4*q) == [1,0,0,0])send(q) = send_set(6);% 1000 => -1+1jelseif (data(4*q-3:4*q) == [1,1,0,0])send(q) = send_set(7);% 1100 => +1+1jelseif (data(4*q-3:4*q) == [1,1,0,1])send(q) = send_set(8);% 1101 => +3+1jelseif (data(4*q-3:4*q) == [0,0,0,1])send(q) = send_set(9);% 0001 => -3-1jelseif (data(4*q-3:4*q) == [0,0,0,0])send(q) = send_set(10); % 0000 => -1-1jelseif (data(4*q-3:4*q) == [0,1,0,0])send(q) = send_set(11); % 0100 => +1-1jelseif (data(4*q-3:4*q) == [0,1,1,0])send(q) = send_set(12); % 0110 => +3-1jelseif (data(4*q-3:4*q) == [0,0,1,1])send(q) = send_set(13); % 0011 => -3-3jelseif (data(4*q-3:4*q) == [0,0,1,0])send(q) = send_set(14); % 0010 => -1-3jelseif (data(4*q-3:4*q) == [0,1,0,1])send(q) = send_set(15); % 0101 => +1-3jelsesend(q) = send_set(16); % 0111 => +3-3jendend

3.2、16QAM解调

16QAM解调代码:

%16AQM解调for q = 1:length(EbN0_dB)noise = sqrt(N0(q)/2)*randn(1,L_symbol) + 1j*sqrt(N0(q)/2)*randn(1,L_symbol); % AWGNreceive = (send + noise); % 接收信号detect = zeros(1,L_symbol); % 预置检测信号distance = zeros(1,M); % 解调:距离检测 for t = 1:L_symbolfor w = 1:Mdistance(w) = norm(receive(t) - send_set(w))^2;% 接收信号到所有星座点的距离endpos = find(distance == min(distance));% 最小距离星座点的位置detect(t) = send_set(pos); % 解调后的符号if (detect(t) ~= send(t)) error(q) = error(q) + 1;% 统计错误符号数endendser(q) = error(q)/L_symbol; % 16QAM仿真误符号率tser_16QAM(q) = 3*qfunc(sqrt(4/5*EbN0(q)))*(1-3/4*qfunc(sqrt(4/5*EbN0(q)))); % 16QAM理论误符号率end

3.3、全部代码

全部代码:

clcclearclose all% Title: 16QAM调制与解调 %M = 16; % 调制阶数L_data = 1000000; % 数据长度L_symbol = L_data/log2(M); % 符号长度data = round(rand(1,L_data)); % 原始数据EbN0_dB = 0:14;% Eb/N0 dB形式EbN0 = 10.^(EbN0_dB/10);% 每比特能量/噪声EsN0 = log2(M) * EbN0; % 每符号能量/噪声error = zeros(1,length(EbN0_dB)); % 预置错误符号个数ser = zeros(1,length(EbN0_dB)); % 预置仿真误符号率tser_16QAM = zeros(1,length(EbN0_dB)); % 预置16QAM理论误符号率% 16QAM调制send = zeros(1,L_symbol);% 预设发送信号send_set = [-3+3j,-1+3j,1+3j,3+3j,...-3+1j,-1+1j,1+1j,3+1j,...-3-1j,-1-1j,1-1j,3-1j,...-3-3j,-1-3j,1-3j,3-3j];% 发射端星座点Es_avg = sum(abs(send_set).^2) / length(send_set);N0 = Es_avg ./ EsN0;for q = 1:L_symbolif (data(4*q-3:4*q) == [1,0,1,1])send(q) = send_set(1);% 1001 => -3+3jelseif (data(4*q-3:4*q) == [1,0,0,1])send(q) = send_set(2);% 1001 => -1+3jelseif (data(4*q-3:4*q) == [1,1,1,0])send(q) = send_set(3);% 1110 => +1+3jelseif (data(4*q-3:4*q) == [1,1,1,1])send(q) = send_set(4);% 1111 => +3+3jelseif (data(4*q-3:4*q) == [1,0,1,0])send(q) = send_set(5);% 1010 => -3+1jelseif (data(4*q-3:4*q) == [1,0,0,0])send(q) = send_set(6);% 1000 => -1+1jelseif (data(4*q-3:4*q) == [1,1,0,0])send(q) = send_set(7);% 1100 => +1+1jelseif (data(4*q-3:4*q) == [1,1,0,1])send(q) = send_set(8);% 1101 => +3+1jelseif (data(4*q-3:4*q) == [0,0,0,1])send(q) = send_set(9);% 0001 => -3-1jelseif (data(4*q-3:4*q) == [0,0,0,0])send(q) = send_set(10); % 0000 => -1-1jelseif (data(4*q-3:4*q) == [0,1,0,0])send(q) = send_set(11); % 0100 => +1-1jelseif (data(4*q-3:4*q) == [0,1,1,0])send(q) = send_set(12); % 0110 => +3-1jelseif (data(4*q-3:4*q) == [0,0,1,1])send(q) = send_set(13); % 0011 => -3-3jelseif (data(4*q-3:4*q) == [0,0,1,0])send(q) = send_set(14); % 0010 => -1-3jelseif (data(4*q-3:4*q) == [0,1,0,1])send(q) = send_set(15); % 0101 => +1-3jelsesend(q) = send_set(16); % 0111 => +3-3jendend%16AQM解调for q = 1:length(EbN0_dB)noise = sqrt(N0(q)/2)*randn(1,L_symbol) + 1j*sqrt(N0(q)/2)*randn(1,L_symbol); % AWGNreceive = (send + noise); % 接收信号detect = zeros(1,L_symbol); % 预置检测信号distance = zeros(1,M); % 解调:距离检测 for t = 1:L_symbolfor w = 1:Mdistance(w) = norm(receive(t) - send_set(w))^2;% 接收信号到所有星座点的距离endpos = find(distance == min(distance));% 最小距离星座点的位置detect(t) = send_set(pos); % 解调后的符号if (detect(t) ~= send(t)) error(q) = error(q) + 1;% 统计错误符号数endendser(q) = error(q)/L_symbol; % 16QAM仿真误符号率tser_16QAM(q) = 3*qfunc(sqrt(4/5*EbN0(q)))*(1-3/4*qfunc(sqrt(4/5*EbN0(q)))); % 16QAM理论误符号率endfiguresemilogy(EbN0_dB,ser,'o',EbN0_dB,tser_16QAM,'b');% 画图grid on;% 坐标轴开启axis([0 14 10^-5 10^-1]) % 限制作图范围xlabel('Eb/N0 (dB)'); % 横坐标ylabel('SER'); % 纵坐标legend('16QAM仿真误符号率','16QAM理论误符号率'); % 图例

四、仿真结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。