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); }
}//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); }
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; } }
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); } }
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); }
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); } }
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); }
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); }
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); }
public void SetFilter(BiQuad filter) { _sampleSource.Filter = filter; }
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); } } }
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; } } } } }
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; } } }
private void CreateFilter() { quad = new BiQuad(filterType, sampleRate, frequency, bandwidth); }