一、基于MATLAB的QPSK仿真验证

基于MATLAB的QPSK调制解调仿真验证

    一、仿真要求

  • 产生二进制随机序列作为输入原始信号。
  • 通过QPSK调制解调原理产生基带信号。
  • 将基带信号加载到高频载波上产生QPSK已调信号。
  • 将QPSK已调信号经过高斯加性白噪声(模拟信道传输)。
  • 解调QPSK已调信号,并恢复出原始二进制码元。
  • 绘制出相关波形。

二、仿真方案详细设计

1QPSK调制解调原理

QPSK正交(四进制)频移键控,通过四进制信息去控制高频载波的相位的一种数字调制方式,具有较高的频谱利用率、较强的抗干扰性、在电路上实现也较为简单的特点。

数学原理:QPSK已调信号通常表示为

的形式,通过将不同的四进制码元映射为四种不同的相位偏移的一种调制方式,其中

,图2-1-1为相位映射图。

图2-1-1相位映射图

  1. QPSK正交调制框图

QPSK信号可以通过正交调制的方式产生,正交调制原理框图如下图2-2-1所示

图2-2-1正交调制原理框图

I路:同相支路;Q路:正交支路。

发送端:首先产生一串二进制信息比特流,经过串并变换将二进制比特流映射成为4进制信息码元。然后通过数据内插将数据采样率变大,如图2-2-2所示

图2-2-2原始序列与映射后的码元图

这里为了方便后面的相位映射将四进制码元直接映射成了1、3、5、7这四个数值(为了波形直观进行了插值绘图)。接下来通过相位映射规则将四进制码元映射为四种不同的相位偏移,如图2-2-3所示为映射后的相位偏移图

图2-2-3映射后的相位偏移图

从图中可以看到已经将四进制码元信息加载到了相位上并产生了4种不同的相位偏移,接下来经过正余弦变换即可得到I、Q两路基带信号,如图2-2-4所示为I、Q两路基带信号波形图

图2-2-4 I、Q基带信号波形图

这里因为正余弦的对称特点基带信号的取值只有两种情况,下面将I、Q两路基带信号通过内插将数据采样率内插到高频载波的采样率上,然后经过I、Q两路调制即可得到QPSK已调信号波形,如图2-2-5、2-2-6所示分别为I路、Q路已调信号波形与QPSK已调信号波形

图2-2-5 I、Q两路已调信号波形图

图2-2-6 QPSK已调信号波形图

从上图中我们可以看出QPSK已调信号有四种不同的相位偏移,并且是等幅度调制,具体调制是否正确需要接下来观察解调后的波形来确定。

  1. QPSK已调信号通过高斯信道

已调信号在实际信道传输过程中并不是理想的,会受到噪声等的影响从而使得信号波形发生变化,而在无线信道中传输时高斯白噪声是最常见的,因此通过给已调加入高斯白噪声来模拟信道传输特性。图2-3-1为QPSK已调信号加入20dB高斯加性白噪声波形图

图2-3-1 QPSK信号加入20dB高斯白噪声波形图

  1. QPSK信号解调

数学原理:QPSK信号解调可以采用正交解调方式进行,已调信号分别与同相载波和正交载波相乘

从乘积结果中我们可以发现表达式中含有高频二次载波分量,常规的方法为将相乘得到的结果通过一个低通滤波器滤除高频分量,剩余的信号即为携带信息的信号,通过抽取滤波、抽样判决、并串转换即可恢复出原始二进制序列。解调框图如图2-4-1所示

图2-4-1 QPSK正交解调框图1

上面这种方法经过验证解调出原始二进制序列是正确的。接下来我们采用另一种方法详细的进行QPSK信号的相干解调,通过观察表达式

我们可以发现前面低通滤波器主要的作用是滤除二次载波分量,当我们的高频载波频率为码元周期的整数倍时,可以根据三角函数是周期函数的特点将上面的表达式在一个码元周期内进行积分,正余弦函数在一个周期内积分为0,这样就滤除了高次载波分量而对于sin\Phi \; icos\varphi \; i来说对于给定的码元来说是个常数,在一个周期内积分相当于等倍数扩大,对于角度来说横纵坐标等倍数扩大其角度值是不变的因此可以采用这种方法进行QPSK信号的解调。解调框图如图2-4-2所示

图2-4-2 QPSK正交解调框图2

QPSK已调信号分别与同相载波与正交载波相乘后的波形如图2-4-3所示

图2-4-3 QPSK信号与同相正交载波相乘后的波形图

我们从包络中可以看出携带的信息,接下来将上面的信号分别在一个码元周期内积分,积分后的波形如图2-4-4所示

图2-4-4 I、Q两路积分后的波形图

从图中可以看出携带的信息基本已经提取出来了(波形有抖动是因为有噪声的干扰,为了波形直观将数据进行了内插绘图)。接下来在数据中间时刻采样提取位定时信息并且进行相位的计算恢复相位偏移,如图2-4-5所示

图2-4-5 解调出的相位偏移图

从上图中我们可以发现解调出的相位偏移有4种,前面调制的时候相位偏移也是4种,具体是否和调制的时候相一致我们需要恢复出原始二进制码元以后进行对比观察,接下来经过并串转换以后即可恢复出原始二进制序列,如图2-4-6所示

图2-4-6 原始二进制序列与解调后的二进制波形对比图

从上面的波形图中可以看出解调恢复出了原始二进制比特序列,进而验证了QPSK调制解调加扰回路的正确性。下面又画出了基带信号的星座图,如图2-4-7所示

图2-4-7 QPSK基带信号星座图

从上面星座图中可以看出,基带信号的确产生了四种不同的相位偏移,与前面调制时的理论分析相符合,更进一步的验证了QPSK调制解调的正确性。

三、仿真matlab代码

qpsk_sin_1.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%QPSK调制解调%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%4进制正交相移键控
%(1,1)--> pi/4 (-1,1)--> 3*pi/4 (-1,-1)-->5*pi/4 (1,-1)-->7*pi/4
id = sqrt(-1);
pi = 3.14159;
h = 1/4;                                                                    %调制指数
M = 4;                                                                      %进制数
bit_number =40;                                                             %bit数目
symbol_number = bit_number / (log2(M));                                     %码元数目
sample_number = 100;                                                        %每个码元采样点数
Tb = 1/4000;                                                                %每个码元持续时间
Rb = 1/Tb;                                                                  %码元速率
fs = 1/Tb*sample_number;                                                    %基带采样率

%**************************************************************************
%产生0,1序列
data = randi([0,1],1,bit_number);
data_bipol = data * 2 - 1;                                                  %转换为极性码
%将极性码映射成M进制码元
Ik = zeros(1,symbol_number);
for i=1:symbol_number 
	if ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==1))
		Ik(i) = 1;
	elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==1))
		Ik(i) = 3;
	elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==-1))
		Ik(i) = 5;
	elseif ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==-1))
		Ik(i) = 7;
	end 
end 

%求相位偏移
Ik_interp = sig_expand(Ik,sample_number);
theta = Ik_interp * pi / 4;                                                  %相位偏移

%theta = Ik*pi/4;
I_signal = cos(theta);                                                      %I路基带信号
Q_signal = sin(theta);
figure(1)
subplot(211)
plot(theta);
title('相位偏移');
subplot(212)
plot(I_signal);
title('I路基带信号');

%********************************************************
%内插到载波取样率上
I_signal_interp = interp(I_signal,1);
Q_signal_interp = interp(Q_signal,1);

Fs=fs;
fc = 2000;
t=0:1/Fs:(length(I_signal_interp)-1)*1/Fs;
mod_signal = I_signal_interp .* cos(2*pi*fc*t) - Q_signal_interp .* sin(2*pi*fc*t);
figure(2)
plot(mod_signal);
title('QPSK已调信号');

%%%%%%%%%%%%%%%%%               加噪
snr = 20;                                                                   %信噪比
signal_noise = awgn(mod_signal,snr);
figure(3)
plot(signal_noise);
title('加入信噪比20dB的高斯白噪声');

%****************************************************************************************************************************************
%解调
II_signal_demod = signal_noise .* cos(2*pi*fc*t);
QQ_signal_demod = signal_noise .* sin(2*pi*fc*t);
b = fir1(30,2*Rb/Fs,boxcar(31));                                            %30阶滤波器滤除高频分量
h = freqz(b,1,512);
II_lvbo = fftfilt(b,II_signal_demod);
QQ_lvbo = fftfilt(b,QQ_signal_demod);
a=sign(II_lvbo);
bb=sign(QQ_lvbo);
% figure(10)
% % subplot(211);
% plot(II_lvbo);hold on
% % subplot(212)
% plot(QQ_lvbo,'r--');
figure(4)
subplot(211)
plot(II_lvbo);
title('滤波后的I路信号');
subplot(212)
plot(QQ_lvbo);
title('滤波后的Q路信号');

%判决
data_i=[];
data_q=[];
%取中间时刻进行抽样
for j=(sample_number/2):sample_number:symbol_number*sample_number
    data_i = [data_i,II_lvbo(j)];
    data_q = [data_q,QQ_lvbo(j)];
end

temp1 = 1*(((data_i>(-0.2))&(data_i<0))| (data_i>0.2));                     %需要将-0.0640判为1, 0.0640判为0
temp2 = 1*(data_q<0);

%恢复原始码元
demod_data = [];
for i=1:length(temp1)
    if((temp1(i)==1)&&(temp2(i)==1))
       demod_data = [demod_data,1,1];
    elseif((temp1(i)==0)&&(temp2(i)==1))
       demod_data = [demod_data,0,1];
    elseif((temp1(i)==0)&&(temp2(i)==0))
       demod_data = [demod_data,0,0];
    elseif((temp1(i)==1)&&(temp2(i)==0))
       demod_data = [demod_data,1,0];
    end
end

figure(5)
t1 = sig_expand(data,sample_number);
t2 = sig_expand(demod_data,sample_number);
subplot(211)
plot(t1);
title('原始信号');
subplot(212)
plot(t2);
title('解调后的信号');

% 星座图
figure(7)
scatter(I_signal,Q_signal);
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

sig_expand.m

function [code_expand] = sig_expand(code,M)
    N = length(code);
    %tmp = zeros(M,N);
    fz = ones(1,M);
    tmp = code(fz,:);
    x1 = reshape(tmp,1,M*N);
    code_expand = x1;
end

code_expand1.m

function [out]=code_expand1(d,M)   
N=length(d);           %基带信号码元长度
f = zeros(1,M*N);
for i=1:N
    f(1:M:M*N) = d(i);
end 
% x1 = d(f,:);
% zero_replace=reshape(x1,1,M*N);  % 1衿m*n 刿
out = f;
end 

qpsk_sim_2.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%QPSK调制解调%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%4进制正交相移键控
%(1,1)--> pi/4 (-1,1)--> 3*pi/4 (-1,-1)-->5*pi/4 (1,-1)-->7*pi/4
%采用极性码与非极性码映射都可以
%没有采用滤波器,直接对解调信号在一个码元周期内积分
%实现过程
%从原始二进制比特序列--->四进制码元映射--->相位偏移映射--->基带信号产生--->
%加到射频载波--->QPSK已调信号--->加扰--->已调信号分别和同相正交载波相乘--->
%一个码元周期内积分--->抽取滤波--->提取位定时信息--->计算相位偏移--->
%并串转换--->恢复成二进制序列的过程
%***************************************************************************
id = sqrt(-1);
pi = 3.14159;
h = 1/4;                                                                    %调制指数
M = 4;                                                                      %进制数
bit_number =40;                                                             %bit数目
symbol_number = bit_number / (log2(M));                                     %码元数目
sample_number = 100;                                                        %每个码元采样点数
Tb = 1/4000;                                                                %每个码元持续时间
Rb = 1/Tb;                                                                  %码元速率
fs = 1/Tb*sample_number;                                                    %基带采样率
ts = 1/fs;

%**************************************************************************
%产生0,1序列
data = randi([0,1],1,bit_number);
data_bipol = data * 2 - 1;                                                  %转换为极性码
%将极性码映射成M进制码元
Ik = zeros(1,symbol_number);
for i=1:symbol_number 
	if ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==1))
		Ik(i) = 1;
	elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==1))
		Ik(i) = 3;
	elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==-1))
		Ik(i) = 5;
	elseif ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==-1))
		Ik(i) = 7;
	end 
end 
figure(1)
% subplot(211)
% data_1 = sig_expand(data,sample_number);
% plot(data_1);
% title('原始二进制序列');

%求相位偏移
Ik_interp = sig_expand(Ik,sample_number);
theta = Ik_interp * pi / 4;                                   %相位偏移
% subplot(212)
plot(Ik_interp);
title('经过映射的4进制码元');

I_signal = cos(theta);  %I路基带信号
Q_signal = sin(theta);
figure(2)
plot(theta);
title('相位偏移');
% figure(3)
% subplot(211)
% plot(I_signal);
% title('I路基带信号');
% subplot(212)
% plot(Q_signal);
% title('Q路基带信号');

%********************************************************
%内插到载波取样率上
I_signal_interp = interp(I_signal,1);
Q_signal_interp = interp(Q_signal,1);

Fs=fs;
fc = 2 * Rb;%8000
t=0:1/Fs:(length(I_signal_interp)-1)*1/Fs;
mod_signal = I_signal_interp .* cos(2*pi*fc*t) - Q_signal_interp .* sin(2*pi*fc*t);
figure(4)
subplot(211)
plot(I_signal_interp .* cos(2*pi*fc*t));
title('I路已调信号');
subplot(212)
plot(Q_signal_interp .* sin(2*pi*fc*t));
title('Q路已调信号');
figure(5)
plot(mod_signal);
title('QPSK已调信号');

%%%%%%%%%%%%%%%%%               加噪
snr = 20;                                                                   %信噪比
signal_noise = awgn(mod_signal,snr);
figure(6)
plot(signal_noise);
title('加入信噪比20dB的高斯白噪声');

%****************************************************************************************************************************************
%解调
II_signal_demod = signal_noise .* cos(2*pi*fc*t);
QQ_signal_demod = signal_noise .* (-sin(2*pi*fc*t));
% figure(7)
% subplot(211)
% plot(II_signal_demod);
% title('QPSK信号与同相载波相乘');
% subplot(212)
% plot(QQ_signal_demod);
% title('QPSK信号与正交载波相乘');

%将同向分量与正交分量在一个码元周期内积分
II_X = reshape(II_signal_demod,sample_number,[]);                           %按一个码元宽度内的点数排列
X_i = sum(II_X)*1/sample_number;
QQ_X = reshape(QQ_signal_demod,sample_number,[]);
X_q = sum(QQ_X)*1/sample_number;
% figure(8)
% subplot(211)
% t4 = sig_expand(X_i,sample_number);
% t5 = sig_expand(X_q,sample_number);
% plot(t4);
% title('I路积分以后的信号');
% subplot(212)
% plot(t5);
% title('Q路积分以后的信号');

%判决
theta1 = mod(angle(X_i+id*X_q),2*pi);
demod_data = [];
for m=1:length(theta1)
    %theta1(m) = angle(X_i(m)+id*X_q(m));%mod(angle(data_i(m)+i*data_q(m)),2*pi);
    if theta1(m) > 3*pi/2
        demod_data = [demod_data 1 0];
    elseif theta1(m) < pi/2
        demod_data = [demod_data 1 1];
    elseif theta1(m) < pi
        demod_data = [demod_data 0 1];
    else 
        demod_data = [demod_data 0 0];
    end
end

% % 
% figure(9)
% t3 = sig_expand(theta1,sample_number);
% plot(t3);
% title('解调出的相位偏移');
t1 = sig_expand(data,sample_number);
t2 = sig_expand(demod_data,sample_number);
figure(10)
subplot(211)
plot(t1);
title('原始信号');
subplot(212)
plot(t2);
title('解调后的信号');

% 星座图
% figure(11)
% scatter(I_signal,Q_signal);
% ax = gca;
% ax.XAxisLocation = 'origin';
% ax.YAxisLocation = 'origin';

四、仿真结论

结论:根据QPSK调制解调数学原理实现了从原始二进制比特序列--->四进制码元映射--->相位偏移映射--->基带信号产生--->加到射频载波--->QPSK已调信号--->加扰--->已调信号分别和同相正交载波相乘--->一个码元周期内积分--->抽取滤波--->提取位定时信息--->计算相位偏移--->并串转换--->恢复成二进制序列的过程。最后通过验证发现解调恢复出的二进制序列与原始输入的二进制序列相一致进而验证了QPSK调制解调的正确性。

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您想了解关于 qpsk 调制解调 Matlab 仿真的信息。QPSK 是一种常见的数字调制方式,它常被用于数字通信领域中。在 Matlab 中,可以使用 Communications Toolbox 中的 qpskmod 和 qpskdemod 函数进行 QPSK 调制和解调。这两个函数可以用于 MATLAB 中二进制数据流的调制和解调操作,其中 qpskmod 将二进制数据转换成 QPSK 符号,而 qpskdemod 将收到的 QPSK 符号转换为相应的二进制数据流。 下面是一个简单的 Matlab 代码示例,演示如何使用 qpskmod 和 qpskdemod 函数来实现 QPSK 调制和解调: % 载波频率值 fc = 1000; % 采样频率值 fs = 8000; % 采样时间 t = 0:1/fs:1; % 生成随机的二进制数据 data = randi([0 1], 1, 100); % QPSK调制 mod_data = qpskmod(data); % 将调制后的数据沿载波进行调制 carrier = cos(2*pi*fc*t); qpsk_signal = real(mod_data.'.*carrier); % 加入高斯白噪声 SNRdB = 10; qpsk_signal_noisy = awgn(qpsk_signal, SNRdB, 'measured'); % QPSK解调 demod_data = qpskdemod(qpsk_signal_noisy); % 计算比特误码率 ber = sum(xor(demod_data, data))/length(data); 上述代码中,我们首先使用 randi 函数生成一组随机的二进制数据,然后将其输入到 qpskmod 函数中进行 QPSK 调制得到 mod_data。接下来,我们使用余弦函数生成一个载波信号,将 mod_data 沿载波进行调制得到 qpsk_signal。然后,我们使用 awgn 函数为 qpsk_signal 添加高斯白噪声,得到 qpsk_signal_noisy。最后,我们将 qpsk_signal_noisy 输入到 qpskdemod 函数中进行 QPSK 解调,得到 demod_data。计算比特误码率的代码 ber = sum(xor(demod_data, data))/length(data)则可以用于确定解调的准确性。 希望以上信息能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值