瑞利信道QPSK调制与解调

% QPSK
clear
clc
close all
sample_nums=100000;
BER_AWGN=[];
SNR_db = 0:1:20;
m=1;
for SNR=0:1:20

%发送序列
sent_bits = randi([0,1], sample_nums,1);

%调制,发送信号
modulated_bits=pskmod(sent_bits,4,pi/4,'InputType','bit');
%AWGN
sigma = (10^(-SNR/10));
awgn=complex(sqrt(sigma/2)*randn(length(modulated_bits),1),sqrt(sigma/2)*randn(length(modulated_bits),1));
%通过AWGN信道
modulated_bits_awgn=modulated_bits+awgn;
%通过rayleigh信道
gaussian_real = randn(length(modulated_bits),1);
gaussian_image = randn(length(modulated_bits),1);
channel_gain = sqrt(1/2)*(gaussian_real + 1i*gaussian_image);% 计算复数信道增益


% awgn解调
recieved_bits=pskdemod(modulated_bits_awgn,4,pi/4,'OutputType','bit');
BER_AWGN(m)=bit_error_rate(sent_bits,recieved_bits);
% 瑞利解调
receive_signal=modulated_bits.*channel_gain+awgn;
modulated_bits_rayleigh=receive_signal./channel_gain;
recieved_bits_rayleigh=pskdemod(modulated_bits_rayleigh,4,pi/4,'OutputType','bit');
BER_rayleigh(m)=bit_error_rate(sent_bits,recieved_bits_rayleigh);
m=m+1;
if SNR == 5

    scatterplot(modulated_bits_awgn);
    title('awgn星座图 SNR=5')
    xlim([-2.5,2.5]);
    ylim([-2.5,2.5]);
    scatterplot(modulated_bits_rayleigh);
    title('瑞利星座图 SNR=5')
    xlim([-2.5,2.5]);
    ylim([-2.5,2.5]);
end
if SNR == 10

    scatterplot(modulated_bits_awgn);
    title('awgn星座图 SNR=10')
    xlim([-2.5,2.5]);
    ylim([-2.5,2.5]);
    scatterplot(modulated_bits_rayleigh);
    title('瑞利星座图 SNR=10')
    xlim([-2.5,2.5]);
    ylim([-2.5,2.5]);
end
if SNR == 15

    scatterplot(modulated_bits_awgn);
    title('awgn星座图 SNR=15')
    xlim([-2.5,2.5]);
    ylim([-2.5,2.5]);

    scatterplot(modulated_bits_rayleigh);
    title('瑞利星座图 SNR=15')
    xlim([-2.5,2.5]);
    ylim([-2.5,2.5]);
end
end

figure
semilogy(SNR_db,BER_AWGN,'o','MarkerFaceColor',[0 0.447 0.741]);
title('QPSK: error for AWGN');
grid on
xlabel('SNR');
ylabel('BER');


figure
semilogy(SNR_db,BER_rayleigh,'o','MarkerFaceColor',[0 0.447 0.741]);
title('QPSK: error for rayleigh');
grid on
xlabel('SNR');
ylabel('BER');


% 计算误比特率的函数
function ber = bit_error_rate(sent_bits, received_bits)
% 计算比特之间的差异
errors = sum(sent_bits ~= received_bits);
% 计算误比特率
ber = errors / length(sent_bits);
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值