genPreambleScript.pl
上传用户:aoptech
上传日期:2014-09-22
资源大小:784k
文件大小:9k
源码类别:

3G开发

开发平台:

Others

  1. #----------------------------------------------------------------------#
  2. # The MIT License 
  3. # Copyright (c) 2007 Alfred Man Cheuk Ng, mcn02@mit.edu 
  4. # Permission is hereby granted, free of charge, to any person 
  5. # obtaining a copy of this software and associated documentation 
  6. # files (the "Software"), to deal in the Software without 
  7. # restriction, including without limitation the rights to use,
  8. # copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. # copies of the Software, and to permit persons to whom the
  10. # Software is furnished to do so, subject to the following conditions:
  11. # The above copyright notice and this permission notice shall be
  12. # included in all copies or substantial portions of the Software.
  13. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  14. # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  15. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  16. # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  17. # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  18. # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. # OTHER DEALINGS IN THE SOFTWARE.
  21. #----------------------------------------------------------------------#
  22. #!/usr/local/bin/perl
  23. use POSIX; # for ceil
  24. my @shortPreambles;
  25. my @longPreambles;
  26. my @longPreSigns;
  27. my @sPreamble_real;
  28. my @sPreamble_imag;
  29. my @lPreamble_real;
  30. my @lPreamble_imag;
  31. my @packet_real; #create a sample packet (no noise)
  32. my @packet_imag;
  33. my @noisePacket_real; # packet with noise and rotation added
  34. my @noisePacket_imag;
  35. my $state = 0;
  36. # constants for channel_model
  37. use constant AWGN_VARIANCE => 0.003; # noise variance
  38. use constant AVERAGE_POWER => 0.333;
  39. use constant PI => 4 * atan2(1,1); 
  40. use constant CFO => 100000; # carrier frequency offset
  41. use constant TIME_STEP => 5e-8;
  42. $num = $#ARGV+1;
  43. if ($num < 4)
  44. {
  45.     print "4 arguments are needed: only $num given n 1st arg should be file prefix.n 2nd arg should be cyclic prefix sizen";
  46.     print "3rd arg should be integer precision.n 4th arg should be fractional precisionn";
  47.     exit 1;
  48. }
  49. my $prefix = $ARGV[0];
  50. my $cpSz   = $ARGV[1];
  51. my $iprec  = $ARGV[2];
  52. my $fprec  = $ARGV[3];
  53. # IO op
  54. $file = "$ARGV[0]Preambles.txt";
  55. open(INFO, $file);
  56. @lines = <INFO>;
  57. close(INFO);
  58. # arrays
  59. foreach $thisLine (@lines)
  60. {
  61.     if ($thisLine =~ /.*Preambles.*/)
  62.     {
  63. $state += 1;
  64.     }
  65.     elsif($state == 1)
  66.     {
  67. @temp = split(/, /,$thisLine);
  68. push(@sPreamble_real, $temp[0]);
  69. push(@sPreamble_imag, $temp[1]);
  70. $temp0 = $temp[0]*10000000;
  71. $temp1 = $temp[1]*10000000;
  72. push(@shortPreambles, "ttList::cons(cmplx(fromRational($temp0,10000000), fromRational($temp1,10000000)),n");
  73.     } 
  74.     elsif($state == 2)
  75.     {
  76. @temp = split(/, /,$thisLine);
  77. push(@lPreamble_real, $temp[0]);
  78. push(@lPreamble_imag, $temp[1]);
  79. $temp0 = $temp[0]*10000000;
  80. $temp1 = $temp[1]*10000000;
  81. $sign0 = ($temp0 < 0)?1:0;
  82. $sign1 = ($temp1 < 0)?1:0;
  83. push(@longPreambles, "ttList::cons(cmplx(fromRational($temp0,10000000), fromRational($temp1,10000000)),n");
  84. push(@longPreSigns, "ttList::cons(cmplx($sign0, $sign1),n");
  85.     } 
  86. }
  87. # symbol length
  88. $shortLength = @shortPreambles;
  89. $longLength = @longPreambles;
  90. $symbolLength = $shortLength + $cpSz;
  91. print "$symbolLength";
  92. for($i = $cpSz; $i > 0; $i--)
  93. {
  94.     push(@packet_real,$sPreamble_real[$shortLength-$i]);
  95.     push(@packet_imag,$sPreamble_imag[$shortLength-$i]);
  96. }
  97. for($i = 0; $i < $shortLength; $i++)
  98. {
  99.     push(@packet_real,$sPreamble_real[$i]);
  100.     push(@packet_imag,$sPreamble_imag[$i]);
  101. }
  102. for($i = $cpSz; $i > 0; $i--)
  103. {
  104.     push(@packet_real,$lPreamble_real[$longLength-$i]);
  105.     push(@packet_imag,$lPreamble_imag[$longLength-$i]);
  106. }
  107. for($i = 0; $i < $longLength; $i++)
  108. {
  109.     push(@packet_real,$lPreamble_real[$i]);
  110.     push(@packet_imag,$lPreamble_imag[$i]);
  111. }
  112. # channel_model
  113. for($i = @packet_real; $i < 1024 ; $i++)
  114. {
  115.     push(@packet_real,AVERAGE_POWER*(0.5-rand()));
  116.     push(@packet_imag,AVERAGE_POWER*(0.5-rand()));
  117. }
  118. $packetLength = @packet_real;
  119. for($i = 0; $i < $packetLength ; $i++)
  120. {
  121.     # rotation due to difference in oscillators of transmitter and receiver
  122.     $rotAng = $i % 1;
  123.     $rotation_real = cos(2*PI*CFO*$rotAng*TIME_STEP);
  124.     $rotation_imag = sin(2*PI*CFO*$rotAng*TIME_STEP);
  125.     $output_real = $rotation_real*$packet_real[$i]-$rotation_imag*$packet_imag[$i];
  126.     $output_imag = $rotation_real*$packet_imag[$i]+$rotation_imag*$packet_real[$i];
  127.     # noise
  128.     $x1 = rand(1);
  129.     $x2 = rand(1);
  130.     $output_real += AWGN_VARIANCE*sqrt(-2*log($x1))*cos(2*PI*$x2);
  131.     $output_imag += AWGN_VARIANCE*sqrt(-2*log($x1))*sin(2*PI*$x2);
  132.     push(@noisePacket_real, $output_real);
  133.     push(@noisePacket_imag, $output_imag);
  134. # output bluespec code
  135. $file = "$ARGV[0]Preambles.bsv";
  136. open(INFO, ">$file"); # open for output
  137. print INFO "import List::*;n";
  138. print INFO "import Vector::*;n";
  139. print INFO "import Complex::*;n";
  140. print INFO "import DataTypes::*;n";
  141. print INFO "import RegFile::*;n";
  142. print INFO "import FixedPoint::*;n";
  143. print INFO "import FPComplex::*;nn";
  144. print INFO "// function to generate short training sequencen";
  145. print INFO "function Vector#($shortLength, FPComplex#($ARGV[2],$ARGV[3])) getShortPreambles();n";
  146. print INFO "tVector#($shortLength, FPComplex#($ARGV[2],$ARGV[3])) tempV = Vector::toVector(n";
  147. print INFO @shortPreambles;
  148. print INFO "ttList::nil)";
  149. for ($i = 0; $i < $shortLength; $i++)
  150. {
  151.     print INFO ")";
  152. }
  153. print INFO ";n";
  154. print INFO "treturn tempV;n";
  155. print INFO "endfunctionnn";
  156. print INFO "// function to generate long training sequencen";
  157. print INFO "function Vector#($longLength, FPComplex#($ARGV[2],$ARGV[3])) getLongPreambles();n";
  158. print INFO "tVector#($longLength, FPComplex#($ARGV[2],$ARGV[3])) tempV = Vector::toVector(n";
  159. print INFO @longPreambles;
  160. print INFO "ttList::nil)";
  161. for ($i = 0; $i < $longLength; $i++)
  162. {
  163.     print INFO ")";
  164. }
  165. print INFO ";n";
  166. print INFO "treturn tempV;n";
  167. print INFO "endfunctionnn";
  168. print INFO "// function to generate long training sequence (signs only)n";
  169. print INFO "function Vector#($longLength, Complex#(Bit#(1))) getLongPreSigns();n";
  170. print INFO "tVector#($longLength, Complex#(Bit#(1))) tempV = Vector::toVector(n";
  171. print INFO @longPreSigns;
  172. print INFO "ttList::nil)";
  173. for ($i = 0; $i < $longLength; $i++)
  174. {
  175.     print INFO ")";
  176. }
  177. print INFO ";n";
  178. print INFO "treturn tempV;n";
  179. print INFO "endfunctionnn";
  180. $logn = ceil(log($packetLength)/log(2));
  181. $maxIndex = $packetLength - 1;
  182. print INFO "// module to generate sample packetn";
  183. print INFO "(* synthesize *)n";
  184. print INFO "module mkPacket(RegFile#(Bit#($logn), FPComplex#($ARGV[2],$ARGV[3])));n";
  185. print INFO "tRegFile#(Bit#($logn), FPComplex#($ARGV[2],$ARGV[3])) regFile <- mkRegFileLoad("$ARGV[0]Packet.txt",0,$maxIndex);n";
  186. print INFO "treturn regFile;n";
  187. print INFO "endmodulenn";
  188. print INFO "// module to generate sample packetn";
  189. print INFO "(* synthesize *)n";
  190. print INFO "module mkTweakedPacket(RegFile#(Bit#($logn), FPComplex#($ARGV[2],$ARGV[3])));n";
  191. print INFO "tRegFile#(Bit#($logn), FPComplex#($ARGV[2],$ARGV[3])) regFile <- mkRegFileLoad("$ARGV[0]TweakedPacket.txt",0,$maxIndex);n";
  192. print INFO "treturn regFile;n";
  193. print INFO "endmodulenn";
  194. close(INFO);
  195. # write regfile "$ARGV[0]Packet.txt" 
  196. $file = "$ARGV[0]Packet.txt";
  197. open(INFO, ">$file"); # open for output
  198. for ($i = 0 ; $i < $packetLength ; $i++)
  199. {
  200.     if ($packet_real[$i]>=0)
  201.     {
  202. print INFO sprintf("%.4x",floor($packet_real[$i]*(2**$ARGV[3])));
  203.     }
  204.     else
  205.     {
  206. print INFO sprintf("%.4x",floor($packet_real[$i]*(2**$ARGV[3])+(2**($ARGV[2]+$ARGV[3]))));
  207.     }
  208.     if ($packet_imag[$i]>=0)
  209.     {
  210. print INFO sprintf("%.4xn",floor($packet_imag[$i]*(2**$ARGV[3])));
  211.     }
  212.     else
  213.     {
  214. print INFO sprintf("%.4xn",floor($packet_imag[$i]*(2**$ARGV[3])+(2**($ARGV[2]+$ARGV[3]))));
  215.     }
  216. #    print "$packet_real[$i]";
  217. #    print ", $packet_imag[$i]n";
  218. }
  219. close(INFO);
  220. print "n";
  221. # write regfile "$ARGV[0]TweakedPacket.txt" 
  222. $file = "$ARGV[0]TweakedPacket.txt";
  223. open(INFO, ">$file"); # open for output
  224. for ($i = 0 ; $i < $packetLength ; $i++)
  225. {
  226.     if ($noisePacket_real[$i]>=0)
  227.     {
  228. print INFO sprintf("%.4x",floor($noisePacket_real[$i]*(2**$ARGV[3])));
  229.     }
  230.     else
  231.     {
  232. print INFO sprintf("%.4x",floor($noisePacket_real[$i]*(2**$ARGV[3])+(2**($ARGV[2]+$ARGV[3]))));
  233.     }
  234.     if ($noisePacket_imag[$i]>=0)
  235.     {
  236. print INFO sprintf("%.4xn",floor($noisePacket_imag[$i]*(2**$ARGV[3])));
  237.     }
  238.     else
  239.     {
  240. print INFO sprintf("%.4xn",floor($noisePacket_imag[$i]*(2**$ARGV[3])+(2**($ARGV[2]+$ARGV[3]))));
  241.     }
  242. #    print "$noisePacket_real[$i]";
  243. #    print ", $noisePacket_imag[$i]n";
  244. }
  245. close(INFO);