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
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
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);
% [ ] - Some stuff to verify the C port
%clear all;
+graphics_toolkit('gnuplot');
fm
%Basic parameters for a simple FSK modem
%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;
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