diff --git a/MARSIS_dataset/processing_scripts/read_MARSIS_NCSIM.m b/MARSIS_dataset/processing_scripts/read_MARSIS_NCSIM.m
new file mode 100644
index 0000000000000000000000000000000000000000..1215355d19bd3055a518de8a9f66743910ae6597
--- /dev/null
+++ b/MARSIS_dataset/processing_scripts/read_MARSIS_NCSIM.m
@@ -0,0 +1,140 @@
+function MarsisIdr = read_MARSIS_NCSIM( NCSimFile, ParameterName, StartRecord, StopRecord, SkipRecords )
+
+if     contains( NCSimFile, '_SS1_TRK_CMP_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+elseif contains( NCSimFile, '_SS1_TRK_RAW_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+elseif contains( NCSimFile, '_SS2_TRK_CMP_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+elseif contains( NCSimFile, '_SS2_TRK_RAW_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+elseif contains( NCSimFile, '_SS3_TRK_CMP_M_NCSIM.DAT' ), [ RecordBytes, Parameter, OffsetBytes, OffsetBits, Items, Precision, OutputPrecision, MachineFormat, ItemBytes, ItemBits ] = MARSIS_SS3_TRK_CMP_NCSIM;
+elseif contains( NCSimFile, '_SS3_TRK_RAW_M_NCSIM.DAT' ), [ RecordBytes, Parameter, OffsetBytes, OffsetBits, Items, Precision, OutputPrecision, MachineFormat, ItemBytes, ItemBits ] = MARSIS_SS3_TRK_RAW_NCSIM;
+elseif contains( NCSimFile, '_SS4_TRK_CMP_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+elseif contains( NCSimFile, '_SS4_TRK_RAW_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+elseif contains( NCSimFile, '_SS5_TRK_CMP_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+elseif contains( NCSimFile, '_SS5_TRK_RAW_M_NCSIM.DAT' ), disp( 'This type of file cannot be read yet' ), return
+else   error( 'read_MARSIS_NCSIM:FileTypeUnknown', 'File %s does not follow standard naming conventions, file type could not be determined.', NCSimFile )
+end
+
+% The data product file is opened.
+fid = fopen( NCSimFile, 'r' );
+
+if fid < 0
+    error( 'read_MARSIS_NCSIM:MissingInputFile', ...
+           'The required data product file %s could not be opened.', ...
+            NCSimFile )
+end
+
+% The length in bytes of the data product file is retrieved, and divided by
+% the length of a file record in bytes to obtain the number of records in
+% the file.
+
+fseek( fid, 0, 'eof' );
+FileBytes = ftell( fid );
+FileRecords = FileBytes / RecordBytes;
+
+if round( FileRecords ) ~= FileRecords
+    fclose( fid );
+    error( 'read_MARSIS_NCSIM:FractionalNumberOfRecords', ...
+           'The data product file %s contains %f records, a non integer number of records.', ...
+            NCSimFile, FileRecords )
+end
+
+% If the only input argument is the name of a data product file, the
+% function returns the number of records contained in that file.
+if nargin == 1
+    MarsisIdr = FileRecords;
+    fclose( fid );
+    return
+end
+
+
+% The name of the parameter to be extracted from the data product file is
+% compared to the list of parameters in the data product, to determine its
+% position in the list.
+ParameterIndex = strcmp( Parameter, ParameterName );
+ParameterIndex = find( ParameterIndex == 1 );
+
+if isempty( ParameterIndex )
+    fclose( fid );
+    error( 'read_MARSIS_NCSIM:ParameterNotFound', ...
+           'The parameter %s is not listed among those contained in a MARSIS IDR FRM data product.', ...
+            ParameterName )
+end
+
+% If input values are not provided, default values are assigned to
+% StartRecord, StopRecord and SkipRecords
+if nargin < 3
+    StartRecord = 1;
+end
+
+if nargin < 4
+    StopRecord  = FileRecords;
+end
+
+if nargin < 5
+    SkipRecords = 1;
+end
+
+% StartRecord, StopRecord and SkipRecords are checked for consistency.
+if StartRecord < 1 || StartRecord > FileRecords
+    fclose( fid );
+    error( 'read_MARSIS_NCSIM:InvalidValueForStartRecord', ...
+           'The first record to be extracted is record %g, which is outside the valid interval [ 1, %g ].', ...
+            StartRecord, FileRecords )
+end
+
+if StopRecord  < 1 || StopRecord  > FileRecords
+    fclose( fid );
+    error( 'read_MARSIS_NCSIM:InvalidValueForStopRecord', ...
+           'The last record to be extracted is record %g, which is outside the valid interval [ 1, %g ].', ...
+            StopRecord, FileRecords )
+end
+
+if SkipRecords < 1 || SkipRecords > FileRecords
+    fclose( fid );
+    error( 'read_MARSIS_NCSIM:InvalidValueForSkipRecords', ...
+           'The number of records to be skipped is %g, which is outside the valid interval [ 1, %g ].', ...
+            SkipRecords, FileRecords )
+end
+
+if StopRecord  < StartRecord
+    fclose( fid );
+    error( 'read_MARSIS_NCSIM:StopRecordBeforeStartRecord', ...
+           'The first record to be extracted is record %g and is greater than last record to be extracted, which is record %g.', ...
+            StartRecord, StopRecord )
+end
+
+% the number of records to be extracted fromn the data product file is
+% determined.
+Records = length( StartRecord : SkipRecords : StopRecord );
+
+if Records == 0
+    fclose( fid );
+    error( 'read_MARSIS_NCSIM:NoRecordsExtracted', ...
+           'The combination of StartRecord = %g, StopRecord = %g, SkipRecords = %g does not allow the extraction of records from this data product file.', ...
+            StartRecord, StopRecord, SkipRecords )
+end
+
+% The requested parameter is extracted from the data product file.
+
+offset = ( StartRecord - 1 ) * RecordBytes + OffsetBytes( ParameterIndex );
+fseek( fid, offset, 'bof' );
+
+pad = fread( fid, OffsetBits( ParameterIndex ), 'ubit1', MachineFormat{ ParameterIndex } );
+
+size          = [ Items( ParameterIndex ), Records ];
+precision     = [ int2str( Items( ParameterIndex ) ), '*', Precision{ ParameterIndex }, '=>', OutputPrecision{ ParameterIndex } ];
+
+if     ( ItemBytes( ParameterIndex ) >= 1 ) && ( ItemBits( ParameterIndex ) == 0 )
+    skip      = ( SkipRecords - 1 ) * RecordBytes     + RecordBytes      - Items( ParameterIndex ) * ItemBytes( ParameterIndex );
+elseif ( ItemBytes( ParameterIndex ) == 0 ) && ( ItemBits( ParameterIndex ) >= 1 )
+    skip      = ( SkipRecords - 1 ) * RecordBytes * 8 + RecordBytes * 8  - Items( ParameterIndex ) *  ItemBits( ParameterIndex );
+else
+    error( 'read_MARSIS_NCSIM:WrongParameterFormat', ...
+           'The parameter %s is described as being %g bytes long and %g bits long.', ...
+            Parameter{ ParameterIndex }, ItemBytes( ParameterIndex ), ItemBits( ParameterIndex ) )
+end
+
+machineformat = MachineFormat{ ParameterIndex };
+
+MarsisIdr = fread( fid, size, precision, skip, machineformat );
+
+fclose( fid );