📄 modulation_demodulation_8psk_fpga.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 + -