- Use the colon operator to generate indices: "-50:1:50".
- Use the function "round" on the output of "linspace" to make them integers.
Index error when calling filter function
3 views (last 30 days)
Show older comments
Olmo Notarianni
on 14 Jun 2020
Commented: Olmo Notarianni
on 24 Jun 2020
Hello everyone.
I'm trying to write a function to read an audiofile applying it a filter.
I first use audioread function that gives me my (441000x2) signal matrix of n samples in 2 channels/columns. I generate a filter with the ellip function in the [b,a] form.
Now my problem is: A) if I use the command window, i have my 441000x2 (double) signal and my 1x7 (double) vector of the filter transfer function coefficients.
y = filter(b,a,u);
returns me a 441000x2 matrix which actually is the filtered signal. I can plot both channels in the freq. domain and it works.
B) if I call my function, that is more or less like:
%reading (durata)seconds of my file
info = audioinfo(filename_formato);
[y, Fs] = audioread(filename_formato,[1 info.SampleRate * durata]);
ns = size(y,1);
ts = 1/Fs;
%generating time vector
t = linspace(0,ts*ns,ns);
%designing the filter (let's say Fs = 44100Hz, fstop = 1000Hz)
[z,p,k] = ellip(6,0.5,20,fstop/Fs*2);
[b,a] = zp2tf(G.Z{1,1},G.P{1,1},G.K);
y = filter(b,a,u);
I receive the following error message:
" Index in position 1 is invalid. Array indices must be positive integers or logical values.
Error in TOTAL (line 71)
y = filter(b,a,u); "
where TOTAL is the name of the function.
I tried using a for loop to work on one channel at a time but still
y(:,i) = filter(b,a,u(:,i))
works in the command window but gives me the same error when calling TOTAL
Any ideas? thank you very much.
0 Comments
Accepted Answer
Anmol Dhiman
on 21 Jun 2020
Hi Olmo,
I am assuming you are using MATLAB 2019b. The above issue can be due to linspace. It is generating indices which are not integers (due to numerical approximation errors) and this made matrix indexing fail. You can verify this yourself, if you run the following code in MATLAB R2019b or later:
x = -50:1:50;
y = linspace(-50,50,101);
% Verify that result is different
isequal(x,y)
% Show that this makes indexing fail
indices = y + 51;
A = [1:1000];
B = A(indices);
The developers are aware of this issue and are working on fixing it in a future release.
As a workaround, you can:
Regards,
Anmol Dhiman
More Answers (0)
See Also
Categories
Find more on Filter Design 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!