当前位置:   article > 正文

一、基于MATLAB的QPSK仿真验证_matlab qpsk调制

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

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%QPSK调制解调%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %4进制正交相移键控
  3. %(1,1)--> pi/4 (-1,1)--> 3*pi/4 (-1,-1)-->5*pi/4 (1,-1)-->7*pi/4
  4. id = sqrt(-1);
  5. pi = 3.14159;
  6. h = 1/4; %调制指数
  7. M = 4; %进制数
  8. bit_number =40; %bit数目
  9. symbol_number = bit_number / (log2(M)); %码元数目
  10. sample_number = 100; %每个码元采样点数
  11. Tb = 1/4000; %每个码元持续时间
  12. Rb = 1/Tb; %码元速率
  13. fs = 1/Tb*sample_number; %基带采样率
  14. %**************************************************************************
  15. %产生0,1序列
  16. data = randi([0,1],1,bit_number);
  17. data_bipol = data * 2 - 1; %转换为极性码
  18. %将极性码映射成M进制码元
  19. Ik = zeros(1,symbol_number);
  20. for i=1:symbol_number
  21. if ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==1))
  22. Ik(i) = 1;
  23. elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==1))
  24. Ik(i) = 3;
  25. elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==-1))
  26. Ik(i) = 5;
  27. elseif ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==-1))
  28. Ik(i) = 7;
  29. end
  30. end
  31. %求相位偏移
  32. Ik_interp = sig_expand(Ik,sample_number);
  33. theta = Ik_interp * pi / 4; %相位偏移
  34. %theta = Ik*pi/4;
  35. I_signal = cos(theta); %I路基带信号
  36. Q_signal = sin(theta);
  37. figure(1)
  38. subplot(211)
  39. plot(theta);
  40. title('相位偏移');
  41. subplot(212)
  42. plot(I_signal);
  43. title('I路基带信号');
  44. %********************************************************
  45. %内插到载波取样率上
  46. I_signal_interp = interp(I_signal,1);
  47. Q_signal_interp = interp(Q_signal,1);
  48. Fs=fs;
  49. fc = 2000;
  50. t=0:1/Fs:(length(I_signal_interp)-1)*1/Fs;
  51. mod_signal = I_signal_interp .* cos(2*pi*fc*t) - Q_signal_interp .* sin(2*pi*fc*t);
  52. figure(2)
  53. plot(mod_signal);
  54. title('QPSK已调信号');
  55. %%%%%%%%%%%%%%%%% 加噪
  56. snr = 20; %信噪比
  57. signal_noise = awgn(mod_signal,snr);
  58. figure(3)
  59. plot(signal_noise);
  60. title('加入信噪比20dB的高斯白噪声');
  61. %****************************************************************************************************************************************
  62. %解调
  63. II_signal_demod = signal_noise .* cos(2*pi*fc*t);
  64. QQ_signal_demod = signal_noise .* sin(2*pi*fc*t);
  65. b = fir1(30,2*Rb/Fs,boxcar(31)); %30阶滤波器滤除高频分量
  66. h = freqz(b,1,512);
  67. II_lvbo = fftfilt(b,II_signal_demod);
  68. QQ_lvbo = fftfilt(b,QQ_signal_demod);
  69. a=sign(II_lvbo);
  70. bb=sign(QQ_lvbo);
  71. % figure(10)
  72. % % subplot(211);
  73. % plot(II_lvbo);hold on
  74. % % subplot(212)
  75. % plot(QQ_lvbo,'r--');
  76. figure(4)
  77. subplot(211)
  78. plot(II_lvbo);
  79. title('滤波后的I路信号');
  80. subplot(212)
  81. plot(QQ_lvbo);
  82. title('滤波后的Q路信号');
  83. %判决
  84. data_i=[];
  85. data_q=[];
  86. %取中间时刻进行抽样
  87. for j=(sample_number/2):sample_number:symbol_number*sample_number
  88. data_i = [data_i,II_lvbo(j)];
  89. data_q = [data_q,QQ_lvbo(j)];
  90. end
  91. temp1 = 1*(((data_i>(-0.2))&(data_i<0))| (data_i>0.2)); %需要将-0.0640判为1, 0.0640判为0
  92. temp2 = 1*(data_q<0);
  93. %恢复原始码元
  94. demod_data = [];
  95. for i=1:length(temp1)
  96. if((temp1(i)==1)&&(temp2(i)==1))
  97. demod_data = [demod_data,1,1];
  98. elseif((temp1(i)==0)&&(temp2(i)==1))
  99. demod_data = [demod_data,0,1];
  100. elseif((temp1(i)==0)&&(temp2(i)==0))
  101. demod_data = [demod_data,0,0];
  102. elseif((temp1(i)==1)&&(temp2(i)==0))
  103. demod_data = [demod_data,1,0];
  104. end
  105. end
  106. figure(5)
  107. t1 = sig_expand(data,sample_number);
  108. t2 = sig_expand(demod_data,sample_number);
  109. subplot(211)
  110. plot(t1);
  111. title('原始信号');
  112. subplot(212)
  113. plot(t2);
  114. title('解调后的信号');
  115. % 星座图
  116. figure(7)
  117. scatter(I_signal,Q_signal);
  118. ax = gca;
  119. ax.XAxisLocation = 'origin';
  120. ax.YAxisLocation = 'origin';

sig_expand.m

  1. function [code_expand] = sig_expand(code,M)
  2. N = length(code);
  3. %tmp = zeros(M,N);
  4. fz = ones(1,M);
  5. tmp = code(fz,:);
  6. x1 = reshape(tmp,1,M*N);
  7. code_expand = x1;
  8. end

code_expand1.m

  1. function [out]=code_expand1(d,M)
  2. N=length(d); %基带信号码元长度
  3. f = zeros(1,M*N);
  4. for i=1:N
  5. f(1:M:M*N) = d(i);
  6. end
  7. % x1 = d(f,:);
  8. % zero_replace=reshape(x1,1,M*N); % 1衿m*n 刿
  9. out = f;
  10. end

qpsk_sim_2.m

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%QPSK调制解调%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %4进制正交相移键控
  3. %(1,1)--> pi/4 (-1,1)--> 3*pi/4 (-1,-1)-->5*pi/4 (1,-1)-->7*pi/4
  4. %采用极性码与非极性码映射都可以
  5. %没有采用滤波器,直接对解调信号在一个码元周期内积分
  6. %实现过程
  7. %从原始二进制比特序列--->四进制码元映射--->相位偏移映射--->基带信号产生--->
  8. %加到射频载波--->QPSK已调信号--->加扰--->已调信号分别和同相正交载波相乘--->
  9. %一个码元周期内积分--->抽取滤波--->提取位定时信息--->计算相位偏移--->
  10. %并串转换--->恢复成二进制序列的过程
  11. %***************************************************************************
  12. id = sqrt(-1);
  13. pi = 3.14159;
  14. h = 1/4; %调制指数
  15. M = 4; %进制数
  16. bit_number =40; %bit数目
  17. symbol_number = bit_number / (log2(M)); %码元数目
  18. sample_number = 100; %每个码元采样点数
  19. Tb = 1/4000; %每个码元持续时间
  20. Rb = 1/Tb; %码元速率
  21. fs = 1/Tb*sample_number; %基带采样率
  22. ts = 1/fs;
  23. %**************************************************************************
  24. %产生0,1序列
  25. data = randi([0,1],1,bit_number);
  26. data_bipol = data * 2 - 1; %转换为极性码
  27. %将极性码映射成M进制码元
  28. Ik = zeros(1,symbol_number);
  29. for i=1:symbol_number
  30. if ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==1))
  31. Ik(i) = 1;
  32. elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==1))
  33. Ik(i) = 3;
  34. elseif ((data_bipol(2*i-1)==-1) && (data_bipol(2*i)==-1))
  35. Ik(i) = 5;
  36. elseif ((data_bipol(2*i-1)==1) && (data_bipol(2*i)==-1))
  37. Ik(i) = 7;
  38. end
  39. end
  40. figure(1)
  41. % subplot(211)
  42. % data_1 = sig_expand(data,sample_number);
  43. % plot(data_1);
  44. % title('原始二进制序列');
  45. %求相位偏移
  46. Ik_interp = sig_expand(Ik,sample_number);
  47. theta = Ik_interp * pi / 4; %相位偏移
  48. % subplot(212)
  49. plot(Ik_interp);
  50. title('经过映射的4进制码元');
  51. I_signal = cos(theta); %I路基带信号
  52. Q_signal = sin(theta);
  53. figure(2)
  54. plot(theta);
  55. title('相位偏移');
  56. % figure(3)
  57. % subplot(211)
  58. % plot(I_signal);
  59. % title('I路基带信号');
  60. % subplot(212)
  61. % plot(Q_signal);
  62. % title('Q路基带信号');
  63. %********************************************************
  64. %内插到载波取样率上
  65. I_signal_interp = interp(I_signal,1);
  66. Q_signal_interp = interp(Q_signal,1);
  67. Fs=fs;
  68. fc = 2 * Rb;%8000
  69. t=0:1/Fs:(length(I_signal_interp)-1)*1/Fs;
  70. mod_signal = I_signal_interp .* cos(2*pi*fc*t) - Q_signal_interp .* sin(2*pi*fc*t);
  71. figure(4)
  72. subplot(211)
  73. plot(I_signal_interp .* cos(2*pi*fc*t));
  74. title('I路已调信号');
  75. subplot(212)
  76. plot(Q_signal_interp .* sin(2*pi*fc*t));
  77. title('Q路已调信号');
  78. figure(5)
  79. plot(mod_signal);
  80. title('QPSK已调信号');
  81. %%%%%%%%%%%%%%%%% 加噪
  82. snr = 20; %信噪比
  83. signal_noise = awgn(mod_signal,snr);
  84. figure(6)
  85. plot(signal_noise);
  86. title('加入信噪比20dB的高斯白噪声');
  87. %****************************************************************************************************************************************
  88. %解调
  89. II_signal_demod = signal_noise .* cos(2*pi*fc*t);
  90. QQ_signal_demod = signal_noise .* (-sin(2*pi*fc*t));
  91. % figure(7)
  92. % subplot(211)
  93. % plot(II_signal_demod);
  94. % title('QPSK信号与同相载波相乘');
  95. % subplot(212)
  96. % plot(QQ_signal_demod);
  97. % title('QPSK信号与正交载波相乘');
  98. %将同向分量与正交分量在一个码元周期内积分
  99. II_X = reshape(II_signal_demod,sample_number,[]); %按一个码元宽度内的点数排列
  100. X_i = sum(II_X)*1/sample_number;
  101. QQ_X = reshape(QQ_signal_demod,sample_number,[]);
  102. X_q = sum(QQ_X)*1/sample_number;
  103. % figure(8)
  104. % subplot(211)
  105. % t4 = sig_expand(X_i,sample_number);
  106. % t5 = sig_expand(X_q,sample_number);
  107. % plot(t4);
  108. % title('I路积分以后的信号');
  109. % subplot(212)
  110. % plot(t5);
  111. % title('Q路积分以后的信号');
  112. %判决
  113. theta1 = mod(angle(X_i+id*X_q),2*pi);
  114. demod_data = [];
  115. for m=1:length(theta1)
  116. %theta1(m) = angle(X_i(m)+id*X_q(m));%mod(angle(data_i(m)+i*data_q(m)),2*pi);
  117. if theta1(m) > 3*pi/2
  118. demod_data = [demod_data 1 0];
  119. elseif theta1(m) < pi/2
  120. demod_data = [demod_data 1 1];
  121. elseif theta1(m) < pi
  122. demod_data = [demod_data 0 1];
  123. else
  124. demod_data = [demod_data 0 0];
  125. end
  126. end
  127. % %
  128. % figure(9)
  129. % t3 = sig_expand(theta1,sample_number);
  130. % plot(t3);
  131. % title('解调出的相位偏移');
  132. t1 = sig_expand(data,sample_number);
  133. t2 = sig_expand(demod_data,sample_number);
  134. figure(10)
  135. subplot(211)
  136. plot(t1);
  137. title('原始信号');
  138. subplot(212)
  139. plot(t2);
  140. title('解调后的信号');
  141. % 星座图
  142. % figure(11)
  143. % scatter(I_signal,Q_signal);
  144. % ax = gca;
  145. % ax.XAxisLocation = 'origin';
  146. % ax.YAxisLocation = 'origin';

四、仿真结论

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/1008254
推荐阅读
相关标签
  

闽ICP备14008679号