예제 #1
0
        void AFilterCoefficients()
        {
            iir     = new IIR();
            biQuads = new BiQuad[3];
            for (int i = 0; i < biQuads.Length; i++)
            {
                biQuads[i] = new BiQuad();
            }

            biQuads[0].a0 = 1;
            biQuads[0].a1 = -1.34730722798;
            biQuads[0].a1 = -1.34730722798;
            biQuads[0].a2 = 0.349057529796;
            biQuads[0].b0 = 0.965250965250;
            biQuads[0].b1 = -1.34730163086;
            biQuads[0].b2 = 0.382050665614;

            biQuads[1].a0 = 1;
            biQuads[1].a1 = -1.89387049481;
            biQuads[1].a2 = 0.895159769170;
            biQuads[1].b0 = 0.946969696969;
            biQuads[1].b1 = -1.89393939393;
            biQuads[1].b2 = 0.946969696969;

            biQuads[2].a0 = 1;
            biQuads[2].a1 = -1.34730722798;
            biQuads[2].a2 = 0.349057529796;
            biQuads[2].b0 = 0.646665428100;
            biQuads[2].b1 = -0.38362237137;
            biQuads[2].b2 = -0.26304305672;

            iir.Init(biQuads, biQuads.Length);
        }
예제 #2
0
        }//COMPUTE

        private void coefficientBandPass(int order, double omega0, double omega1)
        {
            Complex[] poles = complexPolesBandPass(order, omega0, omega1);
            poles           = billinearTransformPoles(poles);
            biQuadsSections = new BiQuad[order];
            Parallel.For(0, poles.Length, k =>
            {
                biQuadsSections[k] = new BiQuad(0, -1, -2 * poles[k].re, Complex.AbsSqr(poles[k]));
            });
            if (order % 2 != 0)
            {
                double  omega2 = Math.Sqrt(omega0 * omega1);
                double  p      = -(omega1 - omega0) / omega2;
                Complex pole;
                if (Math.Abs(p) > 2)
                {
                    double u = Math.Sqrt(-4 * Math.Pow(p, 2));
                    pole = 0.5 * omega2 * new Complex(p - u, 0);
                }
                else
                {
                    double u = Math.Sqrt(4 - Math.Pow(p, 2));
                    pole = 0.5 * omega2 * new Complex(p - u, 0);
                }
                pole = billinearTransformPoles(pole);
                biQuadsSections[poles.Length] = new BiQuad(0, -1, -2 * pole.re, Complex.AbsSqr(pole));
            }
            double omega = 2 * Math.Atan(omega0 * omega1);

            biQuadsSections = normalizationBiQuadsSections(biQuadsSections, omega);
        }
예제 #3
0
        public override void tick()
        {
            if (!_active)
            {
                return;
            }

            SignalBuffer dbin  = getSignalInputBuffer(ioIn);
            SignalBuffer dbout = getSignalOutputBuffer(ioOut);

            if (!active)
            {
                if ((dbin != null) && (dbout != null))
                {
                    dbout.CopyFrom(dbin);
                }
                return;
            }
            SignalBuffer dbf = getSignalInputBuffer(ioF);
            SignalBuffer dbq = getSignalInputBuffer(ioQ);

            if (dbout == null)
            {
                return;
            }
            if (dbin == null)
            {
                return;
            }

            if (filter == null)
            {
                if (HighPass)
                {
                    filter = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.HighPass, Math.Sqrt(f1 * f2), Math.Pow(10, (q1 + q2) / 2 / 20));
                }
                else
                {
                    filter = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, Math.Sqrt(f1 * f2), Math.Pow(10, (q1 + q2) / 2 / 20));
                }
            }

            for (int i = 0; i < owner.blockSize; i++)
            {
                double fin = (dbf != null) ? dbf.data[i] : 0;
                double qin = (dbq != null) ? dbq.data[i] : 0;
                double sig = (dbin != null) ? dbin.data[i]:0;
                fin = f1 * Math.Pow(f2 / f1, (fin + 1.0) / 2.0);
                qin = Math.Pow(10, (q1 + (q2 - q1) * (qin + 1.0) / 2) / 20);
                filter.frequency = fin;
                filter.Q         = qin;
                sig           = filter.filter(sig);
                dbout.data[i] = sig;
            }
        }
예제 #4
0
 public VisualizerCSCoreFilter(FilterType type, int sampleRate, double frequency)
 {
     if (type == FilterType.High)
     {
         m_Filter = new HighpassFilter(sampleRate, frequency);
     }
     else
     {
         m_Filter = new LowpassFilter(sampleRate, frequency);
     }
 }
예제 #5
0
 private void coefficientLowPass(int order, double omega)
 {
     Complex[] poles = complexPolesLowPass(order, omega);
     poles           = billinearTransformPoles(poles);
     biQuadsSections = new BiQuad[(order + 1) / 2];
     Parallel.For(0, poles.Length, k =>
     {
         biQuadsSections[k] = new BiQuad(0, -1, -2 * poles[k].re, Complex.AbsSqr(poles[k]));
     });
     if (order % 2 != 0)
     {
         double pole = billinearTransformOmega(omega);
         biQuadsSections[poles.Length] = new BiQuad(1, 0, -pole, 0);
     }
     biQuadsSections = normalizationBiQuadsSections(biQuadsSections, omega);
 }
예제 #6
0
 public void AddFilter(BiQuad filter, int index)
 {
     if (_BandFrecuencies.ContainsKey(index))
     {
         _BandFrecuencies.TryGetValue(index, out var filterList);
         filterList.Add(filter);
         _BandFrecuencies.Remove(index);
         _BandFrecuencies.Add(index, filterList);
     }
     else
     {
         var filterList = new List <BiQuad>();
         filterList.Add(filter);
         _BandFrecuencies.Add(index, filterList);
     }
 }
예제 #7
0
        private void CalculateFilterCoefficientsLP(int order, double omega0)
        {
            Complex[] poles = GetComplexPolesLP(order, omega0);

            BilinearTransform(poles);

            biQuads = new BiQuad[(order + 1) / 2];

            for (int i = 0; i < poles.Length; i++)
            {
                biQuads[i] = new BiQuad(2, 1, -2 * poles[i].re, Complex.AbsSqr(poles[i]));
            }

            if (order % 2 != 0)
            {
                double pole = BilinearTransform(-omega0);
                biQuads[poles.Length] = new BiQuad(1, 0, -pole, 0);
            }

            NormalizeBiQuads(biQuads, 0);
        }
예제 #8
0
파일: EqFilter.cs 프로젝트: yazici/AudioLab
        public EqFilter(int sampleRate, double centerFrequency, float bandWidth, float gain)
        {
            if (sampleRate <= 0)
            {
                throw new ArgumentOutOfRangeException("sampleRate");
            }
            if (centerFrequency <= 0)
            {
                throw new ArgumentOutOfRangeException("centerFrequency");
            }
            if (bandWidth <= 0)
            {
                throw new ArgumentOutOfRangeException("bandWidth");
            }

            _sampleRate      = sampleRate;
            _centerFrequency = centerFrequency;
            _bandWidth       = bandWidth;
            _gain            = gain;

            _filter = BiQuad.CreatePeakEQFilter(sampleRate, centerFrequency, bandWidth, gain);
        }
예제 #9
0
        private void CalculateFilterCoefficientsBP(int order, double omega0, double omega1)
        {
            Complex[] poles = GetComplexPolesBP(order, omega0, omega1);

            BilinearTransform(poles);

            biQuads = new BiQuad[order];

            for (int i = 0; i < poles.Length; i++)
            {
                biQuads[i] = new BiQuad(0, -1, -2 * poles[i].re, Complex.AbsSqr(poles[i]));
            }

            if (order % 2 != 0)
            {
                double  omega2 = Math.Sqrt(omega0 * omega1);
                double  p      = -(omega1 - omega0) / omega2;
                Complex pole;
                if (Math.Abs(p) > 2)
                {
                    double u = Math.Sqrt(-4 + Math.Pow(p, 2));
                    pole = 0.5 * omega2 * new Complex(p - u, 0);
                }
                else
                {
                    double u = Math.Sqrt(4 - Math.Pow(p, 2));
                    pole = 0.5 * omega2 * new Complex(p, u);
                }
                pole = BilinearTransform(pole);
                biQuads[poles.Length] = new BiQuad(0, -1, -2 * pole.re, Complex.AbsSqr(pole));
            }

            double omegaRef = 2 * Math.Atan(Math.Sqrt(omega0 * omega1));

            NormalizeBiQuads(biQuads, omegaRef);
        }
예제 #10
0
 public void SetFilter(BiQuad filter)
 {
     _sampleSource.Filter = filter;
 }
예제 #11
0
        public override void tick()
        {
            if (!_active)
            {
                return;
            }

            SignalBuffer IN  = getSignalInputBuffer(ioIn);
            SignalBuffer SIN = getSignalInputBuffer(ioRef0);
            SignalBuffer COS = getSignalInputBuffer(ioRef90);

            SignalBuffer OUTI = getSignalOutputBuffer(ioOI);
            SignalBuffer OUTQ = getSignalOutputBuffer(ioOQ);
            SignalBuffer OUTA = getSignalOutputBuffer(ioA);

            if ((IN == null) || (SIN == null) || (COS == null))
            {
                return;
            }
            if ((OUTI == null) && (OUTQ == null) && (OUTA == null))
            {
                return;
            }

            if (stage1a == null)
            {
                stage1a      = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc, Math.Sqrt(Math.Sqrt(2)));
                stage2a      = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc, Math.Sqrt(Math.Sqrt(2)));
                stage1b      = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc, Math.Sqrt(Math.Sqrt(2)));
                stage2b      = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc, Math.Sqrt(Math.Sqrt(2)));
                updateNeeded = false;
            }
            if (updateNeeded)
            {
                stage1a.frequency = fc;
                stage1b.frequency = fc;
                stage2a.frequency = fc;
                stage2b.frequency = fc;
                updateNeeded      = false;
            }

            for (int i = 0; i < owner.blockSize; i++)
            {
                sval = SIN.data[i] * IN.data[i];
                cval = COS.data[i] * IN.data[i];

                double sout = stage2a.filter(stage1a.filter(sval));
                double cout = stage2b.filter(stage1b.filter(cval));

                if (OUTI != null)
                {
                    OUTI.data[i] = sout;
                }
                if (OUTQ != null)
                {
                    OUTQ.data[i] = cout;
                }
                if (OUTA != null)
                {
                    OUTA.data[i] = Math.Sqrt(sout * sout + cout * cout);
                }
            }
        }
예제 #12
0
        public override void tick()
        {
            if (!_active)
            {
                return;
            }

            SignalBuffer[] sin  = new SignalBuffer[inputs];
            SignalBuffer[] sout = new SignalBuffer[inputs];

            if (inputs >= 1)
            {
                sin[0] = getSignalInputBuffer(ioI1); sout[0] = getSignalOutputBuffer(ioO1);
            }
            if (inputs >= 2)
            {
                sin[1] = getSignalInputBuffer(ioI2); sout[1] = getSignalOutputBuffer(ioO2);
            }
            if (inputs >= 3)
            {
                sin[2] = getSignalInputBuffer(ioI3); sout[2] = getSignalOutputBuffer(ioO3);
            }
            if (inputs >= 4)
            {
                sin[3] = getSignalInputBuffer(ioI4); sout[3] = getSignalOutputBuffer(ioO4);
            }
            if (inputs >= 5)
            {
                sin[4] = getSignalInputBuffer(ioI5); sout[4] = getSignalOutputBuffer(ioO5);
            }
            if (inputs >= 6)
            {
                sin[5] = getSignalInputBuffer(ioI6); sout[5] = getSignalOutputBuffer(ioO6);
            }
            if (inputs >= 7)
            {
                sin[6] = getSignalInputBuffer(ioI7); sout[6] = getSignalOutputBuffer(ioO7);
            }
            if (inputs >= 8)
            {
                sin[7] = getSignalInputBuffer(ioI8); sout[7] = getSignalOutputBuffer(ioO8);
            }

            const double a = 0.7;

            // const double b = 0.7;

            if (filter50 == null)
            {
                filter50 = new BiQuad[inputs];
                for (int i = 0; i < inputs; i++)
                {
                    filter50[i] = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.BandPass, 50, a);
                }
            }
            if (filter150 == null)
            {
                filter150 = new BiQuad[inputs];
                for (int i = 0; i < inputs; i++)
                {
                    filter150[i] = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.BandPass, 150, a);
                }
            }
            if (filter500 == null)
            {
                filter500 = new BiQuad[inputs];
                for (int i = 0; i < inputs; i++)
                {
                    filter500[i] = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.BandPass, 500, a);
                }
            }
            if (filter1k5 == null)
            {
                filter1k5 = new BiQuad[inputs];
                for (int i = 0; i < inputs; i++)
                {
                    filter1k5[i] = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.BandPass, 1500, a);
                }
            }
            if (filter5k == null)
            {
                filter5k = new BiQuad[inputs];
                for (int i = 0; i < inputs; i++)
                {
                    filter5k[i] = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.BandPass, 5000, a);
                }
            }
            if (filter15k == null)
            {
                filter15k = new BiQuad[inputs];
                for (int i = 0; i < inputs; i++)
                {
                    filter15k[i] = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.BandPass, 15000, a);
                }
            }


            for (int i = 0; i < inputs; i++)
            {
                if (sin[i] != null)
                {
                    for (int j = 0; j < owner.blockSize; j++)
                    {
                        double din  = sin[i].data[j];
                        double a50  = filter50[i].filter(din);
                        double a150 = filter150[i].filter(din);
                        double a500 = filter500[i].filter(din);
                        double a1k5 = filter1k5[i].filter(din);
                        double a5k  = filter5k[i].filter(din);
                        double a15k = filter15k[i].filter(din);
                        if (sout[i] != null)
                        {
                            sout[i].data[j] = din + a50 * g50d + a150 * g150d + a500 * g500d + a1k5 * g1k5d + a5k * g5kd + a15k * g15kd;
                        }
                    }
                }
            }
        }
예제 #13
0
        public override void tick()
        {
            if (!_active)
            {
                return;
            }

            if (loopstage == null)
            {
                loopstage = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LoopFilter, fl, 1.0 / Math.Sqrt(2), 1000);

                fclpa = new BiQuadC(owner.sampleRate, BiQuadC.BiQuadOrder.Second, BiQuadC.BiQuadMode.LowPass, fc * 1.2, 1.0 / Math.Sqrt(2));
                fclpb = new BiQuadC(owner.sampleRate, BiQuadC.BiQuadOrder.Second, BiQuadC.BiQuadMode.LowPass, fc * 1.2, 1.0);
                fchpa = new BiQuadC(owner.sampleRate, BiQuadC.BiQuadOrder.Second, BiQuadC.BiQuadMode.HighPass, fc / 1.2, 1.0 / Math.Sqrt(2));
                fchpb = new BiQuadC(owner.sampleRate, BiQuadC.BiQuadOrder.Second, BiQuadC.BiQuadMode.HighPass, fc / 1.2, 1.0);

                //lp1 = new BiQuadC(owner.sampleRate, BiQuadC.BiQuadOrder.Second, BiQuadC.BiQuadMode.LowPass, fc / 2, 1.0 / Math.Sqrt(2));
                //lp2 = new BiQuadC(owner.sampleRate, BiQuadC.BiQuadOrder.Second, BiQuadC.BiQuadMode.LowPass, fc / 2, 1.0);
                lp1 = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc / 2, 1.0 / Math.Sqrt(2));
                lp2 = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc / 2, 1.0);
                lp3 = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc / 2, 1.0 / Math.Sqrt(2));
                lp4 = new BiQuad(owner.sampleRate, BiQuad.BiQuadOrder.Second, BiQuad.BiQuadMode.LowPass, fc / 2, 1.0);

                updateNeeded = false;
            }

            if (updateNeeded)
            {
                loopstage.frequency = fl;
                loopstage.KA        = Math.Pow(10, KA / 20);

                fclpa.frequency = fc * 1.2;
                fclpb.frequency = fc * 1.2;

                fchpa.frequency = fc / 1.2;
                fchpb.frequency = fc / 1.2;

                lp1.frequency = fc / 2;
                lp2.frequency = fc / 2;
                lp3.frequency = fc / 2;
                lp4.frequency = fc / 2;

                updateNeeded = false;
            }

            SignalBuffer INI = getSignalInputBuffer(ioII);
            SignalBuffer INQ = getSignalInputBuffer(ioIQ);

            SignalBuffer OUTI = getSignalOutputBuffer(ioOI);
            SignalBuffer OUTQ = getSignalOutputBuffer(ioOQ);
            SignalBuffer OUTA = getSignalOutputBuffer(ioA);
            SignalBuffer OUTF = getSignalOutputBuffer(ioF);

            for (int i = 0; i < owner.blockSize; i++)
            {
                double  ini = (INI != null) ? INI.data[i] : 0.0;
                double  inq = (INQ != null) ? INQ.data[i] : 0.0;
                Complex inv = new Complex(ini, inq);

                Complex inf  = fclpa.filter(fclpb.filter(fchpa.filter(fchpb.filter(inv))));
                double  infa = inf.abs;

                double sval = Math.Sin(phs);
                double cval = Math.Cos(phs);

                double lin  = Complex.arg(inf * Complex.conj(Complex.exp(new Complex(0, phs))));
                double lout = loopstage.filter(lin);

                phs  = lout;
                phs -= 2 * Math.PI * Math.Floor(phs / (2 * Math.PI));

                double xr = sval * ini + cval * inq;
                double xi = sval * inq - cval * ini;

                // Complex o = lp2.filter(lp1.filter(new Complex(xr, xi)));
                double o = lp2.filter(lp1.filter(Math.Abs(xr * xr + xi * xi)));
                double p = lp4.filter(lp3.filter(Math.Atan2(xi, xr)));

                if (OUTI != null)
                {
                    OUTI.data[i] = sval;
                }
                if (OUTQ != null)
                {
                    OUTQ.data[i] = cval;
                }
                if (OUTA != null)
                {
                    // OUTA.data[i] = o.abs;
                    OUTA.data[i] = o;
                }
                if (OUTF != null)
                {
                    OUTF.data[i] = p; //  o.phi;
                }
            }
        }
예제 #14
0
파일: Filter.cs 프로젝트: eriser/noisevst
		private void CreateFilter()
		{
			quad = new BiQuad(filterType, sampleRate, frequency, bandwidth);
		}