public int Init(int length, OctaveFilterType filterType, int lowFrequency, int highFrequency, int samplingFrequency) { filterBank = new CPBFilterBank(filterType, lowFrequency, highFrequency, samplingFrequency); filterBank.Init(); input = new double[length]; filterBank.Input = input; return(filterBank.filters.Length); }
public void Copy(CpbSetup setup) { lowFrequency = setup.lowFrequency; highFrequency = setup.highFrequency; filterType = setup.filterType; samplingFrequency = setup.samplingFrequency; length = setup.length; }
public CPBFilterBank(OctaveFilterType filterType, double lowFc, double highFc, int fs) { this.filterType = filterType; int bw; switch (filterType) { case OctaveFilterType.Octave: bw = 1; break; case OctaveFilterType.ThirdOctave: bw = 3; break; case OctaveFilterType.TwelfthOctave: bw = 12; break; case OctaveFilterType.TwentyfourthOctave: bw = 24; break; default: bw = 0; break; } lowIndex = (int)Math.Round((Math.Log10(lowFc / 1000) / Math.Log10(2) + 10) * bw); highIndex = (int)Math.Round((Math.Log10(highFc / 1000) / Math.Log10(2) + 10) * bw); noFilters = highIndex - lowIndex + 1; filters = new ButterworthFilter[noFilters]; double bandwidthFactor = Math.Pow(2, 0.5 / bw); double rel = (bandwidthFactor - 1 / bandwidthFactor) / (Math.PI / 3) / 2; bandwidthFactor = rel + Math.Sqrt(Math.Pow(rel, 2) + 1); for (int i = 0; i < noFilters; i++) { double fCenter = 1000 * Math.Pow(Math.Pow(2, 1.0 / bw), i + lowIndex - 10 * bw); double fLower = fCenter / bandwidthFactor; double fUpper = fCenter * bandwidthFactor; filters[i] = new ButterworthFilter(FilterType.BP, 3, fLower, fUpper, fs); } }