% scale averaging time constant based on number of samples
tc = 0.95*Ndft/Fs;
-
+ %tc = .95;
% Update mag DFT ---------------------------------------------
numffts = floor(length(sf)/Ndft);
eye_plot.disableAutoRange()
eye_plot.setYRange(0,1)
eye_plot.setXRange(0,15)
-
+eye_xr = 15
# Data arrays...
ebno_data = np.zeros(history_size)*np.nan
# Plot update function. Reads from queue, processes and updates plots.
def update_plots():
- global timeout,timeout_counter,eye_plot,ebno_curve, ppm_curve, fest1_curve, fest2_curve, ebno_data, ppm_data, fest_data, in_queue
+ global timeout,timeout_counter,eye_plot,ebno_curve, ppm_curve, fest1_curve, fest2_curve, ebno_data, ppm_data, fest_data, in_queue, eye_xr
try:
if in_queue.empty():
# Try reading in the other 2 tones.
try:
- new_fest1 = in_data['f3_est']
- new_fest2 = in_data['f4_est']
+ new_fest3 = in_data['f3_est']
+ new_fest4 = in_data['f4_est']
fest_data[2,-1] = new_fest3
fest_data[3,-1] = new_fest4
except:
#Now try reading in and plotting the eye diagram
try:
eye_data = np.array(in_data['eye_diagram'])
+
#eye_plot.disableAutoRange()
eye_plot.clear()
col_index = 0
eye_plot.plot(line,pen=(col_index,eye_data.shape[0]))
col_index += 1
#eye_plot.autoRange()
-
+
+ #Quick autoranging for x-axis to allow for differing P and Ts values
+ if eye_xr != len(eye_data[0]) - 1:
+ eye_xr = len(eye_data[0]) - 1
+ eye_plot.setXRange(0,len(eye_data[0])-1)
+
except Exception as e:
pass
function plot_fsk_bers(M=2)
%Range of EbNodB over which to plot
- ebnodbrange = (3:13);
+ ebnodbrange = (4:13);
berc = ones(1,length(ebnodbrange));
bero = ones(1,length(ebnodbrange));
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(.5*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);
* float fsk_in[] - nin samples of modualted FMFSK from an FM radio
*/
void fmfsk_demod(struct FMFSK *fmfsk, uint8_t rx_bits[],float fmfsk_in[]){
- int i,j;
+ int i,j,k;
int Ts = fmfsk->Ts;
int Fs = fmfsk->Fs;
int Rs = fmfsk->Rs;
int next_nin;
float apeven,apodd; /* Approx. prob of even or odd stream being correct */
float currv,mdiff,lastv;
+ int neyesamp;
+ int neyeoffset;
+ float eye_max;
uint8_t mbit;
/* Shift in nin samples */
/* Zero out all of the other things */
fmfsk->stats->foff = 0;
fmfsk->stats->snr_est = 0;
+
+ /* Collect an eye diagram */
+ /* Take a sample for the eye diagrams */
+ neyesamp = fmfsk->stats->neyesamp = Ts*4;
+ neyeoffset = sample_offset+(Ts*2*28);
+
+ fmfsk->stats->neyetr = 8;
+ 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];
+
+ eye_max = 0;
+
+ /* Normalize eye to +/- 1 */
+ for(i=0; i<fmfsk->stats->neyetr; i++)
+ for(j=0; j<neyesamp; j++)
+ if(fabsf(fmfsk->stats->rx_eye[i][j])>eye_max)
+ eye_max = fabsf(fmfsk->stats->rx_eye[i][j]);
+
+ for(i=0; i<fmfsk->stats->neyetr; i++)
+ for(j=0; j<neyesamp; j++)
+ fmfsk->stats->rx_eye[i][j] = (fmfsk->stats->rx_eye[i][j]/(2*eye_max))+.5;
}
modem_probe_samp_f("t_norm_rx_timing",&norm_rx_timing,1);
#include <stdio.h>
#include "fmfsk.h"
-
+#include "modem_stats.h"
#define MODEMPROBE_ENABLE
#include "modem_probe.h"
#include "codec2_fdmdv.h"
int main(int argc,char *argv[]){
struct FMFSK *fmfsk;
int Fs,Rb;
+ struct MODEM_STATS stats;
+ float loop_time;
+ int enable_stats = 0;
+ int stats_ctr = 0;
+ int stats_loop = 0;
FILE *fin,*fout;
uint8_t *bitbuf;
int16_t *rawbuf;
float *modbuf;
- int i,t;
+ int i,j,t;
if(argc<4){
- fprintf(stderr,"usage: %s SampleFreq BitRate InputModemRawFile OutputOneBitPerCharFile [OctaveLogFile]\n",argv[0]);
+ fprintf(stderr,"usage: %s SampleFreq BitRate InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]);
exit(1);
}
}else{
fout = fopen(argv[4],"w");
}
-
-
- if(argc>4)
- modem_probe_init("fmfsk2",argv[5]);
/* set up FSK */
fmfsk = fmfsk_create(Fs,Rb);
+
+ if(argc>5){
+ if(strcmp(argv[5],"S")==0){
+ enable_stats = 1;
+ fmfsk_setup_modem_stats(fmfsk,&stats);
+ loop_time = ((float)fmfsk_nin(fmfsk))/((float)Fs);
+ stats_loop = (int)(.125/loop_time);
+ stats_ctr = 0;
+ }
+ }
if(fin==NULL || fout==NULL || fmfsk==NULL){
fprintf(stderr,"Couldn't open test vector files\n");
fwrite(bitbuf,sizeof(uint8_t),fmfsk->nbit,fout);
+ 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\"eye_diagram\":[");
+ for(i=0;i<stats.neyetr;i++){
+ fprintf(stderr,"[");
+ for(j=0;j<stats.neyesamp;j++){
+ fprintf(stderr,"%f",stats.rx_eye[i][j]);
+ if(j<stats.neyesamp-1) fprintf(stderr,",");
+ }
+ fprintf(stderr,"]");
+ if(i<stats.neyetr-1) fprintf(stderr,",");
+ }
+
+ fprintf(stderr,"]}\n");
+ stats_ctr = stats_loop;
+ }
+ stats_ctr--;
+
if(fin == stdin || fout == stdin){
fflush(fin);
fflush(fout);
/* Take a sample for the eye diagrams */
neyesamp = fsk->stats->neyesamp = P*2;
- neyeoffset = high_sample+1+P;
+ neyeoffset = high_sample+1+(P*28);
fsk->stats->neyetr = fsk->mode*3;
for(j=0; j<neyesamp; j++)
/* Take a sample for the eye diagrams */
neyesamp = fsk->stats->neyesamp = P*2;
- neyeoffset = high_sample+1+P;
+ neyeoffset = low_sample+1+(P*(nsym/4));
fsk->stats->neyetr = fsk->mode*2;
for(j=0; j<neyesamp; j++)
/* eye diagram traces */
/* Eye diagram plot -- first dim is trace number, second is the trace idx */
- float rx_eye[MODEM_STATS_ET_MAX][MODEM_STATS_NC_MAX+1];
+ float rx_eye[MODEM_STATS_ET_MAX][80];
int neyetr; /* How many eye traces are plotted */
int neyesamp; /* How many samples in the eye diagram */