1 原理
2 仿真
3 总结反思
4 参考资料
1 原理
QPSK的具体内容请参考百度,QPSK的调制jie框图大致如下:
QPSK信号可以采用正交调制的方式产生,如第一张图片的左半部分,I路信号与cos 信号相乘,Q
路信号与sin信号相乘。I,Q路信号的分流产生方式可以由第二图所示得到,先将串行的bit数据进
行双极性符号映射:
之后进行串并转换,根据数据所在位置的把数据分为I/Q两路信号,I路信号与cos 信号相乘,Q路
信号与sin信号相乘。之后把两路数据相加得到所传输的信号,在接收方,采用相干解调,把I/Q路
信号解调出来,之后进行串并转换以及符号逆映射,即可得到解调的bit数据。串并转换是完成串行
传输和并行传输这两种传输方式之间转换的技术。
2 仿真
(1)主函数
clear all;
close all;
clc;
N=input('The number of bits:'); % 比特总数,数据长度
T=1; % 比特周期
fc=2; % 载波频率
Fs=100; % 抽样频率
snr = 3;
%% 产生数据并且进行符号映射
bitstream = randi([0,1],1,N); % 随机产生的比特数0、1
bitstream_symbol = 2*bitstream-1; % 单极性变为双极性(0到-1;1到1)
%% 两路传输I/Q
I_signal = bitstream_symbol(1:2:N);
Q_signal = bitstream_symbol(2:2:N);
%% 载波
[I_c,Q_c] = base_to_band(T,N,fc,Fs,I_signal,Q_signal);
%% 信号合成
Qpsk_sig = awgn(I_c+Q_c,snr);
%% 解调
[I_est_sig,Q_est_sig] = demodulation_sig(Qpsk_sig,N,T,fc,Fs);
%% symbol_to_bit 和 串并转换
Estimated_Receive_data = symbol_to_bit(N,I_est_sig,Q_est_sig);
%% 画图
figures = figure_data(N,T,Fs,bitstream,I_signal,Q_signal,I_c,Q_c,I_est_sig,Q_est_sig,Estimated_Receive_data);
%% 计算误比特数目
error_bit = sum(Estimated_Receive_data ~= bitstream);
disp(['error_bit_number = ',num2str(error_bit)]);
(2)base_to_band函数
function [I_c,Q_c] = base_to_band(T,N,fc,Fs,I_signal,Q_signal)
I_carrier = [];
Q_carrier = [];
bit_t = 0:1/Fs:2*T-1/Fs; %载波周期为2倍比特周期,定义时间轴
for i=1:N/2
I_carrier = [I_carrier,I_signal(i)*cos(2*pi*fc*bit_t)]; %I路载波信号
Q_carrier = [Q_carrier,Q_signal(i)*cos(2*pi*fc*bit_t+pi/2)]; %Q路载波信号
end
I_c = I_carrier;
Q_c = Q_carrier;
end
(3)demodulation_sig函数
function [I_est,Q_est] = demodulation_sig(QPSK_receive,N,T,fc,Fs)
%解调
bit_t = 0:1/Fs:2*T-1/Fs; %载波周期为2倍比特周期,定义时间轴
I_receiver = [];
Q_receiver = [];
for i = 1:N/2
I_output = QPSK_receive(1,(i-1)*length(bit_t)+1:i*length(bit_t)).*cos(2*pi*fc*bit_t); % 积分
if sum(I_output) > 0 %积分器求和,大于0为1,否则为-1
I_receiver(i) = 1;
else
I_receiver(i) = -1;
end
Q_output = QPSK_receive(1,(i-1)*length(bit_t)+1:i*length(bit_t)).*cos(2*pi*fc*bit_t+ pi/2); % 积分
if sum(Q_output) > 0 %积分器求和,大于0为1,否则为-1
Q_receiver(i) = 1;
else
Q_receiver(i) = -1;
end
end
I_est = I_receiver;
Q_est = Q_receiver;
end
(4)symbol_to_bit串并转换以及符号逆映射函数
function estim_bit = symbol_to_bit(N,I_est_sig,Q_est_sig)
data = [];
for i=1:N
if mod(i,2) ~= 0
data = [data,I_est_sig((i-1)/2+1)]; %奇数取I路信息
else
data = [data,Q_est_sig(i/2)]; %偶数取Q路信息
end
end
estim_bit = data > 0;
end
(5)figure_data绘图函数
function figures = figure_data(N,T,Fs,bitstream,I_signal,Q_signal,I_c,Q_c,I_est_sig,Q_est_sig,Estimated_Receive_data)
t=0:1/Fs:N*T-1/Fs;
bit_data=[];
bit_est_d =[];
for i=1:N
bit_data = [bit_data,bitstream(i)*ones(1,T*Fs)];%在一个比特周期里面有T*Fs个1和采样点一模一样
bit_est_d = [bit_est_d,Estimated_Receive_data(i)*ones(1,T*Fs)];
end
I_source = I_signal >0;
Q_source = Q_signal >0;
I_est_data = I_est_sig >0;
Q_est_data = Q_est_sig >0;
I_data=[];
Q_data=[];
I_est=[];
Q_est=[];
for j = 1:N/2
%I路和Q路是原来比特周期的两倍,2Tb=Ts(码元周期),因此采样点个数为T*Fs*2
I_data = [I_data,I_source(j)*ones(1,T*Fs*2)];
Q_data = [Q_data,Q_source(j)*ones(1,T*Fs*2)];
I_est = [I_est,I_est_data(j)*ones(1,T*Fs*2)];
Q_est = [Q_est,Q_est_data(j)*ones(1,T*Fs*2)];
end
%% 原始数据
figure(1);
subplot(3,1,1)
plot(t,bit_data);legend('Bitstream')%比特信息
subplot(3,1,2)
plot(t,I_data);legend('I Bitstream')%I路信息
subplot(3,1,3)
plot(t,Q_data);legend('Q Bitstream')%Q路信息
%% 载波
figure(2); %产生一个新图
QPSK_signal = I_c + Q_c;
subplot(3,1,1)
plot(t,I_c);legend('I_carrier_signal')%I路信号
subplot(3,1,2)
plot(t,Q_c);legend('Q_carrier_signal')%Q路信号
subplot(3,1,3)
plot(t,QPSK_signal);legend('QPSK_signal')%I路、Q路和的信号
%% 解调数据
figure(3);
subplot(3,1,1)
plot(t, bit_est_d);legend('Est_Bitstream') %比特信息
subplot(3,1,2)
plot(t,I_est);legend('I_est_Bitstream')% I路信息
subplot(3,1,3)
plot(t,Q_est);legend('Q_est_Bitstream')% Q路信息
figures = 1;
end
(6)相关结果
原始数据:
调制信号:
解调信号:
原始数据:
调制信号:
解调信号:
3 总结反思
本次编写代码,主要是心血来潮,顺便复习一下QPSK的相关原理,在编写过程中也遇到一些问
题,在查阅相关的资料和阅读相关的文章之后,顺利完成本次目的。成果暂且放在公共平台,供后
来者交流学习之用,许多细节并未给出,主要是这个问题也不复杂,不足之处还请多多包涵。
4 参考资料
1 文章使用的图片均来自网络。
2 QPSK调制与解调(matlab,详细介绍仿真方案的设计、结果及结论、完整代码及注释)