- 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 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Olmo Notarianni
am 14 Jun. 2020
Kommentiert: Olmo Notarianni
am 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 Kommentare
Akzeptierte Antwort
Anmol Dhiman
am 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
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Filter Design finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!