tested C mod OK
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 28 Feb 2013 04:05:21 +0000 (04:05 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 28 Feb 2013 04:05:21 +0000 (04:05 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1178 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fdmdv.m
codec2-dev/octave/fdmdv_demod.m
codec2-dev/octave/fdmdv_ut.m

index 65f4c5a0f14f65211ca71f0ba121b9f4c8186680..8af361de3a5ff36c8e54467e251a1fc1a4386490 100644 (file)
@@ -17,7 +17,8 @@ randn('state',1);
 
 global Fs = 8000;      % sample rate in Hz
 global T  = 1/Fs;      % sample period in seconds
-global Rs = 50;        % symbol rate in Hz
+global Rs;
+       Rs = 50;        % symbol rate in Hz
 global Nc;             % number of carriers
        Nc = 14;
 global Nb;
@@ -26,7 +27,8 @@ global Rb;
        Rb = Nc*Rs*Nb;  % bit rate
 global M  = Fs/Rs;     % oversampling factor
 global Nsym  = 6;      % number of symbols to filter over
-global Fsep  = 75;     % Separation between carriers (Hz)
+global Fsep;
+       Fsep = 75;      % Separation between carriers (Hz)
 global Fcentre = 1500; % Centre frequency, Nc/2 carriers below this, N/c carriers above (Hz)
 global Nt = 5;         % number of symbols we estimate timing over
 global P = 4;          % oversample factor used for rx symbol filtering
@@ -990,9 +992,10 @@ freq(Nc+1) = exp(j*2*pi*Fcentre/Fs);
 % takes care of that.
 
 global phase_tx;
-%phase_tx = ones(Nc+1,1);
+phase_tx = ones(Nc+1,1);
 phase_tx = exp(j*2*pi*(0:Nc)/(Nc+1));
-%phase_tx(1) *= 10 .^ (-6/20);
+%phase_tx = exp(j*2*pi*(0:Nc)/4);
+%phase_tx(Nc+1) = -1;
 global phase_rx;
 phase_rx = ones(Nc+1,1);
 
index 94c16900f461049bc8cfc74dfd616b7e75ec7647..0675285b5768881eec7bcd288ff9980cc277fef0 100644 (file)
@@ -116,7 +116,7 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename)
     else
       rx_symbols_log = [rx_symbols_log rx_symbols];
     endif
-    [rx_bits sync f_err pd] = qpsk_to_bits(prev_rx_symbols, rx_symbols, modulation);
+    [rx_bits sync f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation);
     [sig_est noise_est] = snr_update(sig_est, noise_est, pd);
     snr_est = calc_snr(sig_est, noise_est);
     snr_est_log = [snr_est_log snr_est];
@@ -170,8 +170,13 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename)
   % Print Stats
   % ---------------------------------------------------------------------
 
+  % Peak to Average Power Ratio calcs from http://www.dsplog.com
+
+  papr = max(rx_fdm_log.*conj(rx_fdm_log)) / mean(rx_fdm_log.*conj(rx_fdm_log));
+  papr_dB = 10*log10(papr);
+
   ber = total_bit_errors / total_bits;
-  printf("%d bits  %d errors  BER: %1.4f\n",total_bits, total_bit_errors, ber);
+  printf("%d bits  %d errors  BER: %1.4f PAPR(rx): %1.2f dB\n",total_bits, total_bit_errors, ber, papr_dB);
 
   % ---------------------------------------------------------------------
   % Plots
@@ -232,12 +237,14 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename)
   clf;
   hold on;
   lep = length(error_pattern_log);
-  for p=1:Nc
-    plot(p + 0.25*error_pattern_log((p-1)*2+1:Nc*Nb:lep));
-    plot(0.30 + p + 0.25*error_pattern_log(p*2:Nc*Nb:lep),'r')
+  if lep != 0 
+    for p=1:Nc
+      plot(p + 0.25*error_pattern_log((p-1)*2+1:Nc*Nb:lep));
+      plot(0.30 + p + 0.25*error_pattern_log(p*2:Nc*Nb:lep),'r')
+    end
+    hold off;
+    axis([1 lep/(Nc*Nb) 0 15])
   end
-  hold off;
-  axis([1 lep/(Nc*Nb) 0 15])
 
   figure(7)
   clf;
@@ -252,6 +259,7 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename)
   grid
   title('FDM Rx Spectrum');
 
+if 0
   % interleaving tests
 
   load ../unittest/inter560.txt
@@ -275,12 +283,13 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename)
   end
   hold off;
   axis([1 lep/(Nc*Nb) 0 15])
+end
 
   % save error pattern file
 
   if nargin == 3
     fout = fopen(errorpatternfilename, "wb");
-    fwrite(fout, error_pattern_log_inter, "short");
+    fwrite(fout, error_pattern_log, "short");
     fclose(fout);
   end
 
index 274d1ba969c96073657af88bc5b495bae53cb405..6021c77c73c89db9a122ee0153591492cfae3bc6 100644 (file)
@@ -12,7 +12,7 @@ fdmdv;               % load modem code
  
 % Simulation Parameters --------------------------------------
 
-frames = 50;
+frames = 100;
 EbNo_dB = 7.3;
 Foff_hz = 0;
 modulation = 'dqpsk';
@@ -65,8 +65,8 @@ C = 1; % power of each FDM carrier (energy/sample).  Total Carrier power should
 N = 1; % total noise power (energy/sample) of noise source across entire bandwidth
 
 % Eb  = Carrier power * symbol time / (bits/symbol)
-%     = C *(1/Rs) / 2
-Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(2);
+%     = C *(1/Rs) / Nb
+Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(Nb);
 
 No_dBHz = Eb_dB - EbNo_dB;
 
@@ -182,7 +182,7 @@ for f=1:frames
   end
   foff_log = [ foff_log foff ];
   foff_rect = exp(j*2*pi*foff/Fs);
-
+  
   for i=1:M
     foff_phase *= foff_rect';
     rx_fdm_delay(i) = rx_fdm_delay(i)*foff_phase;
@@ -269,12 +269,16 @@ ber = total_bit_errors / total_bits;
 papr = max(tx_fdm_log.*conj(tx_fdm_log)) / mean(tx_fdm_log.*conj(tx_fdm_log));
 papr_dB = 10*log10(papr);
 
-% Note Eb/No set point is for Nc data carriers only, exclduing pilot.
-% This is convenient for testing BER versus Eb/No.  Measured Eb/No
-% includes power of pilot.  Similar for SNR, first number is SNR excluding
-% pilot pwr for Eb/No set point, 2nd value is measured SNR which will be a little
-% higher as pilot power is included.
+% Note Eb/No set point is for Nc data carriers only, excluding pilot.
+% This is convenient for testing BER versus Eb/No.  Measured SNR &
+% Eb/No includes power of pilot.  Similar for SNR, first number is SNR
+% excluding pilot pwr for Eb/No set point, 2nd value is measured SNR
+% which will be a little higher as pilot power is included. Note current SNR
+% est algorithm only works for QPSK, gives silly values for 8PSK.
 
+printf("Bits/symbol.: %d\n", Nb);
+printf("Num carriers: %d\n", Nc);
+printf("Bit Rate....: %d bits/s\n", Rb);
 printf("Eb/No (meas): %2.2f (%2.2f) dB\n", EbNo_dB, 10*log10(0.25*tx_pwr*Fs/(Rs*Nc*noise_pwr)));
 printf("bits........: %d\n", total_bits);
 printf("errors......: %d\n", total_bit_errors);
@@ -308,8 +312,8 @@ title('Freq offset (Hz)');
 figure(3)
 clf;
 subplot(211)
-plot(real(rx_fdm_log));
-title('FDM Rx Signal');
+plot(real(tx_fdm_log));
+title('FDM Tx Signal');
 subplot(212)
 plot((0:Nspec/2-1)*Fs/Nspec, SdB(1:Nspec/2) - 20*log10(Nspec/2))
 axis([0 Fs/2 -40 0])