# Set default C++ flags.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g -O2")
# -fPIC is implied on MinGW...
if(NOT WIN32)
max_corr = 0;
for f_fine=-20:0.25:20
+% for f_fine=-1:0.25:1
f_fine_rect = exp(-j*f_fine*2*pi*sampling_points/Rs)'; % note: this could be pre-computed at init or compile time
for t=0:cohpsk.Nsymbrowpilot-1
corr = 0; mag = 0;
end
corr += abs(acorr);
end
- %printf(" f: %f t: %d corr: %f mag: %f\n", f_fine, t, corr, mag);
+ %printf(" f: %f t: %d corr: %f mag: %f ratio: %f\n", f_fine, t, corr, mag, corr/mag);
if corr >= max_corr
max_corr = corr;
max_mag = mag;
if strcmp(test, 'awgn')
frames = 100;
- foff = 0;
- dfoff = -0/Fs;
+ foff = 58.7;
+ dfoff = -0.5/Fs;
EsNodB = 8;
fading_en = 0;
hf_delay_ms = 2;
if strcmp(test, 'fading');
frames = 100;
- foff = -10.5;
- dfoff = 0.0/Fs;
- EsNodB = 9;
+ foff = -25;
+ dfoff = 0.5/Fs;
+ EsNodB = 12;
fading_en = 1;
hf_delay_ms = 2;
compare_with_c = 0;
Nd = 2; % diveristy factor
framesize = 56; % number of payload data bits in the frame
-Nsw = 3; % frames we demod for initial sync window
+Nsw = 4; % frames we demod for initial sync window
afdmdv.Nsym = 6; % size of tx/tx root nyquist filter in symbols
afdmdv.Nt = 5; % number of symbols we estimate timing over
%printf("tin: %f tout: %f f: %f\n", tin, tout, f);
end
ch_fdm_frame_log = ch_fdm_frame_log_out(1:tout-1);
+%ch_fdm_frame_log *= 5000;
%ch_fdm_frame_log = real(ch_fdm_frame_log);
% Now run demod ----------------------------------------------------------------
+%ch_fdm_frame_log = load_raw("~/fdmdv2-dev/build_linux/tmp.raw");
+%ch_fdm_frame_log = ch_fdm_frame_log(M:length(ch_fdm_frame_log));
+%ch_fdm_frame_log /= 5000;
+
+%frames = floor(acohpsk.Nsymbrowpilot*M);
+
ch_fdm_frame_log_index = 1;
nin = M;
f = 0;
max_ratio = 0;
for acohpsk.f_est = Fcentre-40:40:Fcentre+40
+% for acohpsk.f_est = Fcentre
printf(" [%d] acohpsk.f_est: %f +/- 20\n", f, acohpsk.f_est);
end
plot(combined*exp(j*pi/4)/sqrt(Nd),'+')
title('Scatter');
- axis([-2 2 -2 2])
+ ymax = abs(max(max(combined)));
+ axis([-ymax ymax -ymax ymax])
figure(4)
clf;
void cohpsk_get_test_bits(struct COHPSK *coh, int rx_bits[]);
void cohpsk_put_test_bits(struct COHPSK *coh, int *state, short error_pattern[],
int *bit_errors, float rx_bits_sd[]);
+void cohpsk_set_frame(struct COHPSK *coh, int frame);
#endif
coh->ch_fdm_frame_buf[i] = rx_fdm[j];
//printf("i: %d j: %d rx_fdm[0]: %f %f\n", i,j, rx_fdm[0].real, rx_fdm[0].imag);
- /* if out of sync do Initial Freq offset estimation using NSW frames to flush out filter memories */
+ /* if out of sync do Initial Freq offset estimation using NSW frames to flush out filter memories */
if (sync == 0) {
}
coh->nin = nin;
*nin_frame = (NSYMROWPILOT-1)*COHPSK_M + nin;
- //printf("%f %d %d\n", coh->rx_timing, nin, *nin_frame);
+ //if (coh->verbose)
+ // fprintf(stderr, "%f %d %d\n", coh->rx_timing, nin, *nin_frame);
}
}
+void cohpsk_set_frame(struct COHPSK *coh, int frame)
+{
+ assert(coh != NULL);
+ coh->frame = frame;
+}
+
+
/*---------------------------------------------------------------------------*\
FUNCTION....: cohpsk_get_test_bits()
}
cohpsk = cohpsk_create();
+ cohpsk_set_verbose(cohpsk, 1);
if (oct) {
logframes = LOG_FRAMES;
nin_frame = COHPSK_NOM_SAMPLES_PER_FRAME;
while(fread(rx_fdm_scaled, sizeof(short), nin_frame, fin) == nin_frame) {
frames++;
+ cohpsk_set_frame(cohpsk, frames);
/* scale and demod */
#define NCT_SYMB_BUF (2*NSYMROWPILOT+2)
#define ND 2 /* diversity factor ND 1 is no diveristy, ND we have orginal plus
one copy */
-#define NSW 3 /* number of sync window frames */
+#define NSW 4 /* number of sync window frames */
#define COHPSK_ND 2 /* diversity factor */
#define COHPSK_M 100 /* oversampling rate */
#define COHPSK_NSYM 6
nout = f->n_speech_samples;
//fprintf(stderr, "%d %d %d\n", f->n_speech_samples, speech_out[0], speech_out[nin_prev-1]);
}
+
}
-
+
return nout;
}
}
freedv = freedv_open(mode);
- if (mode == FREEDV_MODE_700)
- cohpsk_set_verbose(freedv->cohpsk, 1);
assert(freedv != NULL);
+ if (mode == FREEDV_MODE_700)
+ cohpsk_set_verbose(freedv->cohpsk, 0);
if ( (argc > 4) && (strcmp(argv[4], "--testframes") == 0) ) {
freedv->test_frames = 1;
nin = freedv_nin(freedv);
while(fread(demod_in, sizeof(short), nin, fin) == nin) {
+ frame++;
+ cohpsk_set_frame(freedv->cohpsk, frame);
+
nout = freedv_rx(freedv, speech_out, demod_in);
- fwrite(speech_out, sizeof(short), nout, fout);
nin = freedv_nin(freedv);
+ fwrite(speech_out, sizeof(short), nout, fout);
if (freedv->mode == FREEDV_MODE_1600)
fdmdv_get_demod_stats(freedv->fdmdv, &freedv->stats);
if (freedv->mode == FREEDV_MODE_700)
cohpsk_get_demod_stats(freedv->cohpsk, &freedv->stats);
-
- /* log some side info to the txt file */
- frame++;
- /*
+ /* log some side info to the txt file */
+ /*
if (ftxt != NULL) {
fprintf(ftxt, "frame: %d demod sync: %d demod snr: %3.2f dB bit errors: %d\n", frame,
freedv->stats.sync, freedv->stats.snr_est, freedv->total_bit_errors);
coh = cohpsk_create();
fdmdv = coh->fdmdv;
assert(coh != NULL);
+ cohpsk_set_verbose(coh, 1);
/* these puppies are used for logging data in the bowels on the modem */
Channel
\*---------------------------------------------------------*/
-
for(r=0; r<NSYMROWPILOT*COHPSK_M; r++) {
foff_rect.real = cos(2.0*M_PI*foff/COHPSK_FS); foff_rect.imag = sin(2.0*M_PI*foff/COHPSK_FS);
foff += DFOFF;
ch_fdm_frame[r] = cadd(ch_fdm_frame[r], scaled_noise);
}
+ /* optional gain to test level sensitivity */
+
+ for(r=0; r<NSYMROWPILOT*COHPSK_M; r++) {
+ ch_fdm_frame[r] = fcmult(1.0, ch_fdm_frame[r]);
+ }
+
/* tx vector logging */
memcpy(&tx_bits_log[COHPSK_BITS_PER_FRAME*f], tx_bits, sizeof(int)*COHPSK_BITS_PER_FRAME);