参考网站:https://www.ilovematlab.cn/thread-97735-1-1.html
其实几乎完全照搬了该网站上面的方法,只是代码、画图方式稍微有点不同。
实验代码:
clear all;
fc = 5e6; % 码率为5MHz
%% QPSK接收器
data = 5000; %原码个数是1000个
random_data = randn(1,data)>0; %5000个随机的原码
%% 定义I和Q两个支路
I = zeros(1,data);
Q = zeros(1,data);
%% 把单极性码转换成双极性码
for i=1:data
if mod(i,2) == 1 && random_data(i) == 1
I(i) = 1;I(i+1) = 1;
elseif mod(i,2) == 1 && random_data(i) == 0
I(i) = -1;I(i+1) = -1;
elseif mod(i,2) == 0 && random_data(i) == 1
Q(i-1) = 1;Q(i) = 1;
elseif mod(i,2) == 0 && random_data(i) == 0
Q(i-1) = -1;Q(i) = -1;
end
end
%% 成形。成形的意思就是实现由消息到波形的转换。
% 以便发射,脉冲成形应该是在基带调制之后。
fs = 25e6;% 采样率:25MHz。
zero = fs/fc;% zero为过采样率。它等于(采样率fs/码速率)。
% I和Q成型之后的支路。
Izero = zeros(1,zero*data);Qzero = zeros(1,zero*data);
for i = 1:zero*data
if mod(i,zero) == 1
Izero(i) = I(fix((i-1)/zero)+1);
Qzero(i) = Q(fix((i-1)/zero)+1);
else
Izero(i) = 0;
Qzero(i) = 0;
end
end
%% 低通滤波器
% 平方根升余弦滤波器
% psf=rcosfir(rf,n_t,rate,fs,'sqrt')
% rate:过采样率,rf:滚降因子,n_t:滤波器阶数,fs:采样率
% 用在调制或发送之前,用在解调或接受之后,用来降低过采样符号流带宽并不引发ISI(码间串扰)
NT = 50;
N = 2*zero*NT; % PSF大小为500
rf = 0.1;
psf = rcosfir(rf,NT,zero,fs,'sqrt');
Ipulse = conv(Izero,psf);
Qpulse = conv(Qzero,psf);
% 调制之后的I、Q支路
Imod = zeros(1,zero*data + N);
Qmod = zeros(1,zero*data + N);
for i = 1:zero*data + N
t(i) = (i-1)/fs; %这里因为假设载频与码速率大小相等,所以用载频fc乘以过采样率=采样率。
Imod(i) = Ipulse(i)*sqrt(2)*cos(2*pi*fc*t(i));
Qmod(i) = Qpulse(i)*sqrt(2)*sin(2*pi*fc*t(i));
end
mod_sum = Imod + Qmod;
%% QPSK接收器
%% 解调
Idem = zeros(1,zero*data + N);
Qdem = zeros(1,zero*data + N);
for i=1:zero*data+N
Idem(i) = mod_sum(i) * sqrt(2) * cos(2*pi*fc*t(i));
Qdem(i) = mod_sum(i) * -sqrt(2) * sin(2*pi*fc*t(i));
end
%% 匹配滤波
mtf = rcosfir(rf,NT,zero,fs,'sqrt');
Imat = conv(Idem,mtf);
Qmat = conv(Qdem,mtf);
%% 数据的选择
Isel = zeros(1,zer