Skip to content
Snippets Groups Projects

Add WDF allpass generator

Merged Oscar Gustafsson requested to merge wdfgenerator into master
Files
2
+ 26
20
@@ -3,11 +3,11 @@ B-ASIC signal flow graph generators.
This module contains a number of functions generating SFGs for specific functions.
"""
from typing import Dict, Optional, Union
from typing import Dict, Optional, Sequence, Union
import numpy as np
from b_asic.core_operations import SymmetricTwoportAdaptor
from b_asic.core_operations import Name, SymmetricTwoportAdaptor
from b_asic.port import InputPort, OutputPort
from b_asic.signal import Signal
from b_asic.signal_flow_graph import SFG
@@ -15,7 +15,7 @@ from b_asic.special_operations import Delay, Input, Output
def wdf_allpass(
coefficients: np.ndarray,
coefficients: Sequence[float],
input_op: Optional[Union[Input, Signal, InputPort]] = None,
output: Optional[Union[Output, Signal, OutputPort]] = None,
name: Optional[str] = None,
@@ -63,24 +63,30 @@ def wdf_allpass(
output = Output()
if name is None:
name = "WDF allpass section"
# First-order section
coeff = coefficients[0]
adaptor0 = SymmetricTwoportAdaptor(
coeff,
input_op,
latency=latency,
latency_offsets=latency_offsets,
execution_time=execution_time,
)
signal_out = Signal(adaptor0.output(0))
delay = Delay(adaptor0.output(1))
Signal(delay, adaptor0.input(1))
# prev_adaptor = adaptor0
order = len(coefficients)
odd_order = order % 2
if odd_order:
# First-order section
coeff = coefficients[0]
adaptor0 = SymmetricTwoportAdaptor(
coeff,
input_op,
latency=latency,
latency_offsets=latency_offsets,
execution_time=execution_time,
)
signal_out = Signal(adaptor0.output(0))
delay = Delay(adaptor0.output(1))
Signal(delay, adaptor0.input(1))
else:
signal_out = Signal(input_op)
# Second-order sections
sos_count = (len(coefficients) - 1) // 2
sos_count = (order - 1) // 2 if odd_order else order // 2
offset1, offset2 = (1, 2) if odd_order else (0, 1)
for n in range(sos_count):
adaptor1 = SymmetricTwoportAdaptor(
coefficients[2 * n + 1],
coefficients[2 * n + offset1],
signal_out,
latency=latency,
latency_offsets=latency_offsets,
@@ -90,7 +96,7 @@ def wdf_allpass(
delay1 = Delay(adaptor1.output(1))
delay2 = Delay()
adaptor2 = SymmetricTwoportAdaptor(
coefficients[2 * n + 2],
coefficients[2 * n + offset2],
delay1,
delay2,
latency=latency,
@@ -102,4 +108,4 @@ def wdf_allpass(
signal_out = Signal(adaptor1.output(0))
output << signal_out
return SFG([input_op], [output], name=name)
return SFG([input_op], [output], name=Name(name))
Loading