I am using the Digital Filter with properties in MATLAB. I have designed this filter using designfilt. I have defined the filter object filt(1) as:
digitalFilter with properties:
Coefficients: [20x6 double]
Specifications:
FrequencyResponse: 'bandpass'
ImpulseResponse: 'iir'
SampleRate: 1000
PassbandFrequency1: 59.9000
PassbandRipple: 3
StopbandAttenuation2: 80
StopbandAttenuation1: 80
PassbandFrequency2: 60.0800
FilterOrder: 40
DesignMethod: 'ellip'
Similarly, I have other filters under filt object as filt(2), filt(3) upto filt(8) each at different frequencies.
Now, for some reason I get the error, when my program tries to run the line:
Q = filter(filt(1),x);
where, x is a 600000x1 column vector with only positive and negative real values (resembling a long sine wave)
The error that I get is:
Subscript indices must either be real positive integers or logicals.
Error in digitalFilter/filter (line 870)
y = obj.FilterFunction(obj.Coefficients,x);
Could anyone please point out the problem? Thanks a lot.
EDIT:
The
designfilt
command opens up an interactive interface where you can change and tune your filter requirements. I have optimized the filters, and saved the results as a .mat file. [This whole program used to work, was part of a significant project which we completed succesfully, but after a year doesn't seem to work somehow.]
I have attached the filter_8th.mat file. There are various filters here. I have already created these filters before hand because Matlab takes a lot of time to create these.
In this .mat file, the filter objects are named as D_n1_50, D_n1_60, D_sig50, D_sig60 etc. (easily recognizable from the Workspace.)
The line of code that assigns these filter to the variable filt is, for example:
filt = D_sig50
This is being selected in a loop. Which filter will be selected depends on a conditional if-else structure.
the .mat file containing "filters" and the variable "x" are in this dropbox link:
The issue has been resolved. This is due to the absence of the filter object fields:
FilterFunction:
FiltfiltFunction:
GetCoefficientsForAnalysisFunction:
In MATLAB 2015a these fields are absent from the filters objects. But in MATLAB 2016a (which is I am using, these fields seem to be required.) As the files were imported after creation in MATLAB 2015a, that seems to be the problem. Recreating, the fields in MATLAB 2016a solved the issue. The fields have also been created.
The code ran to check:
filt = D_sig50(1);
sf = struct(filt) ;
sf.FilterFunction
Created in MATLAB 2015a: output:
FilterFunction: []
FiltfiltFunction: []
GetCoefficientsForAnalysisFunction: []
These fields in the filter object are empty (after loading these filters in MATLAB 2016a)
Created in MATLAB 2016a:
FilterFunction: @filterIIR
FiltfiltFunction: @filtfiltIIR
GetCoefficientsForAnalysisFunction: @getCoeffsForAnalysisIIR
The fields are now present in the filter object, and the code works now.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments