⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modulation_demodulation_8psk_fpga.m

📁 基于8PSK的调制解调
💻 M
字号:
clear
clc
%for SNR=0:30
    SNR=20;
%Simulatin For FPGA%
%8psk Modulation and Demodulation%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%每个码元由3个比特组成;                                                  
%
%  :表示信号的相位                                                    
% 000->0 001->pi/4 011->pi/2 111->3pi/4 101->pi 100->5pi/4 110->3pi/2 010->7pi/4%
%   0        1        2          3         4        5          6          7 
% 圆半径为A=10                                                                                                      
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

dataNum=2*16;%%%%   ??
%dataNum=1;
bitlength=18;
FrameData=randint(dataNum,bitlength);%%%  在FPGA中存储数据18位datastore中,前16位为数据,后两位为无效
%  Data Store Circuit && Parallel18-Parallel3 Circuit%
%FrameData=[0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 ;1 1 0 1 1 0 1 1 1 0 0 0 0 0 1 0 1 0 ];
DsFIFO(1,18)=0;
Data3(bitlength*dataNum/3+1,3)=0;  %%%%bitlength*dataNum/3+1 是什么意思?193
                                      %第一个3比特数据为无效数据,Data3(1,:)=[0 0 0]
for i=1:dataNum                      %因为解调端采用差分解调,为了完整的解调出有效数据,故在有效数据的前面添加一个无效数据。解调时要去掉
    DsFIFO=FrameData(i,:);
    for j=1:bitlength/3    % 6
       Data3((i-1)*6+1+j,1)=DsFIFO(1,(j-1)*3+1);%%%%————数据缓存
       Data3((i-1)*6+1+j,2)=DsFIFO(1,(j-1)*3+2);
       Data3((i-1)*6+1+j,3)=DsFIFO(1,(j-1)*3+3);
       
    end
end
%8PSK Coding Circuit && I and  Q  Transition Circuit%
[length,v]=size(Data3);
Icodingdata(1,length)=0;   %xlabel---------I支路:b1b3
Qcodingdata(1,length)=0;   %ylabel---------Q支路:b2b3~
Icounter=1;
Qcounter=1;
codingFIFO(1,3)=0;
abphasenum=0; %绝对相位  Suppose the abphase of the first symbol is 0   
rephasenum=0; %%参考相位

% radius is 10 

    %amplitude_bit mode 2 calculate
   
    %Phase Calculating and coding%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%差分编码
    bata=6.4;%%%% 幅度调制的倍数,这样的话幅度被放大,从而不会被噪声淹没
for i=1:length
  codingFIFO=Data3(i,:);
     if(codingFIFO(:,1:3)==[0 0 0])
        rephasenum=0;
    elseif(codingFIFO(:,1:3)==[0 0 1])
        rephasenum=1;
    elseif(codingFIFO(:,1:3)==[0 1 1])
        rephasenum=2;
    elseif(codingFIFO(:,1:3)==[1 1 1])
        rephasenum=3;
    elseif(codingFIFO(:,1:3)==[1 0 1])
        rephasenum=4;
    elseif(codingFIFO(:,1:3)==[1 0 0])
        rephasenum=5;
    elseif(codingFIFO(:,1:3)==[1 1 0])
        rephasenum=6;
    elseif(codingFIFO(:,1:3)==[0 1 0])
        rephasenum=7;
    end
       abphasenum=rem((abphasenum+rephasenum),8);%%%%%rem(X,Y)==X-Y.*fix(X./Y),fix 朝零方向取整
    %-------------2->3 Level Quantization------------%
    if(abphasenum==0)     % round jumping
        Icodingdata(i)=10*bata;
        Qcodingdata(i)=0*bata;
    elseif(abphasenum==1)
        Icodingdata(i)=7.07*bata;
        Qcodingdata(i)=7.07*bata;
    elseif(abphasenum==2)
        Icodingdata(i)=0*bata;
        Qcodingdata(i)=10*bata;
    elseif(abphasenum==3)
        Icodingdata(i)=-7.07*bata;
        Qcodingdata(i)=7.07*bata;
    elseif(abphasenum==4)
        Icodingdata(i)=-10*bata;
        Qcodingdata(i)=0*bata;
    elseif(abphasenum==5)
        Icodingdata(i)=-7.07*bata;
        Qcodingdata(i)=-7.07*bata;
    elseif(abphasenum==6)
        Icodingdata(i)=0*bata;
        Qcodingdata(i)=-10*bata;
    elseif(abphasenum==7)
        Icodingdata(i)=7.07*bata;
        Qcodingdata(i)=-7.07*bata;
    
    end
end
figure(1)

    plot(Icodingdata, Qcodingdata,'r*')
    grid on

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Add FrameHead Circuit%
%0->-32
%1->32
%13-bit Barker code is used for frame synchronization 
%0000011001010
%7-bit Barker code is used for frame demarkation
%0001101
%    BPSK modulation to FrameHead
FrameHead=[-64*ones(1,5) 64 64 -64 -64 64 -64 64 -64 -64*ones(1,3) 64 64 -64 64];
IaddheadData=[FrameHead Icodingdata];
QaddheadData=[zeros(1,20) Qcodingdata];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Inserting Circuit%128->2048                  ~~~~~内插~~64~~
Ins=2048/128*4;   %=64
[v1 length1]=size(IaddheadData);
IinsertData=zeros(1,length1*Ins);
QinsertData=zeros(1,length1*Ins);
for i=1:length1
    IinsertData((i-1)*Ins+1)=IaddheadData(i);
    QinsertData((i-1)*Ins+1)=QaddheadData(i);
end
figure(12)
subplot(2,1,1)
plot(IinsertData)
title('IinsertData')
grid on
subplot(2,1,2)
plot(QinsertData)
title('Qfilterdata')
grid on

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Filter Circuit%
Ifilterdata=rcosfilterp(IinsertData,0.35,51,8);    %%%  升余弦滚降滤波器 ——成型滤波
Qfilterdata=rcosfilterp(QinsertData,0.35,51,8);    %%%  滤波器的长度至少为输入数据周期长度的3倍
figure(2)
subplot(2,1,1)
plot(Ifilterdata)%%为了画出来的图形更好看,即把X坐标轴压缩
title('Ifilterdata')
grid on
subplot(2,1,2)
plot(Qfilterdata)
title('Qfilterdata')
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Quadrature Transiton Circuit%
[v3 length2]=size(Ifilterdata);
for i=1:length2
    IF_Modulation_Data(i)=Ifilterdata(i)*cos(pi*i/2)+Qfilterdata(i)*sin(pi*i/2);
end
figure(3)
plot(IF_Modulation_Data(5000:10000))
title('IF\_Modulation\_Data')
grid on


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  % IF_Modulation_Data=AWGN(IF_Modulation_Data,SNR,'measured',[],'dB');%%%加入噪声
%%%%
%%%%                               8PSK解调
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                  NCO Circuit%
NCO_data_I=zeros(1,length2);
NCO_data_Q=zeros(1,length2);
for i=1:length2
    NCO_data_I(i)=IF_Modulation_Data(i)*cos(pi*i/2);
    NCO_data_Q(i)=IF_Modulation_Data(i)*sin(pi*i/2);
end
figure(4)
subplot(2,1,1)
plot(NCO_data_I(1:2000))
title('NCO\_data\_I')
grid on
subplot(2,1,2)
plot(NCO_data_Q(1:2000))
title('NCO\_data\_Q')
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Low_Filter Circuit%
Low_Filter_data_I=zeros(1,length2);
Low_Filter_data_Q=zeros(1,length2);
Low_Filter_data_I=rcosfilterp(NCO_data_I,0.35,8*64+1,8);%%%%%%%%% 匹配滤波要与调制中的成型滤波器相同
Low_Filter_data_Q=rcosfilterp(NCO_data_Q,0.35,8*64+1,8);
figure(5)
subplot(2,1,1)
plot(Low_Filter_data_I(1:2000))
title('Low_Filter\_data\_I')
grid on
subplot(2,1,2)
plot(Low_Filter_data_Q(1:2000))
title('Low\_Filter\_data\_Q')
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Decimation Circuit%
%一个码元有64个样点,设抽取系数为8,对8路样点序列作相关,找出相关峰最大的那一路序列做解调
length3=length2/8;
length3;%%%%   test point
Decimation_data_I=zeros(1,length3);
Decimation_data_Q=zeros(1,length3);
for i=1:length3
    Decimation_data_I(i)=Low_Filter_data_I(i*8-7);
    Decimation_data_Q(i)=Low_Filter_data_Q(i*8-7);
end
figure(6)
subplot(2,1,1)
plot(Decimation_data_I)
title('Decimation\_data\_I')
grid on
subplot(2,1,2)
plot(Decimation_data_Q)
title('Decimation\_data\_Q')
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Frame Synchronization Circuit%
%13-bit Barkercode correlation Calculation%
Correlation_Det_I=zeros(1,length3);
Correlation_Det_Q=zeros(1,length3);
Barkercode=[0 0 0 0 0 1 1 0 0 1 0 1 0];
for i=1:1:(length3-96)                             %(length3-96) ——(13-1)*8==96,length-96+8*(13-1)=length
    for j=1:13
        if(Barkercode(j)==0)
            Correlation_Det_I(i)=Correlation_Det_I(i)-Decimation_data_I(i+8*(j-1));
            Correlation_Det_Q(i)=Correlation_Det_Q(i)-Decimation_data_Q(i+8*(j-1));
        else
            Correlation_Det_I(i)=Correlation_Det_I(i)+Decimation_data_I(i+8*(j-1));
            Correlation_Det_Q(i)=Correlation_Det_Q(i)+Decimation_data_Q(i+8*(j-1));
        end
    end
    Correlation_Det_I(i)=(Correlation_Det_I(i)/500)^2;   
    % Correlation_Det_I(i)=abs(Correlation_Det_I(i));
end

figure(7)
plot(Correlation_Det_I)
title('correlation\_Det\_I')
%axis([0 20 -120 120])
grid on
Threshold_Correlation_Det=max(Correlation_Det_I);             %%% 求出最大的相关值作为门限值
Threshold_Correlation_Det;                                    %%%%  test point
DET_serial_number_I=0;
for i=1:length3/4                                            %%%%%%       为什么除以4?减小运算量
    if(Correlation_Det_I(i)==Threshold_Correlation_Det)
        DET_serial_number_I=i                       %i=1
    end
end
 DET_serial_number_I;                                    %%%%  test point
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%Demarkation Circuit%
Demarkation_data_I=zeros(1,round(length3/8));
Demarkation_data_Q=zeros(1,round(length3/8));
for i=DET_serial_number_I:8:length3
    Demarkation_data_I(1+(i-DET_serial_number_I)/8)=Decimation_data_I(i);
    Demarkation_data_Q(1+(i-DET_serial_number_I)/8)=Decimation_data_Q(i);
end
%for i=DET_serial_number_I:1:length3/8
 %   Demarkation_data_I(i)=Decimation_data_I(1+(i-1)*8);
  %  Demarkation_data_Q(i)=Decimation_data_Q(1+(i-1)*8);
  %end
figure(8)
subplot(2,1,1)
plot(Demarkation_data_I)
title('Demarkation\_data\_I')
grid on
subplot(2,1,2)
plot(Demarkation_data_Q)
title('Demarkation\_data\_Q')
grid on
for i=1:1:length3/8
    if(Demarkation_data_I(i)>0)
        Demarkation_data_bit_I(i)=1;
    else
        Demarkation_data_bit_I(i)=-1;
    end
end

%0001101
FIFO=zeros(1,7);
Barker_code_7=[-1 -1 -1 1 1 -1 1];
Demarkation_sum=zeros(1,length3/8);
Demarkation_number=0;
for i=1:round(length3/8)
    for j=1:6
        FIFO(j)=FIFO(j+1);
    end
    FIFO(7)=Demarkation_data_bit_I(i);
    Demarkation_sum(i)=FIFO*(Barker_code_7');
    if(Demarkation_sum(i)==7)         %帧头为13位"同步"巴克码+7位"定界"巴克码,定界相关器的峰值点出现在第20点。
        Demarkation_number=i
    end
end
%8PSK_Decoding Circuit%
length4=round(length3/8);
Decoding_Data_I=zeros(1,length4-20);%%%%%20:加入的巴克码的长度,去掉贞头后的长度
Decoding_Data_Q=zeros(1,length4-20);%%%%%   如果把20改为------Demarkation_number------会出现假同步,因此要用一标志位加以标记
for i=1:(length4-20)
    Decoding_Data_I(i)=Demarkation_data_I(i+20);
    Decoding_Data_Q(i)=Demarkation_data_Q(i+20);
end
figure(9)
subplot(2,1,1)
stem(Decoding_Data_I)
title('Decoding\_Data\_I')
grid on
subplot(2,1,2)
stem(Decoding_Data_Q)
title('Decoding\_Data\_Q')
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Demodulation_Data3=zeros(bitlength*dataNum/3+1,3);
%[v l]=size(Decoding_Data_I);
%[v decodinglength]=size(Decoding_Data_I);
decodinglength=bitlength*dataNum/3+1;
a=zeros(1,decodinglength);
b=zeros(1,decodinglength);
c=zeros(1,decodinglength);
d=zeros(1,decodinglength);
for i=2:(decodinglength)%81
    x(i)=Decoding_Data_Q(i)*Decoding_Data_Q(i-1)+Decoding_Data_I(i)*Decoding_Data_I(i-1);
    y(i)=Decoding_Data_Q(i)*Decoding_Data_I(i-1)-Decoding_Data_I(i)*Decoding_Data_Q(i-1);
    %a(i)=x(i)*sin(pi/8)+y(i)*cos(pi/8);
   % b(i)=x(i)*sin(3*pi/8)+y(i)*cos(3*pi/8);
    %c(i)=x(i)*sin(5*pi/8)+y(i)*cos(5*pi/8);
   % d(i)=x(i)*sin(7*pi/8)+y(i)*cos(7*pi/8);
   a(i)=x(i)*48+y(i)*118;
    b(i)=x(i)*118+y(i)*48;
    c(i)=x(i)*118+y(i)*(-48);
    d(i)=x(i)*48+y(i)*(-118);
    if((a(i)>0)&&(b(i)>0)&&(c(i)>0)&&(d(i)>0))
        Demodulation_Data3(i,1:3)=[0 0 0];
    elseif((a(i)>0)&&(b(i)>0)&&(c(i)>0)&&(d(i)<0))
        Demodulation_Data3(i,1:3)=[0 0 1];
    elseif((a(i)>0)&&(b(i)>0)&&(c(i)<0)&&(d(i)<0))
        Demodulation_Data3(i,1:3)=[0 1 1];
    elseif((a(i)>0)&&(b(i)<0)&&(c(i)<0)&&(d(i)<0))
        Demodulation_Data3(i,1:3)=[1 1 1];
    elseif((a(i)<0)&&(b(i)<0)&&(c(i)<0)&&(d(i)<0))
        Demodulation_Data3(i,1:3)=[1 0 1];
    elseif((a(i)<0)&&(b(i)<0)&&(c(i)<0)&&(d(i)>0))
        Demodulation_Data3(i,1:3)=[1 0 0];
    elseif((a(i)<0)&&(b(i)<0)&&(c(i)>0)&&(d(i)>0))
        Demodulation_Data3(i,1:3)=[1 1 0];
    elseif((a(i)<0)&&(b(i)>0)&&(c(i)>0)&&(d(i)>0))
        Demodulation_Data3(i,1:3)=[0 1 0];
    end
end
%Demodulation_Data3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%   __----------------- 计算误码率
errorbit=0;
BER=0;
C=(Data3~=Demodulation_Data3);
errorbit=sum(sum(C));
BER=errorbit/(length*3);

    figure(11)
    semilogy(SNR,BER,'*')
    title('BERvsSNR')
    xlabel('BER')
    ylabel('SNR')
    grid on
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Data3'
Demodulation_Data3'
BER
errorbit

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -