Пример #1
0
 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);
 }
Пример #2
0
 public void Copy(CpbSetup setup)
 {
     lowFrequency      = setup.lowFrequency;
     highFrequency     = setup.highFrequency;
     filterType        = setup.filterType;
     samplingFrequency = setup.samplingFrequency;
     length            = setup.length;
 }
Пример #3
0
        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);
            }
        }