Index error when calling filter function

3 次查看(过去 30 天)
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.

采纳的回答

Anmol Dhiman
Anmol Dhiman 2020-6-21
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:
  1. Use the colon operator to generate indices: "-50:1:50".
  2. Use the function "round" on the output of "linspace" to make them integers.
Regards,
Anmol Dhiman

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Single-Rate Filters 的更多信息

产品


版本

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by