matlab生成一个QPSK信号

matlab生成一个QPSK信号,第1张

y(1)和y(2)是分离出来的实部和虚部信号

QPSK信号的包络就是y(1)和y(2)的模

求出这个QPSK信号包络的均值和方差

均值应该是信号的能量,也就是1

方差可以通过计算加噪后的能量,然后减去信号的能量得到

a=1/sqrt(2)

b=-1/sqrt(2)

ser=zeros(1,11)

power = 0

for i=1:1

error=0

for j=1:10000

n=10^(log10(0.5)-(i/10))

u=rand

z=(sqrt(n/2))*(sqrt(2*log(1/(1-u))))

u=rand

gsrv1=z*cos(2*pi*u)

gsrv2=z*sin(2*pi*u)

s=fix(rand(1,2)*2)

if s(1)==0

s(1)=a

elseif s(1)==1

s(1)=b

end

if s(2)==0

s(2)=a

elseif s(2)==1

s(2)=b

end

y(1)=s(1)+gsrv1

y(2)=s(2)+gsrv2

power = power + y(1)^2+y(2)^2

end

end

variance = (power-10000)/10000

如果统计的量越大,越精确

下面是一路信号的QPSK基带仿真的程序:

n=1e4

M=4

Tx=randint(n,1,M)

h=modem.pskmod(M)%产生调制QPSK句柄

y=modulate(h,Tx) %用QPSK句柄调制Tx信号

EbNo=10;

yNoise=awgn(y,EbNo,'measured') %加噪声

g=modem.pskdemod(M) %产生解调句柄

Rx=demodulate(g,yNoise)%解调信号

num_biterr=biterr(Tx,Rx) %计算错误的比特数

Pb=num_err/n %计算错误的比特概率

程序没有错,不是直接运行的,你需要建立三个.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/11088769.html

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

发表评论

登录后才能评论

评论列表(0条)

保存