diff --git a/src/utils/matlab/libs/quantize_signal.m b/src/utils/matlab/libs/quantize_signal.m new file mode 100644 index 000000000..207f7c6e7 --- /dev/null +++ b/src/utils/matlab/libs/quantize_signal.m @@ -0,0 +1,84 @@ +% +% \file quantize_signal.m +% \brief This file opens a binary file using the ibyte format, reads and +% quantizes the signal using the most significant nbits, and stores the +% quantized signal into an output file. The output file also uses the +% ibyte format. +% \author Marc Majoral, 2020. mmajoral(at)cttc.es +% +% Usage: quantize_signal (infile, outfile, nbits) +% +% Inputs: +% infile - Input file name +% outfile - Output file name +% nbits - number of quantization bits +% +% ------------------------------------------------------------------------- +% +% Copyright (C) 2010-2020 (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. +% +% SPDX-License-Identifier: GPL-3.0-or-later +% +% ------------------------------------------------------------------------- +% +function quantize_signal (infile, outfile, nbits) + +%% usage: quantize_signal (infile, outfile, nbits) +%% +%% open input signal file infile, quantize the signal using the most +%% significant nbits and write the quantized signal to outfile +%% + +fileID = fopen(infile, 'rb'); +fileID2 = fopen(outfile, 'wb'); + +% initialize loop +BlockSize = 20000000; % processing block size +NumBitsPerSample = 8; % num. bits per sample ibyte format. +NumBitsSHift = NumBitsPerSample - nbits; +DivVal = 2^NumBitsSHift; +Lim2sCompl = 2^(NumBitsPerSample - 1) - 1; +Base2sCompl = 2^NumBitsPerSample; +do = true; +data_bytes = fread(fileID, BlockSize); + +while do + + % 2's complement + for k=1:length(data_bytes) + if (data_bytes(k) > Lim2sCompl) + data_bytes(k) = -Base2sCompl + data_bytes(k); + end + end + + % take the nbits most significant bits + data_bytes = floor(data_bytes/DivVal); + + % quantization correction + data_bytes = data_bytes*2 + 1; + + % 2's complement + for k=1:length(data_bytes) + if (data_bytes(k) < 0) + data_bytes(k) = Base2sCompl + data_bytes(k); + end + end + + % write result + fwrite(fileID2, data_bytes); + + if (size(data_bytes) < BlockSize) + do = false; + else + data_bytes = fread(fileID,BlockSize); + end +end + +% close files +fclose(fileID); +fclose(fileID2); \ No newline at end of file