%% 初始化(CCM模式(规定CCM固定的调制为QPSK 1/4调制 帧长为长序列 不加入导频))
clc;close all;
ps = 1e4; %码元速率
a = 0.5; %成形滤波器系数
B = (1+a)*ps;%中频信号带宽
Fs = 8e4; %采样频率
fc = 2e4; %载波频率
N = 1500; %每次生成码元的个数
t = 0:1/Fs:(N*Fs/ps-1)/Fs;
t1 = 0:1/ps:(N-1)/ps;
sps = Fs/ps; %upsamle
replay_n = 20; %每一个信噪比下重复的次数
snr_single = 0.2;%单次信噪比间隔
offset = 2; %加相偏 以pi/16 为基倍数 目前offset范围为pi/16*2=pi/8;
snr_n = 100; %信噪比间隔次数
BER_temp = zeros(1,replay_n);
BER = zeros(1,snr_n+1);
%% 星座映射
data = randi(2,1,N*2)-1; %qpsk 2bit-1 baud
Reflect_out = dvb_reflect(data,modcod,offset);
figure(1);
plot(real(Reflect_out),imag(Reflect_out));
title('star pictures');
%% 成形滤波 且预失真 方法2
Reflect_out_up = upsample(Reflect_out,sps);
% rcos
n_T = 4; %滤波截取码元数
Shape_b = rcosdesign(a,n_T,sps,'sqrt');
figure(4);
freqz(Shape_b);
rcos_Ads_i = filter(Shape_b,1,real(Reflect_out_up));
rcos_Ads_q = filter(Shape_b,1,imag(Reflect_out_up));
%% 调制载波
f0_i = cos(2*pi*fc*t);
f0_q = sin(2*pi*fc*t);
send_message = rcos_Ads_i.*f0_i+ rcos_Ads_q.*f0_q;
%% 信道 高斯白噪声
snr = 1:snr_single:snr_n*snr_single+1;
data1 = data(1:(N-4)*2);
for i = 1:snr_n+1
for j = 1:replay_n
receive_mod_message = awgn(send_message,snr(i));
% i路
demod_i = receive_mod_message.*f0_i;
% q路
demod_q = receive_mod_message.*f0_q;
demod_lpf_i = filter(Shape_b,1,demod_i);
demod_lpf_q = filter(Shape_b,1,demod_q);
demod_lpf_i_down = zeros(1,N-4);
demod_lpf_q_down = zeros(1,N-4);
for k = 1: length(demod_lpf_i_down)
demod_lpf_i_down(k) = demod_lpf_i(8*k+8*3+1); %延时
demod_lpf_q_down(k) = demod_lpf_q(8*k+8*3+1); %延时
end
demod_lpf = demod_lpf_i_down+1j*demod_lpf_q_down;
y = demod(demod_lpf);
% figure(7);
% plot(t-0.0004,demod_lpf_q,'r');hold on;
% plot(t1,imag(Reflect_out));hold on;legend('demod','data');
% axis([0,0.01,-0.8,0.8]);
x = y - data1;
BER_temp(j) = sum(abs(x));
end
BER(i) = sum(BER_temp)/(replay_n*length(x));
% % QPSK解调
% y = demod(receive_mod_message);
% x = y - data;
% BER_temp(j) = sum(abs(x));
% BER(i) =sum(BER_temp)/(N*replay_n);
end
figure(4);
plot(snr,BER);
xlabel('SNR/dB');
title('bit error rate');
legend('相干解调');
%% 相干解调 (理想同步); 不搞频带信号
%
% %lowpass filter
% fc1 = [ps 3.1e4]; %过渡带
% mag = [1 0];
% dev = [0.01 0.01];
% [n,wn,beta,ftype] = kaiserord(fc1,mag,dev,Fs);
% fpm = [0 fc1(1)*2/Fs fc1(2)*2/Fs 1];
% magpm = [1 1 0 0];
% rec_lpf = firpm(n,fpm,magpm);
%
%
% figure(5);
% freqz(rec_lpf);
% demod_lpf_i = filter(Shape_b,1,demod_i);
% demod_lpf_q = filter(Shape_b,1,demod_q);
% demod_lpf_i_down = downsample(demod_lpf_i,8,2);
% demod_lpf_q_down = downsample(demod_lpf_q,8,2);
% demod_lpf_i_down = zeros(1,N);
% demod_lpf_q_down = zeros(1,N);
% for i =1:N
% demod_lpf_i_down(i) = sum(demod_lpf_i(i*sps-sps+1:i*sps));
% demod_lpf_q_down(i) = sum(demod_lpf_q(i*sps-sps+1:i*sps));
% end
%% 误码率计算
%
% demod_lpf_i_down = zeros(1,N-4);
% demod_lpf_q_down = zeros(1,N-4);
% for i = 1: length(demod_lpf_i_down)
% demod_lpf_i_down(i) = demod_lpf_i(8*i+8*3+1);
% demod_lpf_q_down(i) = demod_lpf_q(8*i+8*3+1);
% end
% demod_lpf = demod_lpf_i_down+1j*demod_lpf_q_down;
% y = demod(demod_lpf);
% data1 = data(1:(N-4)*2);
% figure(7);
% plot(t-0.0004,demod_lpf_q,'r');hold on;
% plot(t1,imag(Reflect_out));hold on;legend('demod','data');
% axis([0,0.01,-0.8,0.8]);
% x = y - data1;
% BER_temp = sum(abs(x));
% BER = BER_temp/length(x)
QPSK的调制解调代码
于 2025-01-13 16:58:37 首次发布