From: baobrien Date: Mon, 26 Oct 2015 03:34:25 +0000 (+0000) Subject: More work on FSK to be ported to C. Now has sample-loop demod X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=bb7f53354f2839b36be3d635361625b6dd830055;p=freetel-svn-tracking.git More work on FSK to be ported to C. Now has sample-loop demod git-svn-id: https://svn.code.sf.net/p/freetel/code@2476 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/fsk4.m b/codec2-dev/octave/fsk4.m index 78f35cff..9a4f3491 100644 --- a/codec2-dev/octave/fsk4.m +++ b/codec2-dev/octave/fsk4.m @@ -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); diff --git a/codec2-dev/octave/ya_fsk.m b/codec2-dev/octave/ya_fsk.m index 565f4e92..f22923b2 100644 --- a/codec2-dev/octave/ya_fsk.m +++ b/codec2-dev/octave/ya_fsk.m @@ -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