fixed phase discontnuity in simulated fsk tx
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 15 Oct 2015 03:32:43 +0000 (03:32 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 15 Oct 2015 03:32:43 +0000 (03:32 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2443 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/crc16.m [new file with mode: 0644]
codec2-dev/octave/fsk_horus.m
codec2-dev/octave/fsk_horus_stream.m

diff --git a/codec2-dev/octave/crc16.m b/codec2-dev/octave/crc16.m
new file mode 100644 (file)
index 0000000..aafc432
--- /dev/null
@@ -0,0 +1,55 @@
+% crc16.m\r
+%\r
+%The CRC calculation is based on following generator polynomial:\r
+%G(x) = x16 + x12 + x5 + 1\r
+%\r
+%The register initial value of the implementation is: 0xFFFF\r
+%\r
+%used data = string -> 1 2 3 4 5 6 7 8 9\r
+%\r
+% Online calculator to check the script:\r
+%http://www.lammertbies.nl/comm/info/crc-calculation.html\r
+%\r
+%\r
+\r
+function crc = crc16(data)\r
+\r
+  % crc look up table\r
+\r
+  Crc_ui16LookupTable=[0,4129,8258,12387,16516,20645,24774,28903,33032,37161,41290,45419,49548,...\r
+    53677,57806,61935,4657,528,12915,8786,21173,17044,29431,25302,37689,33560,45947,41818,54205,...\r
+    50076,62463,58334,9314,13379,1056,5121,25830,29895,17572,21637,42346,46411,34088,38153,58862,...\r
+    62927,50604,54669,13907,9842,5649,1584,30423,26358,22165,18100,46939,42874,38681,34616,63455,...\r
+    59390,55197,51132,18628,22757,26758,30887,2112,6241,10242,14371,51660,55789,59790,63919,35144,...\r
+    39273,43274,47403,23285,19156,31415,27286,6769,2640,14899,10770,56317,52188,64447,60318,39801,...\r
+    35672,47931,43802,27814,31879,19684,23749,11298,15363,3168,7233,60846,64911,52716,56781,44330,...\r
+    48395,36200,40265,32407,28342,24277,20212,15891,11826,7761,3696,65439,61374,57309,53244,48923,...\r
+    44858,40793,36728,37256,33193,45514,41451,53516,49453,61774,57711,4224,161,12482,8419,20484,...\r
+    16421,28742,24679,33721,37784,41979,46042,49981,54044,58239,62302,689,4752,8947,13010,16949,...\r
+    21012,25207,29270,46570,42443,38312,34185,62830,58703,54572,50445,13538,9411,5280,1153,29798,...\r
+    25671,21540,17413,42971,47098,34713,38840,59231,63358,50973,55100,9939,14066,1681,5808,26199,...\r
+    30326,17941,22068,55628,51565,63758,59695,39368,35305,47498,43435,22596,18533,30726,26663,6336,...\r
+    2273,14466,10403,52093,56156,60223,64286,35833,39896,43963,48026,19061,23124,27191,31254,2801,6864,...\r
+    10931,14994,64814,60687,56684,52557,48554,44427,40424,36297,31782,27655,23652,19525,15522,11395,...\r
+    7392,3265,61215,65342,53085,57212,44955,49082,36825,40952,28183,32310,20053,24180,11923,16050,3793,7920];\r
+\r
+  ui16RetCRC16 = hex2dec('FFFF');\r
+  for I=1:length(data)\r
+    ui8LookupTableIndex = bitxor(data(I),uint8(bitshift(ui16RetCRC16,-8)));\r
+    ui16RetCRC16 = bitxor(Crc_ui16LookupTable(double(ui8LookupTableIndex)+1),mod(bitshift(ui16RetCRC16,8),65536));\r
+  end\r
+  crc=dec2hex(ui16RetCRC16);\r
+\r
+endfunction\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
index 1d9ec521307a760aa4a5f1dc2b8131c6cd138ffc..3ca303fe612aadb8a09fc45903538766c40bacb1 100644 (file)
@@ -302,22 +302,41 @@ endfunction
 
 % Extract ASCII string from a Horus frame of bits
 
-function str = extract_ascii(states, rx_bits_buf, uw_loc1, uw_loc2)
+function [str crc_ok] = extract_ascii(states, rx_bits_buf, uw_loc1, uw_loc2)
   nfield = states.nfield;
   npad = states.npad;
 
-  str = [];
+  str = []; str_dec = []; nstr = 0;
   st = uw_loc1 + length(states.uw);  % first bit of first char
   for i=st:nfield+npad:uw_loc2
     field = rx_bits_buf(i:i+nfield-1);
     ch_dec = field * (2.^(0:nfield-1))';
-    
+
     % filter out unlikely characters that bit errors may introduce, and ignore \n
+
     if (ch_dec > 31) && (ch_dec < 91)
       str = [str char(ch_dec)];
     else 
       str = [str char(32)]; % space is "not sure"
     end
+    nstr++;
+
+    % build up array for CRC16 check
+
+    if ch_dec == 42
+      rx_crc = crc16(str_dec);
+      ptx_crc = nstr+1;
+    else
+      str_dec = [str_dec ch_dec];
+    end
+  end
+  tx_crc = str(ptx_crc:ptx_crc+3);
+  crc_ok = strcmp(tx_crc, rx_crc);
+  str = str(1:ptx_crc-2);
+  if crc_ok
+    str = sprintf("%s CRC OK", str);
+  else
+    str = sprintf("%s CRC BAD", str);
   end
 endfunction
 
@@ -367,7 +386,7 @@ function run_sim
   test_frame_mode = 4;
   fading = 1;          % modulates tx power at 2Hz with 20dB fade depth, 
                        % to simulate balloon rotating at end of mission
-  df     = 1;          % tx tone freq drift in Hz/s
+  df     = 0;          % tx tone freq drift in Hz/s
 
   more off
   rand('state',1); 
@@ -637,9 +656,11 @@ endfunction
 
 % run test functions from here during development
 
-run_sim
-%rx_bits = demod_file("~/Desktop/vk5arg-3-1.wav");
-%rx_bits = demod_file("~/Desktop/fsk_horus_10dB_1000ppm.wav");
-%rx_bits = demod_file("~/Desktop/fsk_horus_6dB_0ppm.wav");
-%rx_bits = demod_file("fsk_horus_rx.raw");
-%rx_bits = demod_file("~/Desktop/fsk_horus_20dB_0ppm_20dBfade.wav");
+if exist("fsk_horus_as_a_lib") == 0
+  run_sim
+  %rx_bits = demod_file("~/Desktop/vk5arg-3-1.wav");
+  %rx_bits = demod_file("~/Desktop/fsk_horus_10dB_1000ppm.wav");
+  %rx_bits = demod_file("~/Desktop/fsk_horus_6dB_0ppm.wav");
+  %rx_bits = demod_file("fsk_horus_rx.raw");
+  %rx_bits = demod_file("~/Desktop/fsk_horus_20dB_0ppm_20dBfade.wav");
+end
index 9cf07fe034634a86ef74a926b23b65619e2c73c7..5355d32d3a2323c54c3ebfc38a935fe48902c8de 100644 (file)
 %  $ cat ~/Desktop/vk5arg-3.wav | ./fsk_horus_stream.m
 %
 
-fsk_horus;  % include library (make sure calls to functions at bottom are commented out)
+% include library (make sure calls to test functions at bottom are disabled)
+
+fsk_horus_as_a_lib = 1;
+fsk_horus;  
 
 more off;
 states = fsk_horus_init();