ref: 4fa07020d3c13de61a71d7d4730e059741935799
dir: /LEAF/Src/leaf-WDF.c/
/* * leaf-WDF.c * * Created on: Sep 25, 2019 * Author: jeffsnyder */ #include "../Inc/leaf-WDF.h" //WDF resistor void tWDFresistor_init(tWDFresistor* const r, float electrical_resistance) { r->port_resistance = electrical_resistance; r->port_conductance = 1.0f / electrical_resistance; r->electrical_resistance = electrical_resistance; r->incident_wave = 0.0f; r->reflected_wave = 0.0f; } void tWDFresistor_setElectricalResistance(tWDFresistor* const r, float electrical_resistance) { r->port_resistance = electrical_resistance; r->port_conductance = 1.0f / electrical_resistance; r->electrical_resistance = electrical_resistance; } float tWDFresistor_getPortResistance(tWDFresistor* const r) { return r->port_resistance; } void tWDFresistor_setIncidentWave(tWDFresistor* const r, float incident_wave) { r->incident_wave = incident_wave; } float tWDFresistor_getReflectedWave(tWDFresistor* const r) { r->reflected_wave = 0.0f; return r->reflected_wave; } float tWDFresistor_getVoltage(tWDFresistor* const r) { return ((r->incident_wave * 0.5f) + (r->reflected_wave * 0.5f)); } float tWDFresistor_getCurrent(tWDFresistor* const r) { return (((r->incident_wave * 0.5f) - (r->reflected_wave * 0.5f)) * r->port_conductance); } ///----WDF resistive source void tWDFresistiveSource_init(tWDFresistiveSource* const r, float electrical_resistance, float source_voltage) { r->port_resistance = electrical_resistance; r->port_conductance = 1.0f / electrical_resistance; r->electrical_resistance = electrical_resistance; r->incident_wave = 0.0f; r->reflected_wave = 0.0f; r->source_voltage = source_voltage; } float tWDFresistiveSource_getPortResistance(tWDFresistiveSource* const r) { return r->port_resistance; } void tWDFresistiveSource_setIncidentWave(tWDFresistiveSource* const r, float incident_wave) { r->incident_wave = incident_wave; } float tWDFresistiveSource_getReflectedWave(tWDFresistiveSource* const r) { r->reflected_wave = r->source_voltage; return r->reflected_wave; } float tWDFresistiveSource_getVoltage(tWDFresistiveSource* const r) { return ((r->incident_wave * 0.5f) + (r->reflected_wave * 0.5f)); } float tWDFresistiveSource_getCurrent(tWDFresistiveSource* const r) { return (((r->incident_wave * 0.5f) - (r->reflected_wave * 0.5f)) * r->port_conductance); } void tWDFresistiveSource_setSourceVoltage(tWDFresistiveSource* const r, float source_voltage) { r->source_voltage = source_voltage; } //WDF capacitor void tWDFcapacitor_init(tWDFcapacitor* const r, float electrical_capacitance, float sample_rate) { r->port_resistance = 1.0f / (sample_rate * 2.0f * electrical_capacitance); //based on trapezoidal discretization r->port_conductance = (1.0f / r->port_resistance); r->electrical_capacitance = electrical_capacitance; r->incident_wave = 0.0f; r->reflected_wave = 0.0f; r->sample_rate = sample_rate; r->memory = 0.0f; } float tWDFcapacitor_getPortResistance(tWDFcapacitor* const r) { return r->port_resistance; } void tWDFcapacitor_setIncidentWave(tWDFcapacitor* const r, float incident_wave) { r->incident_wave = incident_wave; r->memory = r->incident_wave; } float tWDFcapacitor_getReflectedWave(tWDFcapacitor* const r) { r->reflected_wave = r->memory; return r->reflected_wave; } float tWDFcapacitor_getVoltage(tWDFcapacitor* const r) { return ((r->incident_wave * 0.5f) + (r->reflected_wave * 0.5f)); } float tWDFcapacitor_getCurrent(tWDFcapacitor* const r) { return (((r->incident_wave * 0.5f) - (r->reflected_wave * 0.5f)) * r->port_conductance); } // WDF series void tWDFseriesAdaptor_init(tWDFseriesAdaptor* const r, tWDFresistor* const rL, tWDFcapacitor* const rR) { r->rL = rL; r->rR = rR; r->port_resistance_left = tWDFresistor_getPortResistance(rL); r->port_resistance_right = tWDFcapacitor_getPortResistance(rR); r->port_resistance_up = r->port_resistance_left + r->port_resistance_right; r->port_conductance_up = 1.0f / r->port_resistance_up; r->port_conductance_left = 1.0f / r->port_resistance_left; r->port_conductance_right = 1.0f / r->port_resistance_right; r->incident_wave_up = 0.0f; r->incident_wave_left = 0.0f; r->incident_wave_right = 0.0f; r->reflected_wave_up = 0.0f; r->reflected_wave_left = 0.0f; r->reflected_wave_right = 0.0f; r->gamma_zero = 1.0f / (r->port_resistance_right + r->port_resistance_left); } void tWDFseriesAdaptor_setPortResistances(tWDFseriesAdaptor* const r) { r->port_resistance_left = tWDFresistor_getPortResistance(r->rL); r->port_resistance_right = tWDFcapacitor_getPortResistance(r->rR); r->port_resistance_up = r->port_resistance_left + r->port_resistance_right; r->port_conductance_up = 1.0f / r->port_resistance_up; r->port_conductance_left = 1.0f / r->port_resistance_left; r->port_conductance_right = 1.0f / r->port_resistance_right; r->gamma_zero = 1.0f / (r->port_resistance_right + r->port_resistance_left); } float tWDFseriesAdaptor_getPortResistance(tWDFseriesAdaptor* const r) { return r->port_resistance_up; } void tWDFseriesAdaptor_setIncidentWave(tWDFseriesAdaptor* const r, float incident_wave) { float gamma_left = r->port_resistance_left * r->gamma_zero; float gamma_right = r->port_resistance_right * r->gamma_zero; float left_wave = tWDFresistor_getReflectedWave(r->rL); float right_wave = tWDFcapacitor_getReflectedWave(r->rR); tWDFresistor_setIncidentWave(r->rL, (-1.0f * gamma_left * incident_wave) + ((1.0f - gamma_left) * left_wave) - (gamma_left * right_wave)); tWDFcapacitor_setIncidentWave(r->rR, (-1.0f * gamma_right * incident_wave) + ((-1.0f * gamma_right) * left_wave) + ((1.0f - gamma_right) * right_wave)); } float tWDFseriesAdaptor_getReflectedWave(tWDFseriesAdaptor* const r) { return (-1.0f * (tWDFresistor_getReflectedWave(r->rL) + tWDFcapacitor_getReflectedWave(r->rR))); } float tWDFseriesAdaptor_getVoltage(tWDFseriesAdaptor* const r) { return ((r->incident_wave_up * 0.5f) + (r->reflected_wave_up * 0.5f)); } float tWDFseriesAdaptor_getCurrent(tWDFseriesAdaptor* const r) { return (((r->incident_wave_up * 0.5f) - (r->reflected_wave_up * 0.5f)) * r->port_conductance_up); }