More work on FSK to be ported to C. Now has sample-loop demod
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 26 Oct 2015 03:34:25 +0000 (03:34 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 26 Oct 2015 03:34:25 +0000 (03:34 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2476 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fsk4.m
codec2-dev/octave/ya_fsk.m

index 78f35cffad428d94a7ccf223ca560088fc9a1215..9a4f3491fb36d94b8c18537a5a5095ed1d294267 100644 (file)
@@ -149,6 +149,7 @@ function bits = fsk4_demod_thing(fsk4_states, rx)
 endfunction
 
 function dat = bitreps(in,M)
+  dat = zeros(1,length(in)*M);
   for i=1:length(in)
     dat(1+(i-1)*M:i*M) = in(i);
   end
@@ -163,7 +164,7 @@ function syms = mrd4(bits)
   lastsym=0;
   for n = (1:length(bits))
     bit = bits(n);
-    sp = [1 3](bit); %Map a bit to a +1 or +3
+    sp = [1 3](bit+1); %Map a bit to a +1 or +3
     [x,v] = min(abs([rd+sp rd-sp])); %Select +n or -n, whichever minimizes disparity
     ssel = [sp -sp](v);
     if(ssel == lastsym)ssel = -ssel;endif %never run 2 of the same syms in a row
@@ -173,6 +174,17 @@ function syms = mrd4(bits)
   end
 endfunction
 
+% "Manchester 4" encoding
+function syms = mane4(bits)
+    syms = zeros(1,floor(bits/2)*2);
+    for n = (1:2:length(bits))
+      bit0 = bits(n);
+      bit1 = bits(n+1);
+      sel = 2*bit0+bit1+1;
+      syms(n:n+1) = [[3 -3];[-3 3];[1 -1];[-1 1]]( sel,(1:2) );
+    end
+endfunction
+
 function out = fold_sum(in,l)
   sublen = floor(length(in)/l);
   out = zeros(1,l);
index 565f4e921be8c43a3ab63a814481c90e0d7fbdde..f22923b23e1b670f9ad754fbcdc033dfa5a0f8fb 100644 (file)
@@ -15,6 +15,7 @@
 % [ ] - Some stuff to verify the C port
 
 %clear all;
+graphics_toolkit('gnuplot');
 fm
 
 %Basic parameters for a simple FSK modem
@@ -41,9 +42,14 @@ function states = yafsk_init(fsk_config)
   %Symbol frequencies. Fixed to intervals of Fsym.
   states.fsyms = [-(Fsym/2) (Fsym/2)];
   states.tx_phase = 0;
+
+  states.dc = zeros(1,nfsk);
+  states.rx_phi = ones(1,nfsk);
+  states.isamp = 0;
+  states.sums = zeros(1,nfsk);
 endfunction
 
-function tx = yafsk_mod(states,bits)
+function [tx states] = yafsk_mod(states,bits)
   Ts = states.Ts;
   Fs = states.Fs;
   fsyms = states.fsyms;
@@ -54,23 +60,99 @@ function tx = yafsk_mod(states,bits)
   
   for ii = (1:length(syms))
     cur_sym_f = fsyms(syms(ii));
+    tx_phase_i = tx_phase;
     for jj = (1:Ts)
-        tx_phase = tx_phase + jj*2*pi*cur_sym_f/Fs;
-        tx(ii+jj) = exp(j*tx_phase)
+        tx_phase_i = tx_phase + jj*2*pi*cur_sym_f/Fs;
+        tx((ii-1)*Ts+jj) = exp(j*tx_phase_i);   
     end
-
-    %Correct phase
-    if(tx_phase > 2*pi)
-        tx_phase = tx_phase - 2*pi;
-    elseif(tx_phase < -2*pi);
-        tx_phase = tx_phase + 2*pi
+    tx_phase = tx_phase + Ts*2*pi*cur_sym_f/Fs;
+    if tx_phase>2*pi
+        tx_phase = tx_phase-2*pi;
+    elseif tx_phase<-2*pi
+        tx_phase = tx_phase+2*pi;
     endif
+    %tx_phase_vec = tx_phase + (1:Ts)*2*pi*cur_sym_f/Fs;
+    %tx((ii-1)*Ts+1:ii*Ts) = exp(j*tx_phase_vec);
   end
   states.tx_phase = tx_phase;
 endfunction
 
-function bits = yafsk_demod(states,stream)
+function d = idmp(data, M)
+    d = zeros(1,length(data)/M);
+    for i = 1:length(d)
+      d(i) = sum(data(1+(i-1)*M:i*M));
+    end
+endfunction
+
+function [bits states] = yafsk_demod_2a(states,rx)
+  fine_timing = 1;
+  Fs = states.Fs;
+  Rs = states.Rs;
+  Ts = states.Ts;
+  nfsk = states.nfsk;
+
+  phy_f1 = states.rx_phi(1);
+  phy_f2 = states.rx_phi(2);
+
+  dphase_f1 = exp(states.fsyms(1)*-j*2*pi/Fs);
+  dphase_f2 = exp(states.fsyms(2)*-j*2*pi/Fs);
+
+  sum_f1 = states.sums(1);
+  sum_f2 = states.sums(2);
+
+  isamp = states.isamp;
+  symcnt = 1;
+  syms = [0];
+  sums1 = [0];
+  sums2 = [0];
+  isamp = 1;
+  for ii = (1:length(rx))
+    phy_f1 *= dphase_f1;   %Spin the oscillators
+    phy_f2 *= dphase_f2;
+
+    dcs_f1 = rx(ii)*phy_f1; %Figure out the DC
+    dcs_f2 = rx(ii)*phy_f2;
+
+    sum_f1 += dcs_f1; %Integrate
+    sum_f2 += dcs_f2;
+
+    isamp += 1;
+    if isamp==Ts %If it's time to take a sample and spit out a symbol..
+        syms(symcnt) = (abs(sum_f1)>abs(sum_f2))+1; %Spit out a symbol
+        symcnt += 1;
+
+        %sums1(symcnt) = abs(sum_f1);
+       %sums2(symcnt) = abs(sum_f2);
+
+        sum_f1 = 0;   %Reset integrators
+        sum_f2 = 0;
+        isamp = 0;    %Reset integrator count
+    endif
+  end
+  plot((1:length(sums1)),sums1,(1:length(sums2)),sums2);
+
+  bits = states.config.rxmap(syms);
+endfunction
+function [bits states] = yafsk_demod_2(states,rx)
+  fine_timing = 1;
+  Fs = states.Fs;
+  Rs = states.Rs;
+  Ts = states.Ts;
+  nfsk = states.nfsk;
+
+  rx = rx(fine_timing:length(rx));
+  sym_phases = (1:length(rx)).*rot90(states.fsyms)*2*pi/Fs;
+
+  sym_mixers = exp(-j*sym_phases);
+  rx_mixd = repmat(rx,nfsk,1).*sym_mixers;
   
+  dc1 = abs(idmp(rx_mixd(1,1:length(rx_mixd)),Ts));
+  dc2 = abs(idmp(rx_mixd(2,1:length(rx_mixd)),Ts));
+
+  t=(1:length(dc1));
+  
+  plot(t,dc1,t,dc2)
+
 endfunction