/* Chebyshev2IIRDesignerTest.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.Chebyshev2IIRDesigner; import org.signalml.math.iirdesigner.FilterCoefficients; import org.signalml.math.iirdesigner.FilterType; import org.signalml.math.iirdesigner.FilterZerosPolesGain; import java.lang.Math.*; /** * This class performs unit tests on {@link Chebyshev2IIRDesigner} * * @author Piotr Szachewicz */ public class Chebyshev2IIRDesignerTest { /** * an instance of {@link Chebyshev2IIRDesigner} needed to all the tested methods */ Chebyshev2IIRDesigner iirdesigner = new Chebyshev2IIRDesigner(); /** * Test method for {@link Chebyshev2IIRDesigner#calculatePrototype(int, double) }. */ @Test public void testCalculateChebyshev2Prototype() { FilterZerosPolesGain zpk1 = iirdesigner.calculatePrototype(3, 3); Complex[] zeros = new Complex[] {new Complex(0.0, -1.15470054), new Complex(0.0, 1.15470054)}; Complex[] poles = new Complex[] {new Complex(-0.17737632,-1.07757832), new Complex(-3.36188451, -1.44406328e-15), new Complex(-0.17737632, 1.07757832) }; FilterZerosPolesGain zpk2 = new FilterZerosPolesGain(zeros, poles, 3.0071318790228005); assertEquals(zpk1, zpk2); } /** * Test method for {@link Chebyshev2IIRDesigner#designDigitalFilter(org.signalml.math.iirdesigner.FilterType, double[], double[], double, double) }. */ @Test public void testDesignDigitalFilter() throws BadFilterParametersException { //lowpass double[] pythonB = new double[] {0.01234417, -0.02387048, 0.03168035, -0.02387048, 0.01234417}; double[] pythonA = new double[] {1.0, -3.14621235, 3.78629474, -2.05495604, 0.42350137}; FilterCoefficients coeffs = iirdesigner.designFilter(FilterType.LOWPASS, new double[] {0.1}, new double[] {0.2}, 3.0, 40.0, false); assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-8); //highpass pythonB = new double[] {0.07021058, -0.14279096, 0.14279096, -0.07021058}; pythonA = new double[] {1.0, 1.12978612, 0.68657296, 0.13078377}; coeffs = iirdesigner.designDigitalFilter(FilterType.HIGHPASS, new double[] {0.7}, new double[] {0.2}, 3.0, 40.0); assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-8); //bandpass pythonB = new double[] {3.49030352e-02, 1.99241721e-02, -3.69150532e-02, -4.45893421e-18, 3.69150532e-02, -1.99241721e-02, -3.49030352e-02 }; pythonA = new double[] {1.0, 1.53977953, 2.54604688, 2.03168879, 1.68294636, 0.64377119, 0.27144655 }; coeffs = iirdesigner.designDigitalFilter(FilterType.BANDPASS, new double[] {0.5, 0.7}, new double[] {0.3, 0.9}, 3.0, 40.0); assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-8); //bandstop pythonB = new double[] {0.16237092, 0.2964514, 0.61138715, 0.59303041, 0.61138715, 0.2964514, 0.16237092 }; pythonA = new double[] {1.0, 0.91835019, 0.14443493, 0.16130349, 0.41398049, 0.10627954, -0.0108993 }; coeffs = iirdesigner.designDigitalFilter(FilterType.BANDSTOP, new double[] {0.3, 0.9}, new double[] {0.5, 0.7}, 3.0, 40.0); assertEquals(new FilterCoefficients(pythonB, pythonA), coeffs, 1e-4); } /** * Test method for {@link Chebyshev2IIRDesigner#calculateNaturalFrequency(org.signalml.math.iirdesigner.FilterType, int, double[], double[], double, double, boolean) }. */ @Test public void testCalculateNaturalFrequency() throws BadFilterParametersException { double[] wna; double wn; //digital lowpass wn = iirdesigner.calculateNaturalFrequency(FilterType.LOWPASS, 7, 0.6, 0.9, 0.5, 100.0, false); assertEquals(0.86590513063084507, wn, 1e-8); //digital highpass wn = iirdesigner.calculateNaturalFrequency(FilterType.HIGHPASS, 4, 0.9, 0.1, 0.5, 100.0, false); assertEquals(0.27365521962463824, wn, 1e-8); //digital bandstop wna = iirdesigner.calculateNaturalFrequency(FilterType.BANDSTOP, 11, new double[] {0.5, 0.7}, new double[] {0.55, 0.65}, 0.5, 100, true); assertEquals(new double[] {0.54813224, 0.6522109}, wna, 1e-4); //digital bandpass wna = 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.55509301, 0.75662996}, wna, 1e-8); } }