assert((m == 4) || (m == 8));
phase_difference = zeros(Nc+1,1);
- phase_difference(1:Nc) = rx_symbols(1:Nc) .* conj(prev_rx_symbols(1:Nc)./(1E-6+abs(prev_rx_symbols(1:Nc))));
-
+ for c=1:Nc
+ norm = 1/(1E-6+abs(prev_rx_symbols(c)));
+ phase_difference(c) = prev_rx_symbols(c) .* conj(prev_rx_symbols(c)) * norm;
+ end
+
for c=1:Nc
% determine index of constellation point received 0,1,...,m-1
% Extract DBPSK encoded Sync bit
- phase_difference(Nc+1,1) = rx_symbols(Nc+1) .* conj(prev_rx_symbols(Nc+1)./(1E-6+abs(prev_rx_symbols(Nc+1))));
+ norm = 1/(1E-6+abs(prev_rx_symbols(Nc+1)));
+ phase_difference(Nc+1) = rx_symbols(Nc+1) * conj(prev_rx_symbols(Nc+1)) * norm;
if (real(phase_difference(Nc+1)) < 0)
sync_bit = 1;
f_err = imag(phase_difference(Nc+1));
end
% extra pi/4 rotation as we need for snr_update and scatter diagram
-
+
phase_difference *= exp(j*pi/4);
-
+
endfunction
rx_filt_log = [];
env_log = [];
rx_timing_log = [];
+phase_difference_log = [];
rx_symbols_log = [];
rx_bits_log = [];
sync_bit_log = [];
sig_est_log = [];
noise_est_log = [];
+% adjust this if the screen is getting a bit cluttered
+
+global no_plot_list;
+no_plot_list = [1 2 3 4 5 6 7 8 12];
+
for f=1:frames
% modulator
nin_log = [nin_log nin];
[rx_bits sync_bit foff_fine pd] = psk_to_bits(prev_rx_symbols, rx_symbols, 'dqpsk');
+ phase_difference_log = [phase_difference_log pd];
[sig_est noise_est] = snr_update(sig_est, noise_est, pd);
sig_est_log = [sig_est_log sig_est];
% Helper functions to plot output of C verson and difference between Octave and C versions
function stem_sig_and_error(plotnum, subplotnum, sig, error, titlestr, axisvec)
+ global no_plot_list;
+
+ if find(no_plot_list == plotnum)
+ return;
+ end
figure(plotnum)
subplot(subplotnum)
stem(sig,'g;C version;');
endfunction
function plot_sig_and_error(plotnum, subplotnum, sig, error, titlestr, axisvec)
+ global no_plot_list;
+
+ if find(no_plot_list == plotnum)
+ return;
+ end
+
figure(plotnum)
subplot(subplotnum)
plot(sig,'g;C version;');
plot_sig_and_error(12, 211, real(rx_filt_log(c,:)), real(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt real' )
plot_sig_and_error(12, 212, imag(rx_filt_log(c,:)), imag(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt imag' )
-st=1; en=3*Nt*P;
-plot_sig_and_error(13, 211, env_log(st:en), env_log(st:en) - env_log_c(st:en), 'env' )
-stem_sig_and_error(13, 212, real(rx_symbols_log(c,:)), real(rx_symbols_log(c,:) - rx_symbols_log_c(c,:)), 'rx symbols' )
-
-st=10*28;
-en = 12*28;
+st=1*28;
+en = 3*28;
plot_sig_and_error(14, 211, rx_timing_log, rx_timing_log - rx_timing_log_c, 'Rx Timing' )
stem_sig_and_error(14, 212, sync_bit_log_c, sync_bit_log - sync_bit_log_c, 'Sync bit', [1 n -1.5 1.5])
stem_sig_and_error(15, 211, rx_bits_log_c(st:en), rx_bits_log(st:en) - rx_bits_log_c(st:en), 'RX bits', [1 en-st -1.5 1.5])
stem_sig_and_error(15, 212, nin_log_c, nin_log - nin_log_c, 'nin')
-c = 1;
+c = 12;
plot_sig_and_error(16, 211, sig_est_log(c,:), sig_est_log(c,:) - sig_est_log_c(c,:), 'sig est for SNR' )
plot_sig_and_error(16, 212, noise_est_log(c,:), noise_est_log(c,:) - noise_est_log_c(c,:), 'noise est for SNR' )
+f=2;
+
+stem_sig_and_error(13, 211, real(rx_symbols_log(:,f)), real(rx_symbols_log(:,f) - rx_symbols_log_c(:,f)), 'rx symbols real' )
+stem_sig_and_error(13, 212, imag(rx_symbols_log(:,f)), imag(rx_symbols_log(:,f) - rx_symbols_log_c(:,f)), 'rx symbols imag' )
+
+stem_sig_and_error(17, 211, real(phase_difference_log(:,f)), real(phase_difference_log(:,f) - phase_difference_log_c(:,f)), 'phase difference real' )
+stem_sig_and_error(17, 212, imag(phase_difference_log(:,f)), imag(phase_difference_log(:,f) - phase_difference_log_c(:,f)), 'phase difference imag' )
+
% ---------------------------------------------------------------------------------------
% AUTOMATED CHECKS ------------------------------------------
% ---------------------------------------------------------------------------------------
static float cabsolute(COMP a)
{
- return sqrt(pow(a.real, 2.0) + pow(a.imag, 2.0));
+ return sqrt(a.real*a.real + a.imag*a.imag);
}
/*---------------------------------------------------------------------------*\
leads to sensible scatter plots */
for(c=0; c<Nc; c++) {
- norm = 1.0/(cabsolute(prev_rx_symbols[c])+1E-6);
- phase_difference[c] = cmult(cmult(rx_symbols[c], fcmult(norm,cconj(prev_rx_symbols[c]))), pi_on_4);
+ norm = 1.0/(1E-6 + cabsolute(prev_rx_symbols[c]));
+ prev_rx_symbols[c] = fcmult(norm, prev_rx_symbols[c]);
+ phase_difference[c] = cmult(prev_rx_symbols[c], cconj(prev_rx_symbols[c]));
+ phase_difference[c] = cmult(phase_difference[c],pi_on_4);
}
/* map (Nc,1) DQPSK symbols back into an (1,Nc*Nb) array of bits */
float env_log[NT*P*FRAMES];
float rx_timing_log[FRAMES];
COMP rx_symbols_log[FDMDV_NC+1][FRAMES];
+ COMP phase_difference_log[FDMDV_NC+1][FRAMES];
float sig_est_log[FDMDV_NC+1][FRAMES];
float noise_est_log[FDMDV_NC+1][FRAMES];
int rx_bits_log[FDMDV_BITS_PER_FRAME*FRAMES];
printf("sizeof FDMDV states: %d bytes\n", sizeof(struct FDMDV));
for(f=0; f<FRAMES; f++) {
-
+
/* --------------------------------------------------------*\
Modulator
\*---------------------------------------------------------*/
rx_filter(rx_filt, FDMDV_NC, rx_baseband, fdmdv->rx_filter_memory, nin);
rx_timing = rx_est_timing(rx_symbols, FDMDV_NC, rx_filt, rx_baseband, fdmdv->rx_filter_mem_timing, env, fdmdv->rx_baseband_mem_timing, nin);
foff_fine = qpsk_to_bits(rx_bits, &sync_bit, FDMDV_NC, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols, 0);
+ //for(i=0; i<FDMDV_NC;i++)
+ // printf("rx_symbols: %f %f prev_rx_symbols: %f %f phase_difference: %f %f\n", rx_symbols[i].real, rx_symbols[i].imag,
+ // fdmdv->prev_rx_symbols[i].real, fdmdv->prev_rx_symbols[i].imag, fdmdv->phase_difference[i].real, fdmdv->phase_difference[i].imag);
+ //if (f==1)
+ // exit(0);
snr_update(fdmdv->sig_est, fdmdv->noise_est, FDMDV_NC, fdmdv->phase_difference);
memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(FDMDV_NC+1));
tx_baseband_log[c][f*M+i] = tx_baseband[c][i];
memcpy(&tx_fdm_log[M*f], tx_fdm, sizeof(COMP)*M);
- /* freq offset estimation */
-
memcpy(&pilot_baseband1_log[f*NPILOTBASEBAND], fdmdv->pilot_baseband1, sizeof(COMP)*NPILOTBASEBAND);
memcpy(&pilot_baseband2_log[f*NPILOTBASEBAND], fdmdv->pilot_baseband2, sizeof(COMP)*NPILOTBASEBAND);
memcpy(&pilot_lpf1_log[f*NPILOTLPF], fdmdv->pilot_lpf1, sizeof(COMP)*NPILOTLPF);
memcpy(&env_log[NT*P*f], env, sizeof(float)*NT*P);
rx_timing_log[f] = rx_timing;
nin_log[f] = nin;
- for(c=0; c<FDMDV_NC+1; c++)
+ for(c=0; c<FDMDV_NC+1; c++) {
rx_symbols_log[c][f] = rx_symbols[c];
+ phase_difference_log[c][f] = fdmdv->phase_difference[c];
+ }
/* qpsk_to_bits() */
octave_save_float(fout, "env_log_c", env_log, 1, NT*P*FRAMES, NT*P*FRAMES);
octave_save_float(fout, "rx_timing_log_c", rx_timing_log, 1, FRAMES, FRAMES);
octave_save_complex(fout, "rx_symbols_log_c", (COMP*)rx_symbols_log, (FDMDV_NC+1), FRAMES, FRAMES);
+ octave_save_complex(fout, "phase_difference_log_c", (COMP*)phase_difference_log, (FDMDV_NC+1), FRAMES, FRAMES);
octave_save_float(fout, "sig_est_log_c", (float*)sig_est_log, (FDMDV_NC+1), FRAMES, FRAMES);
octave_save_float(fout, "noise_est_log_c", (float*)noise_est_log, (FDMDV_NC+1), FRAMES, FRAMES);
octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, FDMDV_BITS_PER_FRAME*FRAMES);