- 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 次查看(过去 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.
0 个评论
采纳的回答
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:
Regards,
Anmol Dhiman
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Single-Rate Filters 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!