qpsk调制matlab仿真,QPSK调制解调仿真
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%主函數(shù)
clear;
clc;
SNR=10;? ?? ?? ?? ?? ?? ???% 信噪比
fl=?;? ?? ?? ?? ?? ?? ?? ???% 設(shè)置FFT長度
Ns=2;? ?? ?? ?? ?? ?? ?? ???%設(shè)置一個幀結(jié)構(gòu)中OFDM信號的個數(shù)
para=?;? ?? ?? ?? ?? ?? ?? ?%設(shè)置并行傳輸?shù)淖虞d波個數(shù)
sr=250000;? ?? ?? ?? ?? ?? ? %符號速率
br=sr.*2;? ?? ?? ?? ?? ?? ?? ?% 每個子載波的比特率
gl=8? ?? ?? ?? ?? ?? ?? ?? ? %保護時隙的長度
nloop=1 ;? ?? ?? ?? ?? ?? ?? ?%仿真循環(huán)次數(shù)
noe=0;? ?? ?? ?? ?? ?? ?? ???%誤碼率
nod=0;? ?? ?? ?? ?? ?? ?? ???%傳輸?shù)臄?shù)據(jù)數(shù)量
eop=0;? ?? ?? ?? ?? ?? ?? ???%誤組數(shù)
nop=0;? ?? ?? ?? ?? ?? ?? ???%傳輸?shù)姆纸M數(shù)
for iii=1:nloop;
%-------------產(chǎn)生數(shù)據(jù)------------
Signal=rand(1,para.*Ns.*??)>0.5
%產(chǎn)生0,1隨機序列,符號數(shù)為para*Ns*2,Signal實際得到的是右邊邏輯表達式的結(jié)果
%------------串并轉(zhuǎn)換---------
paradata=reshape(Signal,para,Ns.* ??)
%變換方式:前32bit為第一列,隨后的32bit變?yōu)榈诙?#xff0c;以類推
%------------QPSK調(diào)制--------
[ich,qch]=qpskmod(paradata,para,Ns, ??)
kmod=1./sqrt(2);
ich1=ich.*kmod;
qch1=qch.*kmod;
qpsk_x=ich1+qch1.*sqrt(-1)
%頻域數(shù)據(jù)變時域
%---------------IFFT------------
fy=ifft(qpsk_x)
ich2=real(fy)
qch2=imag(fy)
%--------------插入保護間隔------------
ich3=[ich2(fl-gl+1:fl,:);ich2]
qch3=[qch2(fl-gl+1:fl,:);qch2]
%--------------計算衰減--------------
spow=sum(ich3.^2+qch3.^2)/Ns./para;
attn= 0.5.*spow.*sr/br.*10.^(-SNR./10);
attn=sqrt(attn);
%并串轉(zhuǎn)換
ich4=reshape(ich3,1,(fl+gl) .*Ns)
qch4=reshape(qch3,1,(fl+gl) .*Ns)
%形成復(fù)數(shù)發(fā)射數(shù)據(jù)
TrData=ich4+qch4.*sqrt(-1)
%接收機
%----------加入高斯白噪聲-----------
ReData=awgn(TrData,SNR,'measured')
%接收端
%移去保護間隔
idata=real(ReData);
qdata=imag(ReData);
idata1=reshape(idata,fl+gl,Ns);
qdata1=reshape(qdata,fl+gl,Ns);
idata2=idata1(gl+1:gl+fl,:);
qdata2=qdata1(gl+1:gl+fl,:);
%FFT
Rex=idata2+qdata2.*sqrt(-1);
ry=fft(Rex);
ReIChan=real(ry);
ReQChan=imag(ry);
ReIchan=ReIChan/kmod;
ReQchan=ReQChan/kmod;
%QPSK解調(diào)
RePara=qpskdemod(ReIchan,ReQchan,para,Ns,??)
%接收端信號
ReSig=reshape(RePara,1,para.*Ns.* ??);
%-----------誤碼比特率(BER)------
% ------即時的誤碼和數(shù)據(jù)---------
noe2=sum(abs(ReSig-Signal));? ?? ?%將接收解調(diào)后的信號與原始信號相比較,累計不一樣的
nod2=length(Signal);? ?? ?? ?? ?? ? %發(fā)送信號的總長度
%累計誤碼組數(shù)和總的數(shù)據(jù)
noe=noe+noe2;
%因為進行了nloop次的循環(huán),所以把每次循環(huán)的數(shù)據(jù)和誤碼組數(shù)累積起來
nod=nod+nod2;
%計算誤組率(PER)(每次循環(huán)作為一個分組)
if noe2 ~=0
eop=eop+1;
else
eop=eop;
end
eop;
nop=nop+1;
fprintf('%d\t%e\t%d\n',iii,noe2/nod2,eop);%屏幕顯示
end
%----------輸出結(jié)構(gòu)------------
per=eop/nop;%總的誤組數(shù)
ber=noe/nod; %總的誤碼率
figure(1)? ?? ?? ?? ?? ?? ???%發(fā)送信號與接收信號的圖形
subplot(2,1,1),stem(Signal),grid minor;
title('signal');
xlabel('x'),ylabel('y');
subplot(2,1,2),stem(ReSig),grid minor;
title('Resignal')
figure(2)
subplot(2,1,1),stem(ich2),grid minor;
xlabel('x'),ylabel('y');
title('ifft變換之后的I路波形')
subplot(2,1,2),stem(qch2),grid minor;
xlabel('x'),ylabel('y');
title('ifft變換之后的Q路波形')? ???%加入噪聲后的I、Q路的幅度波形
figure(3)
subplot(2,1,1),stem(idata),grid minor;
xlabel('時間'),ylabel('幅度');
title('加噪聲后I路波形')
subplot(2,1,2),stem(qdata),grid minor;
xlabel('時間'),ylabel('幅度');
title('加噪聲后的Q路波形')
figure(4)
subplot(2,1,1),stem(ReIChan),grid minor ;
title('fft變換之后的I路波形')
subplot(2,1,2),stem(ReQChan),grid minor;
title('fft變換之后的Q路波形')
xlabel('x'),ylabel('y');
figure(5)
subplot(2,1,1),stem(TrData);
title('未加入噪聲時候的波形')
subplot(2,1,2),stem(ReData);
title('加入噪聲后的波形')
xlabel('x'),ylabel('y');
%QPSK星座圖
figure(6)
for alfa=0:0.001.*pi:2.*pi
plot(cos(alfa),sin(alfa),'g')
hold on
end
for i=1:Ns.*para
plot(ich1(i),qch1(i),'ro');
hold on
end
grid;
xlabel('I路');
ylabel('Q路');
title('調(diào)制后信號的星座圖');
hold off
figure(7)
plot(abs(fy));
title('ifft運算結(jié)果的波形');? ?? ?? ? %IFFT運算結(jié)果的波形
figure(8)
plot(abs(ry));
title('fft運算結(jié)果的波形');? ?? ?? ? %FFT運算結(jié)果的波形
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%qpskmod.m
function [iout,qout]=qpskmod(paradata,para,nd,ml)
%****************** variables *************************
% nd : Number of data
% ml : Number of modulation levels
% (QPSK ->2??16QAM -> 4)
% *****************************************************
m2=ml./2;
paradata2=paradata.*2-1;
count2=0;
for jj=1:nd
isi = zeros(para,1);
isq = zeros(para,1);
for ii = 1 : m2
isi = isi + 2.^( m2 - ii ) .* paradata2((1:para),ii+count2);
isq = isq + 2.^ ( m2 - ii ) .* paradata2((1:para),m2+ii+count2);
end
iout((1:para),jj)=isi;
qout((1:para),jj)=isq;
count2=count2+ml;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%qpskdemod.m
function [demodata]=qpskdemod(idata,qdata,para,nd,ml)
demodata=zeros( para,ml*nd );
demodata((1:para),(1:ml:ml*nd-1))=idata((1:para),(1:nd))>=0;
demodata((1:para),(2:ml:ml*nd))=qdata((1:para),(1:nd))>=0;
總結(jié)
以上是生活随笔為你收集整理的qpsk调制matlab仿真,QPSK调制解调仿真的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux编译mmc驱动,Embeded
- 下一篇: 图形化界面客户端连接phoenix操作h