mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +00:00 
			
		
		
		
	Add Matlab parsing and plotting functions for Kalman filter tracking block
This commit is contained in:
		
							
								
								
									
										63
									
								
								conf/gnss-sdr-kalman-bayes.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								conf/gnss-sdr-kalman-bayes.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | [GNSS-SDR] | ||||||
|  |  | ||||||
|  | ;######### GLOBAL OPTIONS ################## | ||||||
|  | ;internal_fs_sps: Internal signal sampling frequency after the signal conditioning stage [samples per second]. | ||||||
|  | GNSS-SDR.internal_fs_sps=2000000 | ||||||
|  | GNSS-SDR.internal_fs_hz=2000000 | ||||||
|  |  | ||||||
|  | ;######### SIGNAL_SOURCE CONFIG ############ | ||||||
|  | SignalSource.implementation=File_Signal_Source | ||||||
|  | SignalSource.filename=/home/glamountain/gnss-sdr/data/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat | ||||||
|  | SignalSource.item_type=ishort | ||||||
|  | SignalSource.sampling_frequency=4000000 | ||||||
|  | SignalSource.freq=1575420000 | ||||||
|  | SignalSource.samples=0 | ||||||
|  |  | ||||||
|  | ;######### SIGNAL_CONDITIONER CONFIG ############ | ||||||
|  | SignalConditioner.implementation=Signal_Conditioner | ||||||
|  | DataTypeAdapter.implementation=Ishort_To_Complex | ||||||
|  | InputFilter.implementation=Pass_Through | ||||||
|  | InputFilter.item_type=gr_complex | ||||||
|  | Resampler.implementation=Direct_Resampler | ||||||
|  | Resampler.sample_freq_in=4000000 | ||||||
|  | Resampler.sample_freq_out=2000000 | ||||||
|  | Resampler.item_type=gr_complex | ||||||
|  |  | ||||||
|  | ;######### CHANNELS GLOBAL CONFIG ############ | ||||||
|  | Channels_1C.count=8 | ||||||
|  | Channels.in_acquisition=1 | ||||||
|  | Channel.signal=1C | ||||||
|  |  | ||||||
|  | ;######### ACQUISITION GLOBAL CONFIG ############ | ||||||
|  | Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition | ||||||
|  | Acquisition_1C.item_type=gr_complex | ||||||
|  | Acquisition_1C.threshold=0.008 | ||||||
|  | Acquisition_1C.doppler_max=10000 | ||||||
|  | Acquisition_1C.doppler_step=250 | ||||||
|  | Acquisition_1C.dump=false | ||||||
|  | Acquisition_1C.dump_filename=../data/kalman/acq_dump | ||||||
|  |  | ||||||
|  | ;######### TRACKING GLOBAL CONFIG ############ | ||||||
|  | Tracking_1C.implementation=GPS_L1_CA_KF_Tracking | ||||||
|  | Tracking_1C.item_type=gr_complex | ||||||
|  | Tracking_1C.pll_bw_hz=40.0; | ||||||
|  | Tracking_1C.dll_bw_hz=4.0; | ||||||
|  | Tracking_1C.order=3; | ||||||
|  | Tracking_1C.dump=true | ||||||
|  | Tracking_1C.dump_filename=../data/kalman/epl_tracking_ch_ | ||||||
|  | Tracking_1C.bce_run = true; | ||||||
|  | Tracking_1C.p_transient = 0; | ||||||
|  | Tracking_1C.s_transient = 100; | ||||||
|  |  | ||||||
|  | ;######### TELEMETRY DECODER GPS CONFIG ############ | ||||||
|  | TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder | ||||||
|  |  | ||||||
|  | ;######### OBSERVABLES CONFIG ############ | ||||||
|  | Observables.implementation=GPS_L1_CA_Observables | ||||||
|  |  | ||||||
|  | ;######### PVT CONFIG ############ | ||||||
|  | PVT.implementation=GPS_L1_CA_PVT | ||||||
|  | PVT.averaging_depth=100 | ||||||
|  | PVT.flag_averaging=true | ||||||
|  | PVT.output_rate_ms=10 | ||||||
|  | PVT.display_rate_ms=500 | ||||||
							
								
								
									
										93
									
								
								src/utils/matlab/gps_l1_ca_kf_plot_sample.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/utils/matlab/gps_l1_ca_kf_plot_sample.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | % Reads GNSS-SDR Tracking dump binary file using the provided | ||||||
|  | %  function and plots some internal variables | ||||||
|  | % Javier Arribas, 2011. jarribas(at)cttc.es | ||||||
|  | % ------------------------------------------------------------------------- | ||||||
|  | % | ||||||
|  | % Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors) | ||||||
|  | % | ||||||
|  | % GNSS-SDR is a software defined Global Navigation | ||||||
|  | %           Satellite Systems receiver | ||||||
|  | % | ||||||
|  | % This file is part of GNSS-SDR. | ||||||
|  | %  | ||||||
|  | % GNSS-SDR is free software: you can redistribute it and/or modify | ||||||
|  | % it under the terms of the GNU General Public License as published by | ||||||
|  | % the Free Software Foundation, either version 3 of the License, or | ||||||
|  | % at your option) any later version. | ||||||
|  | %  | ||||||
|  | % GNSS-SDR is distributed in the hope that it will be useful, | ||||||
|  | % but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | % GNU General Public License for more details. | ||||||
|  | % | ||||||
|  | % You should have received a copy of the GNU General Public License | ||||||
|  | % along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | % | ||||||
|  | % ------------------------------------------------------------------------- | ||||||
|  | % | ||||||
|  |  | ||||||
|  | close all; | ||||||
|  | clear all; | ||||||
|  |  | ||||||
|  | if ~exist('dll_pll_veml_read_tracking_dump.m', 'file') | ||||||
|  |     addpath('./libs') | ||||||
|  | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | samplingFreq = 6625000;     %[Hz] | ||||||
|  | channels = 8; | ||||||
|  | first_channel = 0; | ||||||
|  | code_period = 0.001; | ||||||
|  |  | ||||||
|  | path    = '/archive/';  %% CHANGE THIS PATH | ||||||
|  | figpath = [path]; | ||||||
|  |  | ||||||
|  | for N=1:1:channels | ||||||
|  |     tracking_log_path = [path 'epl_tracking_ch_' num2str(N+first_channel-1) '.dat']; %% CHANGE epl_tracking_ch_ BY YOUR dump_filename | ||||||
|  |     GNSS_tracking(N) = gps_l1_ca_kf_read_tracking_dump(tracking_log_path); | ||||||
|  | end | ||||||
|  |  | ||||||
|  | % GNSS-SDR format conversion to MATLAB GPS receiver | ||||||
|  |  | ||||||
|  | for N=1:1:channels | ||||||
|  |     trackResults(N).status = 'T'; %fake track | ||||||
|  |     trackResults(N).codeFreq       = GNSS_tracking(N).code_freq_hz.'; | ||||||
|  |     trackResults(N).carrFreq       = GNSS_tracking(N).carrier_doppler_hz.'; | ||||||
|  |     trackResults(N).carrFreqRate   = GNSS_tracking(N).carrier_dopplerrate_hz2.'; | ||||||
|  |     trackResults(N).dllDiscr       = GNSS_tracking(N).code_error.'; | ||||||
|  |     trackResults(N).dllDiscrFilt   = GNSS_tracking(N).code_nco.'; | ||||||
|  |     trackResults(N).pllDiscr       = GNSS_tracking(N).carr_error.'; | ||||||
|  |     trackResults(N).pllDiscrFilt   = GNSS_tracking(N).carr_nco.'; | ||||||
|  |      | ||||||
|  |     trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; | ||||||
|  |     trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; | ||||||
|  |      | ||||||
|  |     trackResults(N).I_E = GNSS_tracking(N).E.'; | ||||||
|  |     trackResults(N).I_L = GNSS_tracking(N).L.'; | ||||||
|  |     trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); | ||||||
|  |     trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).E)); | ||||||
|  |     trackResults(N).PRN = GNSS_tracking(N).PRN.'; | ||||||
|  |     trackResults(N).CNo = GNSS_tracking(N).CN0_SNV_dB_Hz.'; | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     kalmanResults(N).PRN = GNSS_tracking(N).PRN.'; | ||||||
|  |     kalmanResults(N).innovation  = GNSS_tracking(N).carr_error.'; | ||||||
|  |     kalmanResults(N).state1      = GNSS_tracking(N).carr_nco.'; | ||||||
|  |     kalmanResults(N).state2      = GNSS_tracking(N).carrier_doppler_hz.'; | ||||||
|  |     kalmanResults(N).state3      = GNSS_tracking(N).carrier_dopplerrate_hz2.'; | ||||||
|  |     kalmanResults(N).r_noise_cov = GNSS_tracking(N).carr_noise_sigma2.'; | ||||||
|  |     kalmanResults(N).CNo         = GNSS_tracking(N).CN0_SNV_dB_Hz.'; | ||||||
|  |      | ||||||
|  |     % Use original MATLAB tracking plot function | ||||||
|  |     settings.numberOfChannels = channels; | ||||||
|  |     settings.msToProcess = length(GNSS_tracking(N).E); | ||||||
|  |     settings.codePeriod  = code_period; | ||||||
|  |     settings.timeStartInSeconds = 20; | ||||||
|  |      | ||||||
|  |     %plotTracking(N, trackResults, settings) | ||||||
|  |     plotKalman(N, kalmanResults, settings) | ||||||
|  |      | ||||||
|  |     saveas(gcf, [figpath 'epl_tracking_ch_' num2str(N) '_PRN_' num2str(trackResults(N).PRN(end)) '.png'], 'png') | ||||||
|  | end | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										158
									
								
								src/utils/matlab/libs/gps_l1_ca_kf_read_tracking_dump.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								src/utils/matlab/libs/gps_l1_ca_kf_read_tracking_dump.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | |||||||
|  | % Usage: gps_l1_ca_kf_read_tracking_dump (filename, [count]) | ||||||
|  | % | ||||||
|  | % Opens GNSS-SDR tracking binary log file .dat and returns the contents | ||||||
|  |  | ||||||
|  | % Read GNSS-SDR Tracking dump binary file into MATLAB. | ||||||
|  | % Javier Arribas, 2011. jarribas(at)cttc.es | ||||||
|  | % ------------------------------------------------------------------------- | ||||||
|  | % | ||||||
|  | % Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors) | ||||||
|  | % | ||||||
|  | % GNSS-SDR is a software defined Global Navigation | ||||||
|  | %           Satellite Systems receiver | ||||||
|  | % | ||||||
|  | % This file is part of GNSS-SDR. | ||||||
|  | % | ||||||
|  | % GNSS-SDR is free software: you can redistribute it and/or modify | ||||||
|  | % it under the terms of the GNU General Public License as published by | ||||||
|  | % the Free Software Foundation, either version 3 of the License, or | ||||||
|  | % at your option) any later version. | ||||||
|  | % | ||||||
|  | % GNSS-SDR is distributed in the hope that it will be useful, | ||||||
|  | % but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | % GNU General Public License for more details. | ||||||
|  | % | ||||||
|  | % You should have received a copy of the GNU General Public License | ||||||
|  | % along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | % | ||||||
|  | % ------------------------------------------------------------------------- | ||||||
|  | % | ||||||
|  |  | ||||||
|  | function [GNSS_tracking] = gps_l1_ca_kf_read_tracking_dump (filename, count) | ||||||
|  |  | ||||||
|  | m = nargchk (1,2,nargin); | ||||||
|  |  | ||||||
|  | num_float_vars = 19; | ||||||
|  | num_unsigned_long_int_vars = 1; | ||||||
|  | num_double_vars = 1; | ||||||
|  | num_unsigned_int_vars = 1; | ||||||
|  |  | ||||||
|  | if(~isempty(strfind(computer('arch'), '64'))) | ||||||
|  |     % 64-bit computer | ||||||
|  |     double_size_bytes = 8; | ||||||
|  |     unsigned_long_int_size_bytes = 8; | ||||||
|  |     float_size_bytes = 4; | ||||||
|  |     unsigned_int_size_bytes = 4; | ||||||
|  | else | ||||||
|  |     double_size_bytes = 8; | ||||||
|  |     unsigned_long_int_size_bytes = 4; | ||||||
|  |     float_size_bytes = 4; | ||||||
|  |     unsigned_int_size_bytes = 4; | ||||||
|  | end | ||||||
|  |  | ||||||
|  | skip_bytes_each_read = float_size_bytes * num_float_vars + unsigned_long_int_size_bytes * num_unsigned_long_int_vars + ... | ||||||
|  |     double_size_bytes * num_double_vars + num_unsigned_int_vars*unsigned_int_size_bytes; | ||||||
|  |  | ||||||
|  | bytes_shift = 0; | ||||||
|  |  | ||||||
|  | if (m) | ||||||
|  |     usage (m); | ||||||
|  | end | ||||||
|  |  | ||||||
|  | if (nargin < 2) | ||||||
|  |     count = Inf; | ||||||
|  | end | ||||||
|  | %loops_counter = fread (f, count, 'uint32',4*12); | ||||||
|  | f = fopen (filename, 'rb'); | ||||||
|  | if (f < 0) | ||||||
|  | else | ||||||
|  |     v1 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v2 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v3 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v4 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v5 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v6 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v7 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next interleaved float | ||||||
|  |     v8 = fread (f, count, 'long', skip_bytes_each_read - unsigned_long_int_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + unsigned_long_int_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v9 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v10 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v11 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v12 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v13 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v14 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v15 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v16 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v17 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v18 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next interleaved float | ||||||
|  |     v19 = fread (f, count, 'float', skip_bytes_each_read - float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next float | ||||||
|  |     v20 = fread (f, count, 'float', skip_bytes_each_read-float_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + float_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next double | ||||||
|  |     v21 = fread (f, count, 'double', skip_bytes_each_read - double_size_bytes); | ||||||
|  |     bytes_shift = bytes_shift + double_size_bytes; | ||||||
|  |     fseek(f,bytes_shift,'bof'); % move to next unsigned int | ||||||
|  |     v22 = fread (f, count, 'uint', skip_bytes_each_read - unsigned_int_size_bytes); | ||||||
|  |     fclose (f); | ||||||
|  |      | ||||||
|  |     GNSS_tracking.VE = v1; | ||||||
|  |     GNSS_tracking.E = v2; | ||||||
|  |     GNSS_tracking.P = v3; | ||||||
|  |     GNSS_tracking.L = v4; | ||||||
|  |     GNSS_tracking.VL = v5; | ||||||
|  |     GNSS_tracking.prompt_I = v6; | ||||||
|  |     GNSS_tracking.prompt_Q = v7; | ||||||
|  |     GNSS_tracking.PRN_start_sample = v8; | ||||||
|  |     GNSS_tracking.acc_carrier_phase_rad = v9; | ||||||
|  |     GNSS_tracking.carrier_doppler_hz = v10; | ||||||
|  |     GNSS_tracking.carrier_dopplerrate_hz2 = v11; | ||||||
|  |     GNSS_tracking.code_freq_hz = v12; | ||||||
|  |     GNSS_tracking.carr_error = v13; | ||||||
|  |     GNSS_tracking.carr_noise_sigma2 = v14; | ||||||
|  |     GNSS_tracking.carr_nco = v15; | ||||||
|  |     GNSS_tracking.code_error = v16; | ||||||
|  |     GNSS_tracking.code_nco = v17; | ||||||
|  |     GNSS_tracking.CN0_SNV_dB_Hz = v18; | ||||||
|  |     GNSS_tracking.carrier_lock_test = v19; | ||||||
|  |     GNSS_tracking.var1 = v20; | ||||||
|  |     GNSS_tracking.var2 = v21; | ||||||
|  |     GNSS_tracking.PRN = v22; | ||||||
|  | end | ||||||
							
								
								
									
										135
									
								
								src/utils/matlab/libs/plotKalman.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								src/utils/matlab/libs/plotKalman.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | |||||||
|  | function plotKalman(channelList, trackResults, settings) | ||||||
|  | % This function plots the tracking results for the given channel list. | ||||||
|  | % | ||||||
|  | % plotTracking(channelList, trackResults, settings) | ||||||
|  | % | ||||||
|  | %   Inputs: | ||||||
|  | %       channelList     - list of channels to be plotted. | ||||||
|  | %       trackResults    - tracking results from the tracking function. | ||||||
|  | %       settings        - receiver settings. | ||||||
|  |  | ||||||
|  | %-------------------------------------------------------------------------- | ||||||
|  | %                           SoftGNSS v3.0 | ||||||
|  | % | ||||||
|  | % Copyright (C) Darius Plausinaitis | ||||||
|  | % Written by Darius Plausinaitis | ||||||
|  | %-------------------------------------------------------------------------- | ||||||
|  | %This program is free software; you can redistribute it and/or | ||||||
|  | %modify it under the terms of the GNU General Public License | ||||||
|  | %as published by the Free Software Foundation; either version 2 | ||||||
|  | %of the License, or (at your option) any later version. | ||||||
|  | % | ||||||
|  | %This program is distributed in the hope that it will be useful, | ||||||
|  | %but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | %MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | %GNU General Public License for more details. | ||||||
|  | % | ||||||
|  | %You should have received a copy of the GNU General Public License | ||||||
|  | %along with this program; if not, write to the Free Software | ||||||
|  | %Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, | ||||||
|  | %USA. | ||||||
|  | %-------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | % Protection - if the list contains incorrect channel numbers | ||||||
|  | channelList = intersect(channelList, 1:settings.numberOfChannels); | ||||||
|  |  | ||||||
|  | %=== For all listed channels ============================================== | ||||||
|  | for channelNr = channelList | ||||||
|  |      | ||||||
|  |     %% Select (or create) and clear the figure ================================ | ||||||
|  |     % The number 200 is added just for more convenient handling of the open | ||||||
|  |     % figure windows, when many figures are closed and reopened. | ||||||
|  |     % Figures drawn or opened by the user, will not be "overwritten" by | ||||||
|  |     % this function. | ||||||
|  |      | ||||||
|  |     figure(channelNr +200); | ||||||
|  |     clf(channelNr +200); | ||||||
|  |     set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... | ||||||
|  |         ' (PRN ', ... | ||||||
|  |         num2str(trackResults(channelNr).PRN(end-1)), ... | ||||||
|  |         ') results']); | ||||||
|  |      | ||||||
|  |     timeStart = settings.timeStartInSeconds; | ||||||
|  |      | ||||||
|  |     %% Draw axes ============================================================== | ||||||
|  |     % Row 1 | ||||||
|  |     handles(1, 1) = subplot(4, 2, 1); | ||||||
|  |     handles(1, 2) = subplot(4, 2, 2); | ||||||
|  |     % Row 2 | ||||||
|  |     handles(2, 1) = subplot(4, 2, 3); | ||||||
|  |     handles(2, 2) = subplot(4, 2, 4); | ||||||
|  |     % Row 3 | ||||||
|  |     handles(3, 1) = subplot(4, 2, [5 6]); | ||||||
|  |     % Row 4 | ||||||
|  |     handles(4, 1) = subplot(4, 2, [7 8]); | ||||||
|  |      | ||||||
|  |     %% Plot all figures ======================================================= | ||||||
|  |      | ||||||
|  |     timeAxisInSeconds = (1:settings.msToProcess)/1000; | ||||||
|  |      | ||||||
|  |     %----- CNo for signal---------------------------------- | ||||||
|  |     plot  (handles(1, 1), timeAxisInSeconds, ... | ||||||
|  |         trackResults(channelNr).CNo(1:settings.msToProcess), 'b'); | ||||||
|  |      | ||||||
|  |     grid  (handles(1, 1)); | ||||||
|  |     axis  (handles(1, 1), 'tight'); | ||||||
|  |     xlabel(handles(1, 1), 'Time (s)'); | ||||||
|  |     ylabel(handles(1, 1), 'CNo (dB-Hz)'); | ||||||
|  |     title (handles(1, 1), 'Carrier to Noise Ratio'); | ||||||
|  |      | ||||||
|  |     %----- PLL discriminator filtered---------------------------------- | ||||||
|  |     plot  (handles(1, 2), timeAxisInSeconds, ... | ||||||
|  |         trackResults(channelNr).state1(1:settings.msToProcess), 'b'); | ||||||
|  |      | ||||||
|  |     grid  (handles(1, 2)); | ||||||
|  |     axis  (handles(1, 2), 'tight'); | ||||||
|  |     xlim  (handles(1, 2), [timeStart, timeAxisInSeconds(end)]); | ||||||
|  |     xlabel(handles(1, 2), 'Time (s)'); | ||||||
|  |     ylabel(handles(1, 2), 'Phase Amplitude'); | ||||||
|  |     title (handles(1, 2), 'Filtered Carrier Phase'); | ||||||
|  |      | ||||||
|  |     %----- Carrier Frequency -------------------------------- | ||||||
|  |     plot  (handles(2, 1), timeAxisInSeconds(2:end), ... | ||||||
|  |         trackResults(channelNr).state2(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]); | ||||||
|  |      | ||||||
|  |     grid  (handles(2, 1)); | ||||||
|  |     axis  (handles(2, 1)); | ||||||
|  |     xlim  (handles(2, 1), [timeStart, timeAxisInSeconds(end)]); | ||||||
|  |     xlabel(handles(2, 1), 'Time (s)'); | ||||||
|  |     ylabel(handles(2, 1), 'Freq (hz)'); | ||||||
|  |     title (handles(2, 1), 'Filtered Doppler Frequency'); | ||||||
|  |      | ||||||
|  |     %----- Carrier Frequency Rate -------------------------------- | ||||||
|  |     plot  (handles(2, 2), timeAxisInSeconds(2:end), ... | ||||||
|  |         trackResults(channelNr).state3(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]); | ||||||
|  |      | ||||||
|  |     grid  (handles(2, 2)); | ||||||
|  |     axis  (handles(2, 2)); | ||||||
|  |     xlim  (handles(2, 2), [timeStart, timeAxisInSeconds(end)]); | ||||||
|  |     xlabel(handles(2, 2), 'Time (s)'); | ||||||
|  |     ylabel(handles(2, 2), 'Freq (hz)'); | ||||||
|  |     title (handles(2, 2), 'Filtered Doppler Frequency Rate'); | ||||||
|  |      | ||||||
|  |     %----- PLL discriminator unfiltered-------------------------------- | ||||||
|  |     plot  (handles(3, 1), timeAxisInSeconds, ... | ||||||
|  |         trackResults(channelNr).innovation, 'r'); | ||||||
|  |      | ||||||
|  |     grid  (handles(3, 1)); | ||||||
|  |     axis  (handles(3, 1), 'auto'); | ||||||
|  |     xlim  (handles(3, 1), [timeStart, timeAxisInSeconds(end)]); | ||||||
|  |     xlabel(handles(3, 1), 'Time (s)'); | ||||||
|  |     ylabel(handles(3, 1), 'Amplitude'); | ||||||
|  |     title (handles(3, 1), 'Raw PLL discriminator (Innovation)'); | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     %----- PLL discriminator covariance -------------------------------- | ||||||
|  |     plot  (handles(4, 1), timeAxisInSeconds, ... | ||||||
|  |         trackResults(channelNr).r_noise_cov, 'r'); | ||||||
|  |      | ||||||
|  |     grid  (handles(4, 1)); | ||||||
|  |     axis  (handles(4, 1), 'auto'); | ||||||
|  |     xlim  (handles(4, 1), [timeStart, timeAxisInSeconds(end)]); | ||||||
|  |     xlabel(handles(4, 1), 'Time (s)'); | ||||||
|  |     ylabel(handles(4, 1), 'Variance'); | ||||||
|  |     title (handles(4, 1), 'Estimated Noise Variance'); | ||||||
|  | end % for channelNr = channelList | ||||||
		Reference in New Issue
	
	Block a user
	 Gerald LaMountain
					Gerald LaMountain