/* Chebyshev1IIRDesignerTest.java created 2010-09-12
*
*/
package org.signalml.math.iirdesigner;
import org.apache.commons.math.complex.Complex;
import static org.signalml.math.iirdesigner.IIRDesignerAssert.*;
import org.junit.Test;
import org.signalml.math.iirdesigner.BadFilterParametersException;
import org.signalml.math.iirdesigner.Chebyshev1IIRDesigner;
import org.signalml.math.iirdesigner.FilterCoefficients;
import org.signalml.math.iirdesigner.FilterType;
import org.signalml.math.iirdesigner.FilterZerosPolesGain;
import java.lang.Math.*;
/**
* This class perfoms unit test on {@link Chebyshev1IIRDesigner} class.
* @author Piotr Szachewicz
*/
public class Chebyshev1IIRDesignerTest {
/**
* this Chebyshev1IIRDesigner is needed to call all the tested methods.
*/
Chebyshev1IIRDesigner iirdesigner = new Chebyshev1IIRDesigner();
/**
* Test method for {@link Chebyshev1IIRDesigner#calculatePrototype(int, double) }.
*/
@Test
public void testCalculateChebyshev1Prototype() {
FilterZerosPolesGain zpk1 = iirdesigner.calculatePrototype(3, 3);
Complex[] zeros = new Complex[0];
Complex[] poles = new Complex[] {new Complex(-0.14931010, 9.03814429e-01), new Complex(-0.29862021, 6.39042136e-17),
new Complex(-0.14931010, -9.03814429e-01)
};
FilterZerosPolesGain zpk2 = new FilterZerosPolesGain(zeros, poles, 0.25059432325190018);
assertEquals(zpk1, zpk2);
}
/**
* Test method for {@link Chebyshev1IIRDesigner#designDigitalFilter(org.signalml.math.iirdesigner.FilterType, double[], double[], double, double) }.
*/
@Test
public void testDesignDigitalFilter() throws BadFilterParametersException {
double[] pythonB;
double[] pythonA;
FilterCoefficients coeffs;
//lowpass test
pythonB = new double[] {7.02019760e-05, 2.80807904e-04, 4.21211856e-04,
2.80807904e-04, 7.02019760e-05
};
pythonA = new double[] {1.0, -3.72214229, 5.29043743,
-3.39981985, 0.83311132
};
coeffs = iirdesigner.designDigitalFilter(FilterType.LOWPASS, new double[] {0.1}, new double[] {0.2}, 3.0, 40.0);
assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-8);
//highpass
pythonB = new double[] {0.25733687, -0.25733687};
pythonA = new double[] {1.0, 0.48532626};
coeffs = iirdesigner.designDigitalFilter(FilterType.HIGHPASS, new double[] {0.7}, new double[] {0.2}, 5.0, 10.0);
assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-4);
//bandpass test
pythonB = new double[] {0.18097462, 0.0, -0.18097462};
pythonA = new double[] {1.00000000e+00, -1.81860167e-16, 6.38050764e-01};
coeffs = iirdesigner.designDigitalFilter(FilterType.BANDPASS, new double[] {0.4, 0.6}, new double[] {0.2, 0.8}, 5.0, 10.0);
assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-4);
//bandstop test
pythonB = new double[] {3.30701236e-01, -1.60021832e-07, 3.30701236e-01};
pythonA = new double[] {1.00000000e+00, -1.60021832e-07, -3.38597528e-01};
coeffs = iirdesigner.designDigitalFilter(FilterType.BANDSTOP, new double[] {0.2, 0.8}, new double[] {0.4, 0.6}, 5.0, 10.0);
assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-4);
}
/**
* Test method for {@link Chebyshev1IIRDesigner#calculateNaturalFrequency(org.signalml.math.iirdesigner.FilterType, int, double[], double[], double, double, boolean) }.
*/
@Test
public void testCalculateNaturalFrequency() {
double[] wn = iirdesigner.calculateNaturalFrequency(FilterType.BANDPASS, 10, new double[] {0.6, 0.7}, new double[] {0.55, 0.8}, 0.5, 100, true);
assertEquals(new double[] {0.6, 0.7}, wn, 1e-16);
wn = iirdesigner.calculateNaturalFrequency(FilterType.BANDPASS, 10, new double[] {0.6, 0.7}, new double[] {0.55, 0.8}, 0.5, 100, false);
assertEquals(new double[] {0.6, 0.7}, wn, 1e-16);
}
/**
* Test method for {@link Chebyshev1IIRDesigner#calculateFilterOrder(org.signalml.math.iirdesigner.FilterType, double[], double[], double, double, boolean) }.
*/
@Test
public void testCalculateFilterOrder() throws BadFilterParametersException {
int filterOrder;
//digital lowpass
filterOrder = iirdesigner.calculateFilterOrder(FilterType.LOWPASS, 0.4, 0.7, 3, 40, false);
assertEquals(4, filterOrder);
//digital highpass
filterOrder = iirdesigner.calculateFilterOrder(FilterType.HIGHPASS, 0.7, 0.3, 1, 80, false);
assertEquals(6, filterOrder);
//digital bandstop
filterOrder = iirdesigner.calculateFilterOrder(FilterType.BANDSTOP, new double[] {0.5, 0.8}, new double[] {0.6, 0.7}, 0.5, 100, false);
assertEquals(8, filterOrder);
//analog bandpass
filterOrder = iirdesigner.calculateFilterOrder(FilterType.BANDPASS, new double[] {0.6, 0.7}, new double[] {0.55, 0.8}, 0.5, 100, true);
assertEquals(10, filterOrder);
}
}