public static void ProcessBiquadFilter(ReadOnlySpan <BiquadFilterParameter> parameters, Span <BiquadFilterState> states, Span <float> outputBuffer, ReadOnlySpan <float> inputBuffer, uint sampleCount) { for (int stageIndex = 0; stageIndex < parameters.Length; stageIndex++) { BiquadFilterParameter parameter = parameters[stageIndex]; ref BiquadFilterState state = ref states[stageIndex]; float a0 = FixedPointHelper.ToFloat(parameter.Numerator[0], FixedPointPrecisionForParameter); float a1 = FixedPointHelper.ToFloat(parameter.Numerator[1], FixedPointPrecisionForParameter); float a2 = FixedPointHelper.ToFloat(parameter.Numerator[2], FixedPointPrecisionForParameter); float b1 = FixedPointHelper.ToFloat(parameter.Denominator[0], FixedPointPrecisionForParameter); float b2 = FixedPointHelper.ToFloat(parameter.Denominator[1], FixedPointPrecisionForParameter); for (int i = 0; i < sampleCount; i++) { float input = inputBuffer[i]; float output = input * a0 + state.State0 * a1 + state.State1 * a2 + state.State2 * b1 + state.State3 * b2; state.State1 = state.State0; state.State0 = input; state.State3 = state.State2; state.State2 = output; outputBuffer[i] = output; } }
/// <summary> /// Create a new <see cref="BiquadFilterCommand"/>. /// </summary> /// <param name="baseIndex">The base index of the input and output buffer.</param> /// <param name="filter">The biquad filter parameter.</param> /// <param name="biquadFilterStateMemory">The biquad state.</param> /// <param name="inputBufferOffset">The input buffer offset.</param> /// <param name="outputBufferOffset">The output buffer offset.</param> /// <param name="needInitialization">Set to true if the biquad filter state needs to be initialized.</param> /// <param name="nodeId">The node id associated to this command.</param> public void GenerateBiquadFilter(int baseIndex, ref BiquadFilterParameter filter, Memory <BiquadFilterState> biquadFilterStateMemory, int inputBufferOffset, int outputBufferOffset, bool needInitialization, int nodeId) { BiquadFilterCommand command = new BiquadFilterCommand(baseIndex, ref filter, biquadFilterStateMemory, inputBufferOffset, outputBufferOffset, needInitialization, nodeId); command.EstimatedProcessingTime = _commandProcessingTimeEstimator.Estimate(command); AddCommand(command); }
public BiquadFilterCommand(int baseIndex, ref BiquadFilterParameter filter, Memory <BiquadFilterState> biquadFilterStateMemory, int inputBufferOffset, int outputBufferOffset, bool needInitialization, int nodeId) { _parameter = filter; BiquadFilterState = biquadFilterStateMemory; InputBufferIndex = baseIndex + inputBufferOffset; OutputBufferIndex = baseIndex + outputBufferOffset; NeedInitialization = needInitialization; Enabled = true; NodeId = nodeId; }
public static void ProcessBiquadFilter(ref BiquadFilterParameter parameter, ref BiquadFilterState state, Span <float> outputBuffer, ReadOnlySpan <float> inputBuffer, uint sampleCount) { float a0 = FixedPointHelper.ToFloat(parameter.Numerator[0], FixedPointPrecisionForParameter); float a1 = FixedPointHelper.ToFloat(parameter.Numerator[1], FixedPointPrecisionForParameter); float a2 = FixedPointHelper.ToFloat(parameter.Numerator[2], FixedPointPrecisionForParameter); float b1 = FixedPointHelper.ToFloat(parameter.Denominator[0], FixedPointPrecisionForParameter); float b2 = FixedPointHelper.ToFloat(parameter.Denominator[1], FixedPointPrecisionForParameter); for (int i = 0; i < sampleCount; i++) { float input = inputBuffer[i]; float output = input * a0 + state.State0; state.State0 = input * a1 + output * b1 + state.State1; state.State1 = input * a2 + output * b2; outputBuffer[i] = output; } }