Index exceeds matrix dimensions. Exsample.m

3 views (last 30 days)
Fares Saleh
Fares Saleh on 29 Nov 2020
Commented: KSSV on 29 Nov 2020
I keep running into the same error for my functions. The error and functions (uniquan.m and sampandquant.m) are shown below:
>> Exsample
Index exceeds the number of array elements (4).
Error in uniquan (line 19)
q_out=q_level(qindex); % use index vector to generate output
Error in sampandquant (line 21)
[sq_out,Delta,SQNR]=uniquan(s_out,L);
Error in Exsample (line 12)
[s_out,sq_out,sqh_out,Delta,SQNR]=sampandquant(xsig,16,td,ts);
Here is my function:
% (Exsample.m)
% Example of sampling, quantization and zero-order hold
clear;clf;
td=0.002; %origional sampling rate 500 Hz
t=[0:td:1.]; %time interval of 1 second
xsig=sin(2*pi*t)-sin(6*pi*t); % 1Hz+3Hz sinusoids
Lsig=length(xsig);
ts=0.02; %new sampling rate = 50Hz.
Nfactor=ts/td;
% send the signal through a 16-level uniform quantizer
[s_out,sq_out,sqh_out,Delta,SQNR]=sampandquant(xsig,16,td,ts);
% receive 3 signals
% 1. sampled signal s_out
% 2. sampled and quantized signal sq_out
% 3. sampled, quantized, and zero-order hold signal sqh_out
%
% Calculate the Fourier Transfoms
Lfft=2^ceil(log2(Lsig)+1);
Fmax=1/(2*td);
Faxis=linspace(-Fmax,Fmax,Lfft);
Xsig=fftshift(fft(xsig,Lfft));
S_out=fftshift(fft(s_out,Lfft));
And I'm drawing from:
% (uniquan.m)
function [q_out,Delta,SQNR]=uniquan(sig_in,L)
% Usage
% [q_out,Delta,SQNR]=uniquan(sig_in,L)
% L - number of uniform quantization levels
% sig_in - input signal vector
% Function outputs:
% q_out - quantized output
% Delta - quantization interval
% SQNR - actual signal to quantization noise ratio
sig_pmax=max(sig_in); % finding the positive peak
sig_nmax=min(sig_in); % finding the negative peak
Delta=(sig_pmax-sig_nmax)/L; % quantization interval
q_level=sig_nmax+Delta/2:sig_pmax-Delta/2; % define Q-levels
L_sig=length(sig_in); % find signal length
sigp=(sig_in-sig_nmax)/Delta+1/2; % convert into 1/2 to L+1/2 range
qindex=round(sigp); % round to 1,2, ... L levels
qindex=min(qindex,L); % eliminate L+1 as a rare possibility
q_out=q_level(qindex); % use index vector to generate output
SQNR=20*log10(norm(sig_in)/norm(sig_in-q_out)); % actual SQNR value
end
And:
% (sampandquant.m)
function [s_out,sq_out,sqh_out,Delta,SQNR]=sampandquant(sig_in,L,td,ts)
% Usage
% [s_out,sq_out,sqh_out,Delta,SQNR=sampandquant(sig_in,L,td,ts)
% L - number of uniform quantization levels
% sif_in - input signal vector
% td - origional signal sampling period of sig_in
% ts - new sampling period
% NOTE: td*fs must be a positive integer;
% Function outputs:
% s_out - sampled output
% sq_out - sample-and-quantized output
% sqh_out - sample, quantize, and hold output
% Delta - quantization interval
% SQNR - actual signal to quantization noise ratio
if (rem(ts/td,1)==0)
nfac=round(ts/td);
p_zoh=ones(1,nfac);
s_out=downsample(sig_in,nfac);
[sq_out,Delta,SQNR]=uniquan(s_out,L);
s_out=upsample(s_out,nfac);
sqh_out=kron(sq_out,p_zoh);
sq_out=upsample(sq_out,nfac);
else
warning('Error! ts/td is not an integer!')
s_out=[];sq_out=[];sqh_out=[];Delta=[];SQNR=[];
end
end
  1 Comment
KSSV
KSSV on 29 Nov 2020
This error occurs when you try to extract more number of elemnts than present in an array.
Example:
A = rand(1,10);
A(1) % no error
A(5) % no error
A(10) % no error
A(11) % error as there are only 10 elements in A.

Sign in to comment.

Answers (0)

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!