QPSK调制解调原理

QPSK调制解调原理,第1张

QPSK数字解调包括:模数转换、抽取或插值、稿搏匹配滤波、时钟和载波恢复等。

在实际的调谐解调电路中,采用的是非相干载波解核烂调,本振信号与发射端的载波信号存在频率偏差和相位抖动,因而解调出来的模拟I、Q基带信号是带有载波误差的信号。

这样的模拟基带信号即使采用定时准确的时钟进行取样判决,得到的数字信号也不是原来发射端的调制信号,误差的积累将导致抽样判决后的误码率增大,因此数字QPSK解调电路要对载键氏祥波误差进行补偿,减少非相干载波解调带来的影响。

扩展资料

(1)相位选择法

四路载波同时送入逻辑选相电路中,然后通过带通滤波器输出相应信号。

(2)正交调制法

其中a、b都是单极性,两路脉冲信号通过极性变换,0对应1、1对应-1,变成双极性二电平信号I(t)和Q(t)后进入两个平衡调制器,同相支路和正交支路分别独立地进行调制,然后把两路信号加起来得到已调信号。

参考资料来源:百度百科-qpsk

QPSK调制程序的testbench程序如下:

********************************************************************************

`timescale 1ns/1ns //单位时间,时间精度

module qpsk_tb//qpsk调制的testbench

regclk

regrst

regx

wire y

qpsk qpsk(.clk(clk),.rst(rst),.x(x),.y(y)) //将tb输入输出与主程序qpsk关联起来

always #25 clk=~clk //#25表示25个时间单位,

// 这句表示clk信号的周期是50(*1ns)

initial

begin

clk=0x=0rst=0//赋初值

#10rst=1x=1 /宴埋判/间隔10ns,将复位信号置为1

#10x=0

#400x=1 //时钟周期是50ns,晌改这里的信号表示的波形为

#400x=0 //1111111100000000111100001100

#200x=1

#200x=0

#100x=1

#100x=0

end

endmodule

QPSK解调程序的testbench程序如下:

********************************************************************************

`timescale 1ns/1ns //单位时间,时间精度

module qpsk_detb //qpsk解调的testbench

regclk

regrst

regx

wire y

qpsk_de qpsk_de(.clk(clk),.rst(rst),.x(x),.y(y))//将液茄tb输入输出与主程序qpsk_de关联起来

always #25 clk=~clk //#25表示25个时间单位

initial

begin

clk=0x=0rst=0

#10rst=1x=1#10x=0 //时钟周期是50ns,这里的信号表示的波形为

#400x=1#400x=0 //1111111100000000

#200x=1#200x=0 //11110000

#200x=0#200x=1 //00001111

#100x=0#200x=1#100x=0 //00111100

#100x=1#200x=0#100x=1 //11000011

#100x=1#100x=0 //1100

end

endmodule

程序没有错,不是直接运行的,你需要建立三个.m文件,分别把两个Function和最上面的程序粘贴上去。我修改了一下你只需要建立两个.m文件然后运行第一个文件就可以得到结备辩差果。

SNRindB1=0:2:10

SNRindB2=0:0.1:10

for i=1:length(SNRindB1)

[pb,ps]=cm_sm32(SNRindB1(i))

smld_bit_err_prb(i)=pb

smld_symbol_err_prb(i)=ps

end

for i=1:length(SNRindB2)

SNR=exp(SNRindB2(i)*log(10)/10)

theo_err_prb(i)=(1/2)*erfc(sqrt(2*SNR)/sqrt(2))

end

title('QPSK误码率分析灶斗')

semilogy(SNRindB1,smld_bit_err_prb,'*')

axis([0 10 10e-8 1])

hold on

% semilogy(SNRindB1,smld_symbol_err_prb,'仿皮o')

semilogy(SNRindB2,theo_err_prb)

legend('仿真比特误码率','理论比特误码率')

hold off

另一个.m文件

function [pb,ps]=cm_sm32(SNRindB)

N=10000

E=1

SNR=10^(SNRindB/10)

sgma=sqrt(E/SNR)/2

s00=[1 0]

s01=[0 1]

s11=[-1 0]

s10=[0 -1]

for i=1:N

temp=rand

if (temp<0.25)

dsource1(i)=0

dsource2(i)=0

elseif (temp<0.5)

dsource1(i)=0

dsource2(i)=1

elseif (temp<0.75)

dsource1(i)=1

dsource2(i)=0

else

dsource1(i)=1

dsource2(i)=1

end

end

numofsymbolerror=0

numofbiterror=0

for i=1:N

n=sgma*randn(size(s00))

if((dsource1(i)==0)&(dsource2(i)==0))

r=s00+n

elseif((dsource1(i)==0)&(dsource2(i)==1))

r=s01+n

elseif((dsource1(i)==1)&(dsource2(i)==0))

r=s10+n

else

r=s11+n

end

c00=dot(r,s00)

c01=dot(r,s01)

c10=dot(r,s10)

c11=dot(r,s11)

c_max=max([c00 c01 c10 c11])

if (c00==c_max)

decis1=0decis2=0

elseif(c01==c_max)

decis1=0decis2=1

elseif(c10==c_max)

decis1=1decis2=0

else

decis1=1decis2=1

end

symbolerror=0

if(decis1~=dsource1(i))

numofbiterror=numofbiterror+1

symbolerror=1

end

if(decis2~=dsource2(i))

numofbiterror=numofbiterror+1

symbolerror=1

end

if(symbolerror==1)

numofsymbolerror=numofsymbolerror+1

end

end

ps=numofsymbolerror/N

pb=numofbiterror/(2*N)

记得要保存为cm_sm32.m,然后运行前面那个.m文件就可以了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12471244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存