states.verbose = 0;
states.phi = zeros(1, M); % keep down converter osc phase continuous
- printf("M: %d Fs: %d Rs: %d Ts: %d nsym: %d nbit: %d\n", states.M, states.Fs, states.Rs, states.Ts, states.nsym, states.nbit);
+ %printf("M: %d Fs: %d Rs: %d Ts: %d nsym: %d nbit: %d\n", states.M, states.Fs, states.Rs, states.Ts, states.nsym, states.nbit);
% BER stats
states.verbose = 0;
states.phi = zeros(1, M); % keep down converter osc phase continuous
- printf("M: %d Fs: %d Rs: %d Ts: %d nsym: %d nbit: %d\n", states.M, states.Fs, states.Rs, states.Ts, states.nsym, states.nbit);
+ %printf("M: %d Fs: %d Rs: %d Ts: %d nsym: %d nbit: %d\n", states.M, states.Fs, states.Rs, states.Ts, states.nsym, states.nbit);
% Freq estimator limits
%tfsk executable path/file
global tfsk_location = '../build_linux/unittest/tfmfsk';
+%Set to 1 for verbose printouts
+global print_verbose = 0;
+
fmfsk
%Compare 2 vectors, fail if they are not close enough
function pass = vcompare(vc,voct,vname,tname,tol,pnum)
+ global print_verbose;
%Get delta of vectors
dvec = abs(abs(vc)-abs(voct));
maxdvec = abs(max(dvec));
pass = maxdvec<tol;
-
- printf(' Comparing vectors %s in test %s. Diff is %f\n',vname,tname,maxdvec);
+ if print_verbose == 1
+ printf(' Comparing vectors %s in test %s. Diff is %f\n',vname,tname,maxdvec);
+ end
if pass == 0
printf('\n*** vcompare failed %s in test %s. Diff: %f Tol: %f\n\n',vname,tname,maxdvec,tol);
% simulation of tx and rx side, add noise, channel impairments ----------------------
function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,df=0,M=2)
+ global print_verbose;
test_frame_mode = 2;
frames = 70;
%EbNodB = 3;
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);
+ if print_verbose == 1
+ printf("C BER %f in test %s\n",berc,test_name);
+ printf("Oct BER %f in test %s\n",bero,test_name);
+ end
stats.berc = berc;
stats.bero = bero;
-
+ stats.name = test_name;
% non-coherent BER theory calculation
% It was complicated, so I broke it up
function pass = ebno_battery_test(timing_offset,drift,hpf,deemp,outfilt)
+ global print_verbose;
%Range of EbNodB over which to test
ebnodbrange = (8:2:20);
ebnodbs = length(ebnodbrange);
passv = zeros(1,length(statv));
for ii=(1:length(statv))
passv(ii)=statv(ii).pass;
+ if statv(ii).pass
+ printf("Test %s passed\n",statv(ii).name);
+ else
+ printf("Test %s failed\n",statv(ii).name);
+ end
end
%All pass flags are '1'
endfunction
-
-test_fmfsk_battery
+xpass = test_fmfsk_battery
plot_fmfsk_bers(2)
+
+if xpass
+ printf("***** All tests passed! *****\n");
+else
+ printf("***** Some test failed! Look back thorugh output to find failed test *****\n");
+end
%tfsk executable path/file
global tfsk_location = '../build_linux/unittest/tfsk';
+%Set to 1 for verbose printouts
+global print_verbose = 0;
fsk_horus_as_a_lib = 1; % make sure calls to test functions at bottom are disabled
%Compare 2 vectors, fail if they are not close enough
function pass = vcompare(vc,voct,vname,tname,tol,pnum)
-
+ global print_verbose;
%Get delta of vectors
dvec = abs(abs(vc)-abs(voct));
maxdvec = abs(max(dvec));
pass = maxdvec<tol;
-
- printf(' Comparing vectors %s in test %s. Diff is %f\n',vname,tname,maxdvec);
-
+ if print_verbose == 1
+ printf(' Comparing vectors %s in test %s. Diff is %f\n',vname,tname,maxdvec);
+ end
if pass == 0
printf('\n*** vcompare failed %s in test %s. Diff: %f Tol: %f\n\n',vname,tname,maxdvec,tol);
endfunction
function test_stats = fsk_demod_xt(Fs,Rs,f1,fsp,mod,tname,M=2)
+ global print_verbose;
global tfsk_location;
%Name of executable containing the modulator
fsk_demod_ex_file = '../build/unittest/tfsk';
diffbits = sum(xor(obits,bits'));
-
if diffpass==0
printf('\n***bitcompare test failed test %s diff %d\n\n',tname,sum(xor(obits,bits')))
figure(15)
% 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)
+ global print_verbose;
frames = 90;
%EbNodB = 10;
%timing_offset = 2.0; % see resample() for clock offset below
end
f1 = states.f1_tx;
- fsp = states.f2_tx-f1
+ fsp = states.f2_tx-f1;
states.dA = [dA dA dA dA];
states.ftx(1) = f1;
states.ftx(2) = f1+fsp;
rx = tx + noise;
test_name = sprintf("tfsk run sim EbNodB:%d frames:%d timing_offset:%d fading:%d df:%d",EbNodB,frames,timing_offset,fading,df);
- tstats = fsk_demod_xt(Fs,Rs,states.f1_tx,fsp,rx,test_name,M);
- printf("Test %s done\n",test_name);
+ tstats = fsk_demod_xt(Fs,Rs,states.f1_tx,fsp,rx,test_name,M);
pass = tstats.pass;
obits = tstats.obits;
berc = ber;
stats.berc = berc;
stats.bero = bero;
+ stats.name = test_name;
% coherent BER theory calculation
stats.thrcoh = .5*(M-1)*erfc(sqrt( (log2(M)/2) * EbNo ));
passv = zeros(1,length(statv));
for ii=(1:length(statv))
passv(ii)=statv(ii).pass;
+ if statv(ii).pass
+ printf("Test %s passed\n",statv(ii).name);
+ else
+ printf("Test %s failed\n",statv(ii).name);
+ end
end
%All pass flags are '1'
endfunction
-test_fsk_battery
-plot_fsk_bers(2)
+xpass = test_fsk_battery
+%plot_fsk_bers(2)
plot_fsk_bers(4)
+
+if xpass
+ printf("***** All tests passed! *****\n");
+else
+ printf("***** Some test failed! Look back thorugh output to find failed test *****\n");
+end
+
2 - Change tfsk_location below if required
3 - Ensure Octave packages signal and parallel are installed
- 4 - Start Octave and run tfsk.m. It will perform all tests automatically
+ 4 - Start Octave and run tfsk_2400a.m. It will perform all tests automatically
#}
+
+
%tfsk executable path/file
global tfsk_location = '../build_linux/unittest/tfsk';
+%Set to 1 for verbose printouts
+global print_verbose = 0;
fsk_horus_as_a_lib = 1; % make sure calls to test functions at bottom are disabled
%Compare 2 vectors, fail if they are not close enough
function pass = vcompare(vc,voct,vname,tname,tol,pnum)
-
+ global print_verbose;
%Get delta of vectors
dvec = abs(abs(vc)-abs(voct));
maxdvec = abs(max(dvec));
pass = maxdvec<tol;
- printf(' Comparing vectors %s in test %s. Diff is %f\n',vname,tname,maxdvec);
+ if print_verbose == 1
+ printf(' Comparing vectors %s in test %s. Diff is %f\n',vname,tname,maxdvec);
+ end
if pass == 0
printf('\n*** vcompare failed %s in test %s. Diff: %f Tol: %f\n\n',vname,tname,maxdvec,tol);
function test_stats = fsk_demod_xt(Fs,Rs,f1,fsp,mod,tname,M=2)
global tfsk_location;
+ global print_verbose;
%Name of executable containing the modulator
fsk_demod_ex_file = '../build/unittest/tfsk';
modvecfilename = sprintf('fsk_demod_ut_modvec_%d',getpid());
diffpass = sum(xor(obits,bits'))<5;
diffbits = sum(xor(obits,bits'));
-
- printf('%d bit diff in test %s\n',diffbits,tname);
+ if print_verbose == 1
+ printf('%d bit diff in test %s\n',diffbits,tname);
+ end
if diffpass==0
printf('\n***bitcompare test failed test %s diff %d\n\n',tname,sum(xor(obits,bits')))
figure(15)
% 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)
+ global print_verbose;
frames = 190;
%EbNodB = 10;
%timing_offset = 2.0; % see resample() for clock offset below
f1 = states.f1_tx;
- fsp = states.f2_tx-f1
+ fsp = states.f2_tx-f1;
states.dA = [dA dA dA dA];
states.ftx(1) = f1;
states.ftx(2) = f1+fsp;
noise = sqrt(variance)*randn(length(tx),1);
rx = tx + noise;
- test_name = sprintf("tfsk run sim EbNodB:%d frames:%d timing_offset:%d fading:%d df:%d",EbNodB,frames,timing_offset,fading,df);
- tstats = fsk_demod_xt(Fs,Rs,states.f1_tx,fsp,rx,test_name,M);
- printf("Test %s done\n",test_name);
+ test_name = sprintf("tfsk EbNodB:%d frames:%d timing_offset:%d fading:%d df:%d",EbNodB,frames,timing_offset,fading,df);
+ tstats = fsk_demod_xt(Fs,Rs,states.f1_tx,fsp,rx,test_name,M);
pass = tstats.pass;
obits = tstats.obits;
cbits = tstats.cbits;
+ stats.name = test_name;
+
+ if tstats.pass
+ printf("Test %s passed\n",test_name);
+ else
+ printf("Test %s failed\n",test_name);
+ end
% Figure out BER of octave and C modems
bitcnt = length(tx_bits);
stats.bero = bero;
% coherent BER theory calculation
- printf("C BER: %f Oct BER: %f Test %s\n",berc,bero,test_name);
+ if print_verbose == 1
+ printf("C BER: %f Oct BER: %f Test %s\n",berc,bero,test_name);
+ end
stats.thrcoh = .5*(M-1)*erfc(sqrt( (log2(M)/2) * EbNo ));
passv = zeros(1,length(statv));
for ii=(1:length(statv))
passv(ii)=statv(ii).pass;
+ if statv(ii).pass
+ printf("Test %s passed\n",statv(ii).name);
+ else
+ printf("Test %s failed\n",statv(ii).name);
+ end
+
end
%All pass flags are '1'
endfunction
-test_fsk_battery
+xpass = test_fsk_battery
%plot_fsk_bers(2)
plot_fsk_bers(4)
+
+if xpass
+ printf("***** All tests passed! *****\n");
+else
+ printf("***** Some test failed! Look back thorugh output to find failed test *****\n");
+end
/* Demod-only test */
if(test_type == TEST_DEMOD){
- fprintf(stderr,"%d\n",(fmfsk->N+fmfsk->Ts*2));
+ //fprintf(stderr,"%d\n",(fmfsk->N+fmfsk->Ts*2));
while( fread(modbuf,sizeof(float),fmfsk_nin(fmfsk),fin) == fmfsk_nin(fmfsk) ){
fmfsk_demod(fmfsk,bitbuf,modbuf);
fwrite(bitbuf,sizeof(uint8_t),fmfsk->nbit,fout);
}else{
fsk = fsk_create(Fs,Rs,M,f1,fs);
}
- fprintf(stderr,"Running in mode %d\n",M);
/* Modulate! */
if(test_type == TEST_MOD || test_type == TEST_SELF_FULL){
/* Generate random bits for self test */