Transmit.m
上传用户:m_sun_001
上传日期:2014-07-30
资源大小:1115k
文件大小:7k
源码类别:

matlab例程

开发平台:

Matlab

  1. function BaseSignal = transmit(Datatx,ifftsize,carriers,...
  2.       wordsize,guardtype,guardtime,windowtype,DataAvg)
  3. %TRANSMIT Generates a COFDM waveform from an input data.
  4. %   function BaseSignal = transmit(DataIn,ifftsize,carriers,...
  5. %     wordsize,guardtype,guardtime,windowtype,DataAvg)
  6. %
  7. %   This function generates a COFDM time waveform based on the input parameters
  8. %   and the data given. The data is transmformed into a single frame COFDM signal. 
  9. %   This for the simulation of a COFDM phone system.
  10. %   INPUTS:
  11. %   ========
  12. %   Datatx     : Data to transmit in the wordsize given. eg. for wordsize = 2
  13. %        Data is from 0-3, for wordsize = 8, data is from 0-255
  14. %        The data should be a single row vector. See convbase.m to
  15. %        convert from 8bit data to the required wordsize.
  16. %        e.g. datatx = convbase(datain, 8, wordsize);
  17. %   ifftsize   : Size of ifft to use for generating the waveform
  18. %   carriers   : Which carriers to use for the transmission
  19. %   wordsize   : Number of bits to transmit on each carrier eg. 2 => QPSK
  20. %        1 => BPSK, 4 => 16PSK, 8 => 256PSK.
  21. %        Must be one of: 1,2,4 or 8
  22. %   guardtype  : What type of guard period to use
  23. %        Options:
  24. %        0 = No Guard period
  25. %        1 = zero level guard period
  26. %        2 = cyclic extension of end of symbols
  27. %        3 = same as 2 but with the first half of the guard period = zero
  28. %   guardtime  : Number of sample to use for the total guard time
  29. %   windowtype : Type of window to apply to the time waveform of the symbol
  30. %        Options: 
  31. %        0 = No windowing
  32. %        1 = Hamming window
  33. %   DataAvg    : Data Averaging. Number of repeats to send of each data word, so
  34. %        that the repeats can be combined at the receiver to reduce the 
  35. %        phase error, and thus to BER. DataAvg = 1 (No duplication)
  36. %
  37. %   OUTPUTS:
  38. %   ========
  39. %   BaseSignal : This is the output time signal for the COFDM waveform. The format
  40. %        of the output is a row vector.
  41. %   Datatx     : Data transmitted. This is the input data (DataIn) converted to 
  42. %        the number base used for transmission, based on wordsize.
  43. %   
  44. %   Copyright (c) Eric Lawrey 1997
  45. %
  46. %   See: RECEIVE, RDFILE.
  47. %===============================
  48. % External Functions Used :
  49. % None
  50. %===============================
  51. % Modifications:
  52. % 8/6/97 Redo of the previous simulation script. (based on distort.m)
  53. % 15/6/97 Continuing work on this function, currently not finished
  54. % 16/6/97 Continued work on function, it is now finished and works, but not all 
  55. % the features have been tested.
  56. % I have tested the windowing and the zeroed guard period. The code has also
  57. % been optimized a bit and runs ~10 times faster then it used to, plus
  58. % it can handle much bigger files (tested upto 87kbytes, wordsize=4), in 35sec
  59. % It appears to work as a function.
  60. % The function needs to be changed so that it does not read the file directly
  61. % but instead get the data as input.
  62. % 17/6/97 Modified the function so that it does read the input file from within 
  63. % the transmit function. This is so that the file can be read else where
  64. % then split up into smaller frames, then processed by transmit.
  65. % Fixed up some logical errors in the program, and removed the output phase
  66. % variable as it can be easily calculated from the data being transmitted.
  67. % 12/8/97 Changed the input requirements for Datatx. It is now DataIn which is a 
  68. % serial vector of byte data. The base conversion, reshaping of the data
  69. % into symbols, and padding of the input data is done by transmit.m. I also
  70. % data averaging that send duplicates of the data words. The duplicates are
  71. % sent as the very next data word. (No the best spreading, but easy to do).
  72. %====================
  73. % Initialization
  74. %====================
  75. %rand('seed',3567);
  76. NumCarr = length(carriers); %find the number of carriers
  77. %=====================
  78. % Apply Data Averaging
  79. %=====================
  80. %Duplicate data to be transmitted, duplicate each dataword having the next carrier
  81. %also transmitting the same data word. This will not give the best diversity
  82. %performance but is the easiest to implement.
  83. DataOut = zerohold(Datatx,DataAvg);
  84. %=============
  85. % Pad the Data
  86. %=============
  87. %Format the input serial data stream into symbols
  88. %Reshape the data to fit the number of carriers
  89. numsymb = ceil(length(DataOut)/NumCarr);
  90. %If the data length is not a multiple of the number of carrier the pad the data
  91. %with zeros
  92. if length(DataOut)/NumCarr ~= numsymb,
  93. DataPad = zeros(1,numsymb*NumCarr);
  94. DataPad(1:length(DataOut)) = DataOut;
  95. DataOut = DataPad;
  96. end
  97. clear DataPad;
  98. %==============================
  99. % Reshape the data into symbols
  100. %==============================
  101. DataOut = reshape(DataOut,NumCarr,numsymb)'; %Reshape the data into symbols
  102. numsymb = size(DataOut,1)+1; %find the total number of symbols 
  103. %including the phase reference symbol
  104. %========================================
  105. % Convert to DQPSK & add phase reference
  106. %========================================
  107. PhaseRef = round(rand(1,NumCarr)*(2^wordsize)+0.5); %generate random phase ref.
  108. DPSKdata = zeros(size(DataOut,1)+1,size(DataOut,2));
  109. DPSKdata(1,:) = PhaseRef;
  110. for k = 1:numsymb-1
  111. DPSKdata(k+1,:)=rem((DataOut(k,:) + DPSKdata(k,:)-1),(2^wordsize))+1;
  112. end
  113. %clear DataOut;
  114. %=====================================
  115. %Find the required spectrums
  116. %=====================================
  117. [X,Y] = pol2cart(DPSKdata*(2*pi/(2^wordsize)),ones(size(DPSKdata)));
  118. CarrCmplx = X+i*Y;
  119. NegCarriers = ifftsize-carriers+2; %find the bins for the negative frequency carriers
  120. TxSpectrums = zeros(numsymb,ifftsize);
  121. for k = 1:numsymb
  122. %Place the carriers used into the full spectrum
  123. TxSpectrums(k,carriers) = CarrCmplx(k,:);
  124. TxSpectrums(k,NegCarriers) = conj(CarrCmplx(k,:));
  125. end
  126. clear NegCarriers;
  127. %==================================
  128. %Find the time waveform using IFFT
  129. %==================================
  130. BaseSignal = real(ifft(TxSpectrums'));
  131. clear TxSpectrums; %Save Memory
  132. %=================================
  133. %Window the signal
  134. %=================================
  135. if windowtype==1
  136. window = hamming(ifftsize); %make window
  137. window2 = zeros(ifftsize,numsymb);
  138. for k = 1:numsymb-1
  139. window2(:,k) = window;
  140. end
  141. BaseSignal = window2.*BaseSignal; %window the waveform
  142. clear window2; %save memory
  143. clear window;
  144. end
  145. %=================================
  146. %Add a Guard Period
  147. %=================================
  148. if guardtype~=0
  149. if guardtype == 1  %if guard period is just a zero transmission
  150. BaseSignal=[zeros(guardtime,numsymb);BaseSignal];
  151. elseif guardtype == 2
  152. EndSignal = size(BaseSignal,1); %Find the number of columns in the BaseSignal
  153. BaseSignal=[BaseSignal((EndSignal-guardtime+1):EndSignal,:); BaseSignal];
  154. elseif guardtype == 3
  155. EndSignal = size(BaseSignal,1); %Find the number of columns in the BaseSignal
  156. BaseSignal=[zeros(guardtime/2,numsymb); ...
  157. BaseSignal((EndSignal-guardtime/2+1):EndSignal,:); BaseSignal];
  158. end
  159. end
  160. BaseSignal = reshape(BaseSignal,1,size(BaseSignal,1)*size(BaseSignal,2));