From: drowe67 Date: Wed, 6 Jan 2016 22:51:30 +0000 (+0000) Subject: timing est non-linearity modified to work with m>2 FSK, ideal BER=0.01 results at... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=93f29dbe594df934094e8008bbac4ac8c865d97d;p=freetel-svn-tracking.git timing est non-linearity modified to work with m>2 FSK, ideal BER=0.01 results at Eb/No=9dB git-svn-id: https://svn.code.sf.net/p/freetel/code@2610 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/fsk_horus.m b/codec2-dev/octave/fsk_horus.m index 5275260c..2c9fa413 100644 --- a/codec2-dev/octave/fsk_horus.m +++ b/codec2-dev/octave/fsk_horus.m @@ -256,14 +256,21 @@ function [rx_bits states] = fsk_horus_demod(states, sf) % http://www.rowetel.com/blog/?p=3573 % We have sampled the integrator output at Fs=P samples/symbol, so % lets do a single point DFT at w = 2*pi*f/Fs = 2*pi*Rs/(P*Rs) - + % + % Note timing non-lineariry derivedby experiment. Not quite sure what I'm doing here..... + % but it gives 0dB impl loss for 2FSK Eb/No=9dB, testmode 1: + % Fs: 8000 Rs: 50 Ts: 160 nsym: 50 + % frames: 200 Tbits: 9700 Terrs: 93 BER 0.010 + Np = length(f_int(1,:)); w = 2*pi*(Rs)/(P*Rs); - x = ((abs(f_int(1,:))-abs(f_int(2,:))).^2) * exp(-j*w*(0:Np-1))'; + timing_nl = sum(abs(f_int(:,:)).^2); + x = timing_nl * exp(-j*w*(0:Np-1))'; norm_rx_timing = angle(x)/(2*pi); rx_timing = norm_rx_timing*P; states.x = x; + states.timing_nl = timing_nl; states.rx_timing = rx_timing; prev_norm_rx_timing = states.norm_rx_timing; states.norm_rx_timing = norm_rx_timing; @@ -594,8 +601,8 @@ endfunction % simulation of tx and rx side, add noise, channel impairments ---------------------- function run_sim(test_frame_mode) - frames = 5; - EbNodB = 100; + frames = 200; + EbNodB = 9; timing_offset = 0.0; % see resample() for clock offset below fading = 0; % modulates tx power at 2Hz with 20dB fade depth, % to simulate balloon rotating at end of mission @@ -710,6 +717,7 @@ function run_sim(test_frame_mode) st = 1 + timing_offset_samples; rx_bits_buf = zeros(1,2*nsym); x_log = []; + timing_nl_log = []; norm_rx_timing_log = []; f1_int_resample_log = []; f2_int_resample_log = []; @@ -737,6 +745,7 @@ function run_sim(test_frame_mode) norm_rx_timing_log = [norm_rx_timing_log states.norm_rx_timing]; x_log = [x_log states.x]; + timing_nl_log = [timing_nl_log states.timing_nl]; f1_int_resample_log = [f1_int_resample_log abs(states.f_int_resample(1,:))]; f2_int_resample_log = [f2_int_resample_log abs(states.f_int_resample(2,:))]; f1_log = [f1_log states.f(1)]; @@ -773,6 +782,14 @@ function run_sim(test_frame_mode) axis([-m m -m m]) title('fine timing metric') + figure(7) + clf + subplot(211) + X = abs(fft(timing_nl_log)); + plot(X(1:length(X)/2)) + subplot(212) + plot(abs(timing_nl_log(1:100))) + figure(3) clf subplot(211)