// export debugging file void ampmodem_debug_print(ampmodem _q, const char * _filename) { FILE * fid = fopen(_filename,"w"); if (!fid) { fprintf(stderr,"error: ofdmframe_debug_print(), could not open '%s' for writing\n", _filename); return; } fprintf(fid,"%% %s : auto-generated file\n", DEBUG_AMPMODEM_FILENAME); #if DEBUG_AMPMODEM fprintf(fid,"close all;\n"); fprintf(fid,"clear all;\n"); fprintf(fid,"n = %u;\n", DEBUG_AMPMODEM_BUFFER_LEN); unsigned int i; float complex * rc; float * r; // plot received signal fprintf(fid,"x = zeros(1,n);\n"); windowcf_read(_q->debug_x, &rc); for (i=0; i<DEBUG_AMPMODEM_BUFFER_LEN; i++) fprintf(fid,"x(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(n-1),real(x),0:(n-1),imag(x));\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('received signal, x');\n"); // plot phase/freq error fprintf(fid,"phase_error = zeros(1,n);\n"); windowf_read(_q->debug_phase_error, &r); for (i=0; i<DEBUG_AMPMODEM_BUFFER_LEN; i++) fprintf(fid,"phase_error(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"freq_error = zeros(1,n);\n"); windowf_read(_q->debug_freq_error, &r); for (i=0; i<DEBUG_AMPMODEM_BUFFER_LEN; i++) fprintf(fid,"freq_error(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"figure;\n"); fprintf(fid,"subplot(2,1,1),\n"); fprintf(fid," plot(0:(n-1),phase_error);\n"); fprintf(fid," xlabel('sample index');\n"); fprintf(fid," ylabel('phase error');\n"); fprintf(fid,"subplot(2,1,2),\n"); fprintf(fid," plot(0:(n-1),freq_error);\n"); fprintf(fid," xlabel('sample index');\n"); fprintf(fid," ylabel('freq error');\n"); #else fprintf(fid,"disp('no debugging info available');\n"); #endif fclose(fid); printf("ampmodem/debug: results written to '%s'\n", _filename); }
void ofdmframesync_debug_print(ofdmframesync _q, const char * _filename) { #if DEBUG_OFDMFRAMESYNC if (!_q->debug_objects_created) { fprintf(stderr,"error: ofdmframe_debug_print(), debugging objects don't exist; enable debugging first\n"); return; } FILE * fid = fopen(_filename,"w"); if (!fid) { fprintf(stderr,"error: ofdmframe_debug_print(), could not open '%s' for writing\n", _filename); return; } fprintf(fid,"%% %s : auto-generated file\n", DEBUG_OFDMFRAMESYNC_FILENAME); fprintf(fid,"close all;\n"); fprintf(fid,"clear all;\n"); fprintf(fid,"n = %u;\n", DEBUG_OFDMFRAMESYNC_BUFFER_LEN); fprintf(fid,"M = %u;\n", _q->M); fprintf(fid,"M_null = %u;\n", _q->M_null); fprintf(fid,"M_pilot = %u;\n", _q->M_pilot); fprintf(fid,"M_data = %u;\n", _q->M_data); unsigned int i; float complex * rc; float * r; // save subcarrier allocation fprintf(fid,"p = zeros(1,M);\n"); for (i=0; i<_q->M; i++) fprintf(fid,"p(%4u) = %d;\n", i+1, _q->p[i]); fprintf(fid,"i_null = find(p==%d);\n", OFDMFRAME_SCTYPE_NULL); fprintf(fid,"i_pilot = find(p==%d);\n", OFDMFRAME_SCTYPE_PILOT); fprintf(fid,"i_data = find(p==%d);\n", OFDMFRAME_SCTYPE_DATA); // short, long, training sequences for (i=0; i<_q->M; i++) { fprintf(fid,"S0(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S0[i]), cimagf(_q->S0[i])); fprintf(fid,"S1(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S1[i]), cimagf(_q->S1[i])); } fprintf(fid,"x = zeros(1,n);\n"); windowcf_read(_q->debug_x, &rc); for (i=0; i<DEBUG_OFDMFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"x(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(n-1),real(x),0:(n-1),imag(x));\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('received signal, x');\n"); fprintf(fid,"s1 = [];\n"); for (i=0; i<_q->M; i++) fprintf(fid,"s1(%3u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->s1[i]), cimagf(_q->s1[i])); // write agc_rssi fprintf(fid,"\n\n"); fprintf(fid,"agc_rssi = zeros(1,%u);\n", DEBUG_OFDMFRAMESYNC_BUFFER_LEN); windowf_read(_q->debug_rssi, &r); for (i=0; i<DEBUG_OFDMFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"agc_rssi(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"agc_rssi = filter([0.00362168 0.00724336 0.00362168],[1 -1.82269490 0.83718163],agc_rssi);\n"); fprintf(fid,"agc_rssi = 10*log10( agc_rssi );\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(agc_rssi)\n"); fprintf(fid,"ylabel('RSSI [dB]');\n"); // write short, long symbols fprintf(fid,"\n\n"); fprintf(fid,"S0 = zeros(1,M);\n"); fprintf(fid,"S1 = zeros(1,M);\n"); for (i=0; i<_q->M; i++) { fprintf(fid,"S0(%3u) = %12.8f + j*%12.8f;\n", i+1, crealf(_q->S0[i]), cimagf(_q->S0[i])); fprintf(fid,"S1(%3u) = %12.8f + j*%12.8f;\n", i+1, crealf(_q->S1[i]), cimagf(_q->S1[i])); } // write gain arrays fprintf(fid,"\n\n"); fprintf(fid,"G0 = zeros(1,M);\n"); fprintf(fid,"G1 = zeros(1,M);\n"); fprintf(fid,"G_hat = zeros(1,M);\n"); fprintf(fid,"G = zeros(1,M);\n"); for (i=0; i<_q->M; i++) { fprintf(fid,"G0(%3u) = %12.8f + j*%12.8f;\n", i+1, crealf(_q->G0[i]), cimagf(_q->G0[i])); fprintf(fid,"G1(%3u) = %12.8f + j*%12.8f;\n", i+1, crealf(_q->G1[i]), cimagf(_q->G1[i])); fprintf(fid,"G_hat(%3u) = %12.8f + j*%12.8f;\n", i+1, crealf(_q->G_hat[i]),cimagf(_q->G_hat[i])); fprintf(fid,"G(%3u) = %12.8f + j*%12.8f;\n", i+1, crealf(_q->G[i]), cimagf(_q->G[i])); } fprintf(fid,"f = [0:(M-1)];\n"); fprintf(fid,"figure;\n"); fprintf(fid,"subplot(2,1,1);\n"); fprintf(fid," plot(f, fftshift(abs(G_hat)),'sb',...\n"); fprintf(fid," f, fftshift(abs(G)),'-k','LineWidth',2);\n"); fprintf(fid," grid on;\n"); fprintf(fid," xlabel('subcarrier index');\n"); fprintf(fid," ylabel('gain estimate (mag)');\n"); fprintf(fid,"subplot(2,1,2);\n"); fprintf(fid," plot(f, fftshift(arg(G_hat).*[abs(G0) > 1e-3]),'sb',...\n"); fprintf(fid," f, fftshift(arg(G)),'-k','LineWidth',2);\n"); fprintf(fid," grid on;\n"); fprintf(fid," xlabel('subcarrier index');\n"); fprintf(fid," ylabel('gain estimate (phase)');\n"); // write pilot response fprintf(fid,"\n\n"); fprintf(fid,"px = zeros(1,M_pilot);\n"); fprintf(fid,"py = zeros(1,M_pilot);\n"); for (i=0; i<_q->M_pilot; i++) { fprintf(fid,"px(%3u) = %12.8f;\n", i+1, _q->px[i]); fprintf(fid,"py(%3u) = %12.8f;\n", i+1, _q->py[i]); } fprintf(fid,"p_phase(1) = %12.8f;\n", _q->p_phase[0]); fprintf(fid,"p_phase(2) = %12.8f;\n", _q->p_phase[1]); // save pilot history fprintf(fid,"p0 = zeros(1,M);\n"); windowf_read(_q->debug_pilot_0, &r); for (i=0; i<DEBUG_OFDMFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"p0(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"p1 = zeros(1,M);\n"); windowf_read(_q->debug_pilot_1, &r); for (i=0; i<DEBUG_OFDMFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"p1(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"figure;\n"); fprintf(fid,"fp = (-M/2):(M/2);\n"); fprintf(fid,"subplot(3,1,1);\n"); fprintf(fid," plot(px, py, 'sb',...\n"); fprintf(fid," fp, polyval(p_phase, fp), '-k');\n"); fprintf(fid," grid on;\n"); fprintf(fid," legend('pilots','polyfit',0);\n"); fprintf(fid," xlabel('subcarrier');\n"); fprintf(fid," ylabel('phase');\n"); fprintf(fid,"subplot(3,1,2);\n"); fprintf(fid," plot(1:length(p0), p0);\n"); fprintf(fid," grid on;\n"); fprintf(fid," ylabel('p0 (phase offset)');\n"); fprintf(fid,"subplot(3,1,3);\n"); fprintf(fid," plot(1:length(p1), p1);\n"); fprintf(fid," grid on;\n"); fprintf(fid," ylabel('p1 (phase slope)');\n"); // write frame symbols fprintf(fid,"framesyms = zeros(1,n);\n"); windowcf_read(_q->debug_framesyms, &rc); for (i=0; i<DEBUG_OFDMFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"framesyms(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(real(framesyms), imag(framesyms), 'x');\n"); fprintf(fid,"xlabel('I');\n"); fprintf(fid,"ylabel('Q');\n"); fprintf(fid,"axis([-1 1 -1 1]*1.6);\n"); fprintf(fid,"axis square;\n"); fprintf(fid,"grid on;\n"); fclose(fid); printf("ofdmframesync/debug: results written to '%s'\n", _filename); #else fprintf(stderr,"ofdmframesync_debug_print(): compile-time debugging disabled\n"); #endif }
void do_track(){ if (local_track_freq != shm_settings.track_frequency_target) { if (ff.sosMap.count(shm_settings.track_frequency_target)) { //frequency key exists if (track_filterA != NULL) iirfilt_crcf_destroy(track_filterA); if (track_filterB != NULL) iirfilt_crcf_destroy(track_filterB); if (track_filterC != NULL) iirfilt_crcf_destroy(track_filterC); float *b = &((ff.sosMap[shm_settings.track_frequency_target]->b)[0]); float *a = &((ff.sosMap[shm_settings.track_frequency_target]->a)[0]); track_filterA = iirfilt_crcf_create_sos(b,a,NUMBER_OF_SECTIONS); track_filterB = iirfilt_crcf_create_sos(b,a,NUMBER_OF_SECTIONS); track_filterC = iirfilt_crcf_create_sos(b,a,NUMBER_OF_SECTIONS); shm_results_track.track_state = 0; local_track_freq = shm_settings.track_frequency_target; float normalized_frequency = (float) shm_settings.track_frequency_target / (float) SAMPLING_FREQUENCY; nco_crcf_set_frequency(nco,2*M_PI*normalized_frequency); } else { //frequency key does not exist. Trigger error state shm_results_track.track_state = -1; std::cerr << shm_settings.track_frequency_target << " WARN TRACK FREQ NOT IN SOS TABLE" << std::endl; } shm_setg(hydrophones_results_track, shm_results_track); } std::complex<float> *chA_ptr, *chA_filtered_ptr; std::complex<float> *chB_ptr, *chB_filtered_ptr; std::complex<float> *chC_ptr, *chC_filtered_ptr; float *mag_ptr; windowcf_read(wchA,&chA_ptr); windowcf_read(wchB,&chB_ptr); windowcf_read(wchC,&chC_ptr); std::complex<float> filtOutA, filtOutB, filtOutC; for (int i = 0; i < SAMPLING_DEPTH; i++) { iirfilt_crcf_execute(track_filterA,chA_ptr[i],&filtOutA); iirfilt_crcf_execute(track_filterB,chB_ptr[i],&filtOutB); iirfilt_crcf_execute(track_filterC,chC_ptr[i],&filtOutC); windowcf_read(wchA_filtered,&chA_filtered_ptr); windowcf_read(wchB_filtered,&chB_filtered_ptr); windowcf_read(wchC_filtered,&chC_filtered_ptr); windowcf_push(wchA_filtered,filtOutA); windowcf_push(wchB_filtered,filtOutB); windowcf_push(wchC_filtered,filtOutC); float b_sqrd = std::pow(std::real(filtOutB),2); pwr_sum += b_sqrd; windowf_read(wmag_buffer,&mag_ptr); pwr_sum -= mag_ptr[0]; windowf_push(wmag_buffer,b_sqrd); double normalized_pwr = pwr_sum / (double)TRACK_LENGTH; if (normalized_pwr > shm_settings.track_magnitude_threshold && (track_sample_idx - shm_results_track.tracked_ping_time) >= shm_settings.track_cooldown_samples) { std::complex<float> dtft_coeff_A = goertzelNonInteger(chA_filtered_ptr,TRACK_LENGTH,shm_settings.track_frequency_target,SAMPLING_FREQUENCY); std::complex<float> dtft_coeff_B = goertzelNonInteger(chB_filtered_ptr,TRACK_LENGTH,shm_settings.track_frequency_target,SAMPLING_FREQUENCY); std::complex<float> dtft_coeff_C = goertzelNonInteger(chC_filtered_ptr,TRACK_LENGTH,shm_settings.track_frequency_target,SAMPLING_FREQUENCY); float phaseA = std::arg(dtft_coeff_A); float phaseB = std::arg(dtft_coeff_B); float phaseC = std::arg(dtft_coeff_C); shm_results_track.diff_phase_y = phase_difference(phaseC,phaseB); shm_results_track.diff_phase_x = phase_difference(phaseA,phaseB); float kx = SOUND_SPEED * shm_results_track.diff_phase_x / (NIPPLE_DISTANCE * 2 * M_PI * shm_settings.track_frequency_target); float ky = SOUND_SPEED * shm_results_track.diff_phase_y / (NIPPLE_DISTANCE * 2 * M_PI * shm_settings.track_frequency_target); float kz_2 = 1 - kx * kx - ky * ky; if (kz_2 < 0) { std::cerr << "WARNING: z mag is negative! " << kz_2 << std::endl; kz_2 = 0; } shm_results_track.tracked_ping_heading_radians = std::atan2(ky, kx); shm_results_track.tracked_ping_elevation_radians = std::acos(std::sqrt(kz_2)); shm_results_track.tracked_ping_count++; shm_results_track.tracked_ping_frequency = shm_results_spectrum.most_recent_ping_frequency; shm_results_track.tracked_ping_time = track_sample_idx; std::cout << "PING DETECTED @ n=" << track_sample_idx << " w/ pwr="<< normalized_pwr<< std::endl; std::cout << "@ HEADING=" << shm_results_track.tracked_ping_heading_radians*(180.0f/M_PI) << std::endl; shm_setg(hydrophones_results_track, shm_results_track); } track_sample_idx++; } }
void gmskframesync_debug_print(gmskframesync _q, const char * _filename) { #if DEBUG_GMSKFRAMESYNC if (!_q->debug_objects_created) { fprintf(stderr,"error: gmskframe_debug_print(), debugging objects don't exist; enable debugging first\n"); return; } FILE* fid = fopen(_filename,"w"); if (!fid) { fprintf(stderr, "error: gmskframesync_debug_print(), could not open '%s' for writing\n", _filename); return; } fprintf(fid,"%% %s: auto-generated file", _filename); fprintf(fid,"\n\n"); fprintf(fid,"clear all;\n"); fprintf(fid,"close all;\n\n"); fprintf(fid,"num_samples = %u;\n", DEBUG_GMSKFRAMESYNC_BUFFER_LEN); fprintf(fid,"t = 0:(num_samples-1);\n"); unsigned int i; float complex * rc; // write x fprintf(fid,"x = zeros(1,num_samples);\n"); windowcf_read(_q->debug_x, &rc); for (i=0; i<DEBUG_GMSKFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"x(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"\n\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(1:length(x),real(x), 1:length(x),imag(x));\n"); fprintf(fid,"ylabel('received signal, x');\n"); fprintf(fid,"\n\n"); // write instantaneous frequency float * r; fprintf(fid,"fi = zeros(1,num_samples);\n"); windowf_read(_q->debug_fi, &r); for (i=0; i<DEBUG_GMSKFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"fi(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"\n\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(1:length(fi),fi);\n"); fprintf(fid,"ylabel('Inst. Freq.');\n"); fprintf(fid,"\n\n"); // write matched filter output fprintf(fid,"mf = zeros(1,num_samples);\n"); windowf_read(_q->debug_mf, &r); for (i=0; i<DEBUG_GMSKFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"mf(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"\n\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(1:length(mf),mf);\n"); fprintf(fid,"ylabel('MF output');\n"); fprintf(fid,"\n\n"); #if 0 // write framesyms fprintf(fid,"framesyms = zeros(1,num_samples);\n"); windowf_read(_q->debug_framesyms, &r); for (i=0; i<DEBUG_GMSKFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"framesyms(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"\n\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(t,framesyms,'x')\n"); fprintf(fid,"xlabel('time (symbol index)');\n"); fprintf(fid,"ylabel('GMSK demodulator output');\n"); fprintf(fid,"grid on;\n"); fprintf(fid,"\n\n"); #endif fclose(fid); printf("gmskframesync/debug: results written to '%s'\n", _filename); #else fprintf(stderr,"gmskframesync_debug_print(): compile-time debugging disabled\n"); #endif }
void wlanframesync_debug_print(wlanframesync _q, const char * _filename) { #if DEBUG_WLANFRAMESYNC if (_q->agc_rx == NULL || _q->debug_x == NULL || _q->debug_rssi == NULL || _q->debug_framesyms == NULL) { fprintf(stderr,"error: wlanframe_debug_print(), debugging objects don't exist; enable debugging first\n"); return; } FILE * fid = fopen(_filename,"w"); if (!fid) { fprintf(stderr,"error: wlanframe_debug_print(), could not open '%s' for writing\n", _filename); return; } fprintf(fid,"%% %s : auto-generated file\n", _filename); fprintf(fid,"close all;\n"); fprintf(fid,"clear all;\n"); fprintf(fid,"n = %u;\n", DEBUG_WLANFRAMESYNC_BUFFER_LEN); unsigned int i; float complex * rc; float * r; fprintf(fid,"x = zeros(1,n);\n"); windowcf_read(_q->debug_x, &rc); for (i=0; i<DEBUG_WLANFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"x(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(n-1),real(x),0:(n-1),imag(x));\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('received signal, x');\n"); // write agc_rssi fprintf(fid,"\n\n"); fprintf(fid,"agc_rssi = zeros(1,%u);\n", DEBUG_WLANFRAMESYNC_BUFFER_LEN); windowf_read(_q->debug_rssi, &r); for (i=0; i<DEBUG_WLANFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"agc_rssi(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"figure;\n"); fprintf(fid,"plot(agc_rssi)\n"); fprintf(fid,"ylabel('RSSI [dB]');\n"); // write frame symbols fprintf(fid,"framesyms = zeros(1,n);\n"); windowcf_read(_q->debug_framesyms, &rc); for (i=0; i<DEBUG_WLANFRAMESYNC_BUFFER_LEN; i++) fprintf(fid,"framesyms(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(real(framesyms),imag(framesyms),'x','MarkerSize',2);\n"); fprintf(fid,"axis([-1 1 -1 1]*1.5);\n"); fprintf(fid,"axis square;\n"); fprintf(fid,"grid on;\n"); fprintf(fid,"xlabel('real');\n"); fprintf(fid,"ylabel('imag');\n"); // write gain arrays fprintf(fid,"\n\n"); fprintf(fid,"G0a = zeros(1,64);\n"); fprintf(fid,"G0b = zeros(1,64);\n"); fprintf(fid,"G1a = zeros(1,64);\n"); fprintf(fid,"G1b = zeros(1,64);\n"); fprintf(fid,"G = zeros(1,64);\n"); for (i=0; i<64; i++) { unsigned int k = (i + 32) % 64; fprintf(fid,"G0a(%3u) = %12.8f + j*%12.8f;\n", k+1, crealf(_q->G0a[i]), cimagf(_q->G0a[i])); fprintf(fid,"G0b(%3u) = %12.8f + j*%12.8f;\n", k+1, crealf(_q->G0b[i]), cimagf(_q->G0b[i])); fprintf(fid,"G1a(%3u) = %12.8f + j*%12.8f;\n", k+1, crealf(_q->G1a[i]), cimagf(_q->G1a[i])); fprintf(fid,"G1b(%3u) = %12.8f + j*%12.8f;\n", k+1, crealf(_q->G1b[i]), cimagf(_q->G1b[i])); fprintf(fid,"G(%3u) = %12.8f + j*%12.8f;\n", k+1, crealf(_q->G[i]), cimagf(_q->G[i])); } fprintf(fid,"%% apply timing offset (backoff) phase shift\n"); fprintf(fid,"f = -32:31;\n"); fprintf(fid,"b = 2;\n"); fprintf(fid,"G0a = G0a.*exp(j*b*2*pi*f/64);\n"); fprintf(fid,"G0b = G0b.*exp(j*b*2*pi*f/64);\n"); fprintf(fid,"G1a = G1a.*exp(j*b*2*pi*f/64);\n"); fprintf(fid,"G1b = G1b.*exp(j*b*2*pi*f/64);\n"); fprintf(fid,"G = G.*exp(j*b*2*pi*f/64);\n"); fprintf(fid,"figure;\n"); fprintf(fid,"subplot(2,1,1);\n"); fprintf(fid," plot(f,abs(G1a),'x', f,abs(G1b),'x', f,abs(G),'-k','LineWidth',2);\n"); fprintf(fid," ylabel('G (mag)');\n"); fprintf(fid,"subplot(2,1,2);\n"); fprintf(fid," plot(f,arg(G1a),'x', f,arg(G1b),'x', f,arg(G),'-k','LineWidth',2);\n"); fprintf(fid," ylabel('G (phase)');\n"); fclose(fid); printf("wlanframesync/debug: results written to '%s'\n", _filename); #else fprintf(stderr,"wlanframesync_debug_print(): compile-time debugging disabled\n"); #endif }
void ofdmoqamframe64sync_debug_print(ofdmoqamframe64sync _q) { FILE * fid = fopen(DEBUG_OFDMOQAMFRAME64SYNC_FILENAME,"w"); if (!fid) { printf("error: ofdmoqamframe64_debug_print(), could not open file for writing\n"); return; } fprintf(fid,"%% %s : auto-generated file\n", DEBUG_OFDMOQAMFRAME64SYNC_FILENAME); fprintf(fid,"close all;\n"); fprintf(fid,"clear all;\n"); fprintf(fid,"n = %u;\n", DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN); unsigned int i; float complex * rc; float * r; // gain vectors fprintf(fid,"g = %12.4e;\n", _q->g); for (i=0; i<_q->num_subcarriers; i++) { fprintf(fid,"G(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->G[i]), cimagf(_q->G[i])); //fprintf(fid,"G0(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->G0[i]), cimagf(_q->G0[i])); //fprintf(fid,"G1(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->G1[i]), cimagf(_q->G1[i])); } for (i=0; i<4; i++) { fprintf(fid,"phi(%3u) = %12.8f;\n", i+1, _q->y_phase[i]); } fprintf(fid,"figure;\n"); fprintf(fid,"f = -32:31;\n"); fprintf(fid,"subplot(2,1,1);\n"); fprintf(fid," plot(f,fftshift(abs(G)));\n"); fprintf(fid," xlabel('subcarrier index');\n"); fprintf(fid," ylabel('|G|');\n"); fprintf(fid," grid on;\n"); fprintf(fid,"subplot(2,1,2);\n"); fprintf(fid," plot(f,fftshift(arg(G)));\n"); fprintf(fid," xlabel('subcarrier index');\n"); fprintf(fid," ylabel('arg\\{G\\}');\n"); fprintf(fid," grid on;\n"); // CFO estimate fprintf(fid,"nu_hat = %12.4e;\n", _q->nu_hat); // short, long, training sequences for (i=0; i<_q->num_subcarriers; i++) { fprintf(fid,"S0(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S0[i]), cimagf(_q->S0[i])); fprintf(fid,"S1(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S1[i]), cimagf(_q->S1[i])); fprintf(fid,"S2(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S2[i]), cimagf(_q->S2[i])); } fprintf(fid,"x = zeros(1,n);\n"); windowcf_read(_q->debug_x, &rc); for (i=0; i<DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN; i++) fprintf(fid,"x(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(n-1),real(x),0:(n-1),imag(x));\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('received signal, x');\n"); fprintf(fid,"rxx = zeros(1,n);\n"); windowcf_read(_q->debug_rxx, &rc); for (i=0; i<DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN; i++) fprintf(fid,"rxx(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(n-1),abs(rxx),'-k','LineWidth',2);\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('|r_{xx}|');\n"); fprintf(fid,"rxy = zeros(1,n);\n"); windowcf_read(_q->debug_rxy, &rc); for (i=0; i<DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN; i++) fprintf(fid,"rxy(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(n-1),abs(rxy));\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('|r_{xy}|');\n"); // decoded long sequences fprintf(fid,"S1 = zeros(1,64);\n"); fprintf(fid,"S1a = zeros(1,64);\n"); fprintf(fid,"S1b = zeros(1,64);\n"); fprintf(fid,"Y0 = zeros(1,64);\n"); fprintf(fid,"Y1 = zeros(1,64);\n"); for (i=0; i<64; i++) { fprintf(fid,"S1(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S1[i]), cimagf(_q->S1[i])); fprintf(fid,"S1a(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S1a[i]), cimagf(_q->S1a[i])); fprintf(fid,"S1b(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->S1b[i]), cimagf(_q->S1b[i])); fprintf(fid,"Y0(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->Y0[i]), cimagf(_q->Y0[i])); fprintf(fid,"Y1(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(_q->Y1[i]), cimagf(_q->Y1[i])); } fprintf(fid,"zeta = 64/sqrt(52/2);\n"); fprintf(fid,"S1 = S1 / zeta;\n"); fprintf(fid,"S1a = S1a / zeta;\n"); fprintf(fid,"S1b = S1b / zeta;\n"); fprintf(fid,"Y0 = Y0 / zeta;\n"); fprintf(fid,"Y1 = Y1 / zeta;\n"); fprintf(fid,"t0 = 1:2:64;\n"); fprintf(fid,"t1 = 2:2:64;\n"); fprintf(fid,"S = zeros(1,64);\n"); fprintf(fid,"S(t0) = real(S1a(t0)) + j*imag(S1b(t0));\n"); fprintf(fid,"S(t1) = real(S1b(t1)) + j*imag(S1a(t1));\n"); fprintf(fid,"Y = zeros(1,64);\n"); fprintf(fid,"Y(t0) = real(Y0(t0)) + j*imag(Y1(t0));\n"); fprintf(fid,"Y(t1) = real(Y1(t1)) + j*imag(Y0(t1));\n"); fprintf(fid,"figure;\n"); //fprintf(fid,"f = [(0:63)]/64 - 0.5;\n"); //fprintf(fid,"plot(S1,'x',S1a,'x',S1b,'x');\n"); fprintf(fid,"plot(S1,'x',S,'x',S1a,'x',S1b,'x');\n"); fprintf(fid,"legend('S1','S','S1a','S1b',0);\n"); fprintf(fid,"xlabel('I');\n"); fprintf(fid,"ylabel('Q');\n"); fprintf(fid,"axis square;\n"); fprintf(fid,"axis([-1 1 -1 1]*1.3);\n"); fprintf(fid,"title('PLCP long sequences');\n"); // pilot phase fprintf(fid,"pilotphase = zeros(1,n);\n"); windowf_read(_q->debug_pilotphase, &r); for (i=0; i<DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN; i++) fprintf(fid,"pilotphase(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"pilotphase_hat = zeros(1,n);\n"); windowf_read(_q->debug_pilotphase_hat, &r); for (i=0; i<DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN; i++) fprintf(fid,"pilotphase_hat(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(127),pilotphase([n-128+1]:n),'-k',0:(127),pilotphase_hat([n-128+1]:n),'-k','LineWidth',2);\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('pilot phase');\n"); // rssi (received signal strength indication) fprintf(fid,"rssi = zeros(1,n);\n"); windowf_read(_q->debug_rssi, &r); for (i=0; i<DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN; i++) fprintf(fid,"rssi(%4u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"figure;\n"); fprintf(fid,"plot(0:(n-1),rssi,'-k','LineWidth',2);\n"); fprintf(fid,"xlabel('sample index');\n"); fprintf(fid,"ylabel('RSSI');\n"); // frame symbols fprintf(fid,"framesyms = zeros(1,n);\n"); windowcf_read(_q->debug_framesyms, &rc); for (i=0; i<DEBUG_OFDMOQAMFRAME64SYNC_BUFFER_LEN; i++) fprintf(fid,"framesyms(%4u) = %12.4e + j*%12.4e;\n", i+1, crealf(rc[i]), cimagf(rc[i])); fprintf(fid,"figure;\n"); fprintf(fid,"plot(real(framesyms),imag(framesyms),'x','MarkerSize',1);\n"); fprintf(fid,"axis square;\n"); fprintf(fid,"axis([-1.5 1.5 -1.5 1.5]);\n"); fprintf(fid,"xlabel('in-phase');\n"); fprintf(fid,"ylabel('quadrature phase');\n"); fprintf(fid,"title('Frame Symbols');\n"); fclose(fid); printf("ofdmoqamframe64sync/debug: results written to %s\n", DEBUG_OFDMOQAMFRAME64SYNC_FILENAME); }
// // output debugging file // void gmskdem_debug_print(gmskdem _q, const char * _filename) { // open output filen for writing FILE * fid = fopen(_filename,"w"); if (!fid) { fprintf(stderr,"error: gmskdem_debug_print(), could not open '%s' for writing\n", _filename); exit(1); } fprintf(fid,"%% %s : auto-generated file\n", _filename); fprintf(fid,"clear all\n"); fprintf(fid,"close all\n"); #if DEBUG_GMSKDEM // unsigned int i; float * r; fprintf(fid,"n = %u;\n", DEBUG_BUFFER_LEN); fprintf(fid,"k = %u;\n", _q->k); fprintf(fid,"m = %u;\n", _q->m); fprintf(fid,"t = [0:(n-1)]/k;\n"); // plot receive filter response fprintf(fid,"ht = zeros(1,2*k*m+1);\n"); float ht[_q->h_len]; liquid_firdes_gmsktx(_q->k, _q->m, _q->BT, 0.0f, ht); for (i=0; i<_q->h_len; i++) fprintf(fid,"ht(%4u) = %12.4e;\n", i+1, ht[i]); #if GMSKDEM_USE_EQUALIZER float hr[_q->h_len]; eqlms_rrrf_get_weights(_q->eq, hr); for (i=0; i<_q->h_len; i++) fprintf(fid,"hr(%4u) = %12.4e * %u;\n", i+1, hr[i], _q->k); #else for (i=0; i<_q->h_len; i++) fprintf(fid,"hr(%4u) = %12.4e;\n", i+1, _q->h[i]); #endif fprintf(fid,"hc = conv(ht,hr)/k;\n"); fprintf(fid,"nfft = 1024;\n"); fprintf(fid,"f = [0:(nfft-1)]/nfft - 0.5;\n"); fprintf(fid,"Ht = 20*log10(abs(fftshift(fft(ht/k, nfft))));\n"); fprintf(fid,"Hr = 20*log10(abs(fftshift(fft(hr/k, nfft))));\n"); fprintf(fid,"Hc = 20*log10(abs(fftshift(fft(hc/k, nfft))));\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(f,Ht, f,Hr, f,Hc,'-k','LineWidth',2);\n"); fprintf(fid,"axis([-0.5 0.5 -50 10]);\n"); fprintf(fid,"xlabel('Normalized Frequency');\n"); fprintf(fid,"ylabel('Power Spectral Density [dB]');\n"); fprintf(fid,"legend('transmit','receive','composite',1);\n"); fprintf(fid,"grid on;\n"); fprintf(fid,"mfout = zeros(1,n);\n"); windowf_read(_q->debug_mfout, &r); for (i=0; i<DEBUG_BUFFER_LEN; i++) fprintf(fid,"mfout(%5u) = %12.4e;\n", i+1, r[i]); fprintf(fid,"i0 = 1; %%mod(k+n,k)+k;\n"); fprintf(fid,"isym = i0:k:n;\n"); fprintf(fid,"figure;\n"); fprintf(fid,"plot(t,mfout,'-', t(isym),mfout(isym),'o','MarkerSize',4);\n"); fprintf(fid,"grid on;\n"); #endif fclose(fid); printf("gmskdem: internal debugging written to '%s'\n", _filename); }
// // AUTOTEST: windowf // void autotest_windowf() { float v[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; float *r; // reader pointer float x; // temporary value holder unsigned int i; float test0[10] = {0,0,0,0,0,0,0,0,0,0}; float test1[10] = {0,0,0,0,0,0,1,1,1,1}; float test2[10] = {0,0,1,1,1,1,9,8,7,6}; float test3[10] = {1,1,9,8,7,6,3,3,3,3}; float test4[10] = {7,6,3,3,3,3,5,5,5,5}; float test5[6] = {3,3,5,5,5,5}; float test6[6] = {5,5,5,5,6,7}; float test7[10] = {0,0,0,0,5,5,5,5,6,7}; float test8[10] = {0,0,0,0,0,0,0,0,0,0}; // create window // 0 0 0 0 0 0 0 0 0 0 windowf w = windowf_create(10); windowf_read(w, &r); CONTEND_SAME_DATA(r,test0,10*sizeof(float)); // push 4 elements // 0 0 0 0 0 0 1 1 1 1 windowf_push(w, 1); windowf_push(w, 1); windowf_push(w, 1); windowf_push(w, 1); windowf_read(w, &r); CONTEND_SAME_DATA(r,test1,10*sizeof(float)); // push 4 more elements // 0 0 1 1 1 1 9 8 7 6 windowf_write(w, v, 4); windowf_read(w, &r); CONTEND_SAME_DATA(r,test2,10*sizeof(float)); // push 4 more elements // 1 1 9 8 7 6 3 3 3 3 windowf_push(w, 3); windowf_push(w, 3); windowf_push(w, 3); windowf_push(w, 3); windowf_read(w, &r); CONTEND_SAME_DATA(r,test3,10*sizeof(float)); // test indexing operation windowf_index(w, 0, &x); CONTEND_EQUALITY(x, 1); windowf_index(w, 1, &x); CONTEND_EQUALITY(x, 1); windowf_index(w, 2, &x); CONTEND_EQUALITY(x, 9); windowf_index(w, 3, &x); CONTEND_EQUALITY(x, 8); windowf_index(w, 4, &x); CONTEND_EQUALITY(x, 7); windowf_index(w, 5, &x); CONTEND_EQUALITY(x, 6); windowf_index(w, 6, &x); CONTEND_EQUALITY(x, 3); windowf_index(w, 7, &x); CONTEND_EQUALITY(x, 3); windowf_index(w, 8, &x); CONTEND_EQUALITY(x, 3); windowf_index(w, 9, &x); CONTEND_EQUALITY(x, 3); // push 4 more elements // 7 6 3 3 3 3 5 5 5 5 windowf_push(w, 5); windowf_push(w, 5); windowf_push(w, 5); windowf_push(w, 5); windowf_read(w, &r); CONTEND_SAME_DATA(r,test4,10*sizeof(float)); if (liquid_autotest_verbose) windowf_debug_print(w); // recreate window (truncate to last 6 elements) // 3 3 5 5 5 5 w = windowf_recreate(w,6); windowf_read(w, &r); CONTEND_SAME_DATA(r,test5,6*sizeof(float)); // push 2 more elements // 5 5 5 5 6 7 windowf_push(w, 6); windowf_push(w, 7); windowf_read(w, &r); CONTEND_SAME_DATA(r,test6,6*sizeof(float)); // recreate window (extend to 10 elements) // 0 0 0 0 5 5 5 5 6 7 w = windowf_recreate(w,10); windowf_read(w,&r); CONTEND_SAME_DATA(r,test7,10*sizeof(float)); // reset // 0 0 0 0 0 0 0 0 0 0 windowf_reset(w); windowf_read(w, &r); CONTEND_SAME_DATA(r,test8,10*sizeof(float)); if (liquid_autotest_verbose) { // manual print printf("manual output:\n"); for (i=0; i<10; i++) printf("%6u : %f\n", i, r[i]); windowf_debug_print(w); } windowf_destroy(w); printf("done.\n"); }