function [data_out]=ofdmsymbol_fft_cp(data_in,G,TxRx)

% We can make Nfft as a parameter as well
 Nfft = 256;

 if TxRx==10
      data=data_in'; %this makes the input column vector to a array

% %% making odfm symbol and taking IFFT
% function  symbol_ofdm = createsymbol (pilots,data)

%% now first generate the pilot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A=complex(-1,0);
B=complex(1,0);
pilots = [A B A B B B A A];  %%% here we direct making the pilot,detail procedure given below

% n_symbol = 1;  % At the time of generating the pilots, I need to know what symbol i am simulating 
%                % because the seed to do it depends on it.
% % The values of the pilots are to be modulated are defined in the standard as such(pp 443) :
% % Before beginning, it is necessary to consider that the value to calculate depends on 2 factors : 
% % the number of symbols and whether we are in the uplink or dwnlink. We will consider that we are in
% % the downlink and we are transmitting the symbol "1". 
% % If we want to consider the other uplink connection, the seed would be "10101010101".
% % 
% seed = [1 1 1 1 1 1 1 1 1 1 1];
% for i=1:n_symbol+2                         
%     wk(i) = seed (11);                 
%     next = xor(seed(9),seed(11));
%     seed = [next seed(1,1:10)];
% end
% 
% % Once the value of wk is found(that depends on the number of symbol with wihich it is working),
% % the values of the subcarriers must be found and of the mapping of them with BPSK constellation.
% 
% wk = wk(n_symbol+2)
% A = 1 - 2*wk                           % Values defined in the standard.
% B = 1 - 2*(~wk)
% value_carrier = [A B A B B B A A]
% 
% % For uplink, the values should be [A B A B A A A A]
% 
% pilot_mapping = 2*mapping(value_carrier,1,Tx);      
% 
% % The factor of "2" is due to the fact that the pilots are transmitted to a
% % double power of the information bits.

% NOW The guard bands are prepared.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

guard1 = complex (0,0) * ones (1,28);
DC = complex (0,0);
guard2 = complex (0,0) * ones (1,27);

% The pilot and guard subcarriers are placed according to the standard.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

symbol_ofdm = [guard1 data(1:12) pilots(1) data(13:36)...
    pilots(2) data(37:60) pilots(3) data(61:84) pilots(4)...
    data(85:96) DC data(97:108) pilots(5) data(109:132) pilots(6)...
    data(133:156) pilots(7) data(157:180) pilots(8) data(181:192) guard2];

% here the ofdm symbol is completed
%Now taking IFFT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 symbol_ofdm = sqrt(Nfft).*ifft(symbol_ofdm,Nfft);

 %Now adding cyclic prefix%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% we generate the cyclic prefix so that the multipaths do not affect our data so much.
margin = length(symbol_ofdm)*G;
data_tx = [symbol_ofdm((end-margin+1):end) symbol_ofdm];
data_out=data_tx;      

   % At receiving end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
elseif TxRx==01
       
data_rx=data_in;
% First, we must remove the CP.
margin = length(data_rx)*G;
margin = margin/(1+G);
symbol_ofdm_rx= data_rx(margin+1:end);
   
% After removing the CP, we have to inverse the IFFT, logcally by FFT. 

 symbol_rx = fft(symbol_ofdm_rx,Nfft) ./ sqrt(Nfft);
  
 % Here the pilots are indicated, since i need to know where they are.
 % now we will be able to estimate the channel.

 pilots = [symbol_rx(41) symbol_rx(66) symbol_rx(91) symbol_rx(116) symbol_rx(142) symbol_rx(167) symbol_rx(192) symbol_rx(217)];
      
% After getting the received symbol, the channel is to be estimated using
% the pilot carriers. This is bypassed for an AWGN channel.
 
% Next, the values of the data and pilot carriers are extracted
 data_total = [symbol_rx(29:40) symbol_rx(42:65) symbol_rx(67:90) symbol_rx(92:115) symbol_rx(117:128)...
           symbol_rx(130:141) symbol_rx(143:166) symbol_rx(168:191) symbol_rx(193:216) symbol_rx(218:229)];
 data_out=data_total'; %this makes it a column vector 
else
      disp('error in ofdmsymbol_fft_cp.m function');
end
        
  

       
 

  

 
 
 
 
 
 
 
 