01: /*
02: * Copyright (c) 2000 Silvere Martin-Michiellot All Rights Reserved.
03: *
04: * Silvere Martin-Michiellot grants you ("Licensee") a non-exclusive,
05: * royalty free, license to use, modify and redistribute this
06: * software in source and binary code form,
07: * provided that i) this copyright notice and license appear on all copies of
08: * the software; and ii) Licensee does not utilize the software in a manner
09: * which is disparaging to Silvere Martin-Michiellot.
10: *
11: * This software is provided "AS IS," without a warranty of any kind. ALL
12: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
13: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
14: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. Silvere Martin-Michiellot
15: * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
16: * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
17: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
18: * Silvere Martin-Michiellot OR ITS LICENSORS BE LIABLE
19: * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
20: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
21: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
22: * OR INABILITY TO USE SOFTWARE, EVEN IF Silvere Martin-Michiellot HAS BEEN
23: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
24: *
25: * This software is not designed or intended for use in on-line control of
26: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
27: * the design, construction, operation or maintenance of any nuclear
28: * facility. Licensee represents and warrants that it will not use or
29: * redistribute the Software for such purposes.
30: *
31: */
32:
33: // This code is repackaged after the code from Craig A. Lindley, from Digital Audio with Java
34: // Site ftp://ftp.prenhall.com/pub/ptr/professional_computer_science.w-022/digital_audio/
35: // Email
36: package com.db.media.audio.dsp.filter;
37:
38: // The IIR bandpass filter designed here has unity gain
39: public class IIRBandpassFilterDesign extends IIRFilterDesignBase {
40:
41: public IIRBandpassFilterDesign(int centerFrequency, int sampleRate,
42: double q) {
43:
44: super (centerFrequency, sampleRate, q);
45:
46: }
47:
48: // Do the design of the filter. Filter response controlled by
49: // just three coefficients: alpha, beta and gamma.
50: public void doFilterDesign() {
51:
52: // thetaZero = 2 * Pi * Freq * T or (2 * Pi * Freq) / sampleRate
53: // where Freq is center frequency of bandpass filter
54: double thetaZero = getThetaZero();
55:
56: double theTan = Math.tan(thetaZero / (2.0 * parameter));
57:
58: // Beta relates gain to bandwidth (and therefore q) at -3 db points
59: beta = 0.5 * ((1.0 - theTan) / (1.0 + theTan));
60:
61: // For unity gain at center frequency
62: alpha = (0.5 - beta) / 2.0;
63:
64: // Final filter coefficient
65: gamma = (0.5 + beta) * Math.cos(thetaZero);
66:
67: }
68:
69: // Entry point for testing
70: public static void main(String[] args) {
71:
72: if (args.length != 3) {
73: System.out.println("\nIIR Bandpass Filter Design Program");
74: System.out.println("\nUsage:");
75: System.out.println("\tIIRBandpassFilterDesign "
76: + "centerFrequency sampleRate q");
77:
78: System.exit(1);
79: }
80: // Parse the command line arguments
81: int centerFrequency = new Integer(args[0]).intValue();
82: int sampleRate = new Integer(args[1]).intValue();
83: double q = new Double(args[2]).doubleValue();
84:
85: // Instantiate bandpass filter designer
86: IIRBandpassFilterDesign d = new IIRBandpassFilterDesign(
87: centerFrequency, sampleRate, q);
88: // Do the design
89: d.doFilterDesign();
90:
91: // Print out the coefficients
92: d.printCoefficients();
93:
94: }
95:
96: }
|