%If rx timing is too far out, ask for more or less sample the next time
% around to even it all out
next_nin = N;
- if norm_rx_timing > 0;
+ if norm_rx_timing > -.2;
next_nin += Ts/2;
end
- if norm_rx_timing < -.8;
+ if norm_rx_timing < -.65;
next_nin -= Ts/2;
end
tx = tx(10:length(tx));
if(timing_offset>0)
- tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset
+ tx = resample(tx, 1000,1001); % simulated 1000ppm sample clock offset
end
tx = analog_fm_mod(fm_states, tx_pmod);
if(timing_offset>0)
- tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset
+ tx = resample(tx, 2000, 1999); % simulated 1000ppm sample clock offset
end
%Add frequency drift
rx_bits = obits;
ber = 1;
ox = 1;
- for offset = (1:100)
+ for offset = (1:400)
nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset)));
bern = nerr/(bitcnt-offset);
if(bern < ber)
ber = 1;
rx_bits = cbits;
ox = 1;
- for offset = (1:100)
+ for offset = (1:400)
nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset)));
bern = nerr/(bitcnt-offset);
if(bern < ber)
end
offset = ox;
berc = ber;
+
+ printf("C BER %f in test %s\n",berc,test_name);
+ printf("Oct BER %f in test %s\n",bero,test_name);
+
stats.berc = berc;
stats.bero = bero;
end
endfunction
-function plot_fsk_bers(M=2)
+function plot_fmfsk_bers(M=2)
%Range of EbNodB over which to test
ebnodbrange = (8:14);
ebnodbs = length(ebnodbrange);
%Replication of other parameters for parcellfun
+ %Turn on all of the impairments
timingv = repmat(1 ,1,ebnodbs);
driftv = repmat(1 ,1,ebnodbs);
hpfv = repmat(1 ,1,ebnodbs);
deempv = repmat(1 ,1,ebnodbs);
outfv = repmat(1 ,1,ebnodbs);
- statv = pararrayfun(nproc(),@tfmfsk_run_sim,ebnodbrange,timingv,deempv,outfv,hpfv,driftv);
+ statv = pararrayfun(nproc(),@tfmfsk_run_sim,ebnodbrange,timingv,deempv,outfv,hpfv,driftv);
%statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
for ii = (1:length(statv))
endfunction
-%test_fsk_battery
-%plot_fsk_bers(2)
-%plot_fsk_bers(4)
+test_fmfsk_battery
+plot_fmfsk_bers(2)
end
end
- close all
+ %close all
% One part-per-thousand allowed on important parameters
pass = 1;
% This throws some channel imparment or another at the C and octave modem so they
% may be compared.
function stats = tfsk_run_sim(test_frame_mode,EbNodB,timing_offset,fading,df,dA,M=2)
- frames = 60;
+ frames = 90;
%EbNodB = 10;
%timing_offset = 2.0; % see resample() for clock offset below
%fading = 0; % modulates tx power at 2Hz with 20dB fade depth,
Mv = repmat(M,1,ebnodbs);
- %statv = pararrayfun(floor(.5*nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
- statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
+ statv = pararrayfun(floor(nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
+ %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
for ii = (1:length(statv))
stat = statv(ii);
endfunction
-%test_fsk_battery
-%plot_fsk_bers(2)
-%plot_fsk_bers(4)
+test_fsk_battery
+plot_fsk_bers(2)
+plot_fsk_bers(4)
/* Request fewer or greater samples next time, if fine timing is far
* enough off. This also makes it possible to tolerate clock offsets */
next_nin = N;
- if(norm_rx_timing > 0)
+ if(norm_rx_timing > -.2)
next_nin += Ts/2;
- if(norm_rx_timing < -.8)
+ if(norm_rx_timing < -.65)
next_nin -= Ts/2;
fmfsk->nin = next_nin;
for(k=0; k<fmfsk->stats->neyetr; k++)
for(j=0; j<neyesamp; j++)
fmfsk->stats->rx_eye[k][j] = rx_filt[k*neyesamp+neyeoffset+j];
-
+ //fmfsk->stats->rx_eye[k][j] = fmfsk_in[k*neyesamp+neyeoffset+j];
eye_max = 0;
/* Normalize eye to +/- 1 */
if(enable_stats && stats_ctr <= 0){
fprintf(stderr,"{\"EbNodB\": %2.2f,\t\"ppm\": %d,",stats.snr_est,(int)stats.clock_offset);
- fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",0,0);
+ fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",0.0,0.0);
fprintf(stderr,",\t\"eye_diagram\":[");
for(i=0;i<stats.neyetr;i++){
fprintf(stderr,"[");
// float input samples version
int freedv_floatrx_fsk_2400(struct freedv *f, float demod_in[], int *valid) {
+ /* Varicode and protocol bits */
uint8_t vc_bits[2];
+ uint8_t proto_bits[3];
short vc_bit;
int i;
int n_ascii;
f->nin = fmfsk_nin(f->fmfsk);
}
/* TODO: Protocol and varicode bits */
- if(fvhff_deframe_bits(f->deframer,f->packed_codec_bits,NULL,NULL,(uint8_t*)f->tx_bits)){
+ if(fvhff_deframe_bits(f->deframer,f->packed_codec_bits,proto_bits,vc_bits,(uint8_t*)f->tx_bits)){
/* Decode varicode text */
for(i=0; i<2; i++){
/* Note: deframe_bits spits out bits in uint8_ts while varicode_decode expects shorts */
(*f->freedv_put_next_rx_char)(f->callback_state, ascii_out);
}
}
+ /* Pass proto bits on if callback is present */
+ if( f->freedv_put_next_proto != NULL){
+ (*f->freedv_put_next_proto)(f->proto_callback_state,(char*)proto_bits);
+ }
*valid = 1;
f->sync = 1;
f->stats.sync = 1;
for(j=0; j<neyesamp; j++)
fsk->stats->rx_eye[3][j] = cabsolute(f2_int[neyeoffset+neyesamp+j]);
for(j=0; j<neyesamp; j++)
- fsk->stats->rx_eye[4][j] = cabsolute(f1_int[2*neyeoffset+neyesamp+j]);
+ fsk->stats->rx_eye[4][j] = cabsolute(f1_int[neyeoffset+2*neyesamp+j]);
for(j=0; j<neyesamp; j++)
- fsk->stats->rx_eye[5][j] = cabsolute(f2_int[2*neyeoffset+neyesamp+j]);
+ fsk->stats->rx_eye[5][j] = cabsolute(f2_int[neyeoffset+2*neyesamp+j]);
eye_max = 0;
/* Normalize eye to +/- 1 */