pkg load communications;
clc;
close all;
clear all;
%nSym = 1000; %число точек данных

M=8;%задать число точек PSK
Nfaza=pi/6;
k=log2(M);
%
%мощность шума в дБ
pWR=19;
%
ffileName='A_Data_Var_11.txt'; % Задать файл для считывания данных
fdatfile=fopen(ffileName);
%-----------------Transmitter--------------------
%d=ceil(M.*rand(1,nSym))-1;
[ddfile,NFSimv]=fread(fdatfile,Inf,"uint8");
fclose(fdatfile);
%подготовка данных к PSK-модуляции
bdfile=(de2bi(ddfile,8))';
%
bd1=reshape(bdfile,1,NFSimv*8);
bd2=[bd1,zeros(1,(k-mod((NFSimv*8),k)))];
LL1=size(bd2);
bd=(reshape(bd2,k,LL1(2)/k))';
dd=bi2de(bd);
%
%модуляция PSK
s=pskmod(dd,M,Nfaza,"gray");%модуляция PSK кодом Грея,"bin" для двоичн.
%-------------- Channel ----------------
z=awgn(s,pWR);% помеха
%канальные сигналы----- выход кан ----- вход кан--
ZkanWithawgn=real(z)*cos(2*pi)+imag(z)*sin(2*pi);
ZkanWithoutAwgn=real(s)*cos(2*pi)+imag(s)*sin(2*pi);
%картинки созвездия
ht1=figure(); plot(s,'rx','linewidth',2); xlabel('I'); ylabel('Q');
ht2=figure(); plot(z,'gx','linewidth',2); xlabel('I'); ylabel('Q');
%картинки канала
ht3=figure(); plot(ZkanWithoutAwgn,'b','linewidth',1); xlabel('time, s'); ylabel('Amplitude A');
%ht13=figure(); periodogram(ZkanWithoutAwgn) %периодограмма (мгновенный спектр)
%ht23=figure(); pwelch(ZkanWithoutAwgn,256,[],[],'no-strip') %спектр мощности
ht4=figure(); plot(ZkanWithawgn,'c','linewidth',1); xlabel('time, s'); ylabel('Amplitude A');
%ht14=figure(); periodogram(ZkanWithawgn) %периодограмма (мгновенный спектр)
%ht24=figure(); pwelch(ZkanWithawgn,256,[],[],'no-strip') %спектр мощности
%--------detector------------
dCap=pskdemod(s,M,Nfaza,"gray");
dCap2=pskdemod(z,M,Nfaza,"gray");
%картинки
%
%
%проверка восстан.кан.сигнала
sp=pskmod(dCap2,M,Nfaza,"gray");
KanalVost = real(sp)*cos(2*pi)+imag(sp)*sin(2*pi);
%
ht5=figure(); plot(KanalVost,'m','linewidth',1); xlabel('time, s'); ylabel('Amplitude A');
%ht15=figure(); periodogram(KanalVost) %периодограмма (мгновенный спектр)
%ht25=figure(); pwelch(KanalVost,256,[],[],'no-strip') %спектр мощности
%канальные ошибки (символьные)
BitError = 0;
for i =1:length(dd)
  if(dd(i)!=dCap2(i))
  BitError=BitError+1;
end;
end;
%востановление данных
bdRX=de2bi(dCap2); 
%
LL2=size(bdRX);
bd1R=reshape(bdRX',1,k*LL2(1));
bd2R=bd1R(1:1,1:NFSimv*8);
bdRf=(reshape(bd2R,8,NFSimv));
%
ddRXfile=bi2de(bdRf');
%файловые ошибки (байтовые)
BitFileError = 0;
for i =1:length(ddfile)
  if(ddRXfile(i)!=ddfile(i))
  BitFileError=BitFileError+1;
end;
end;
%
[BERrBIT,rateBIT]=biterr(bd1,bd2R);
%Запись файла полученного через канал ПД 
RXfileName=strcat('RX_',num2str(round(M),4),'_PSK_',ffileName);
fdatfileRX=fopen(RXfileName,"w");
NFSimWR=fwrite(fdatfileRX,ddRXfile,"uint8");
fclose(fdatfileRX);
%конец