ref: f0d8dedb45838219f1e56debb2dd24cf2341d804
parent: 31c7e637a85158a126420bf9128dd102a495a12e
author: Jeff Snyder <jeff@snyderphonics.com>
date: Wed Sep 25 19:57:06 EDT 2019
added more WDF stuff
--- a/LEAF/Inc/leaf-WDF.h
+++ b/LEAF/Inc/leaf-WDF.h
@@ -9,6 +9,10 @@
#define LEAF_INC_LEAF_WDF_H_
+
+//---
+//WDF resistor
+
typedef struct _tWDFresistor
{
float port_resistance;
@@ -21,8 +25,81 @@
void tWDFresistor_init(tWDFresistor* const r, float electrical_resistance);
float tWDFresistor_getPortResistance(tWDFresistor* const r);
void tWDFresistor_setIncidentWave(tWDFresistor* const r, float incident_wave);
+float tWDFresistor_getReflectedWave(tWDFresistor* const r);
float tWDFresistor_getVoltage(tWDFresistor* const r);
float tWDFresistor_getCurrent(tWDFresistor* const r);
+
+
+
+//---
+//WDF resistive source
+typedef struct _tWDFresistiveSource
+{
+ float port_resistance;
+ float port_conductance;
+ float electrical_resistance;
+ float incident_wave;
+ float reflected_wave;
+ float source_voltage;
+} tWDFresistiveSource;
+
+void tWDFresistiveSource_init(tWDFresistiveSource* const r, float electrical_resistance, float source_voltage);
+float tWDFresistiveSource_getPortResistance(tWDFresistiveSource* const r);
+void tWDFresistiveSource_setIncidentWave(tWDFresistiveSource* const r, float incident_wave);
+float tWDFresistiveSource_getReflectedWave(tWDFresistiveSource* const r);
+float tWDFresistiveSource_getVoltage(tWDFresistiveSource* const r);
+float tWDFresistiveSource_getCurrent(tWDFresistiveSource* const r);
+void tWDFresistiveSource_setSourceVoltage(tWDFresistiveSource* const r, float source_voltage);
+
+
+//---
+//WDF capacitor
+typedef struct _tWDFcapacitor
+{
+ float port_resistance;
+ float port_conductance;
+ float electrical_capacitance;
+ float incident_wave;
+ float reflected_wave;
+ float sample_rate;
+ float memory;
+} tWDFcapacitor;
+
+void tWDFcapacitor_init(tWDFcapacitor* const r, float electrical_capacitance, float sample_rate);
+float tWDFcapacitor_getPortResistance(tWDFcapacitor* const r);
+void tWDFcapacitor_setIncidentWave(tWDFcapacitor* const r, float incident_wave);
+float tWDFcapacitor_getReflectedWave(tWDFcapacitor* const r);
+float tWDFcapacitor_getVoltage(tWDFcapacitor* const r);
+float tWDFcapacitor_getCurrent(tWDFcapacitor* const r);
+
+//---
+//WDF series adaptor
+typedef struct _tWDFseriesAdaptor
+{
+ float port_resistance_up;
+ float port_resistance_left;
+ float port_resistance_right;
+ float port_conductance_up;
+ float port_conductance_left;
+ float port_conductance_right;
+ float incident_wave_up;
+ float incident_wave_left;
+ float incident_wave_right;
+ float reflected_wave_up;
+ float reflected_wave_left;
+ float reflected_wave_right;
+ float gamma_zero;
+ tWDFresistor* rL;
+ tWDFcapacitor* rR;
+} tWDFseriesAdaptor;
+
+void tWDFseriesAdaptor_init(tWDFseriesAdaptor* const r, tWDFresistor* const rL, tWDFcapacitor* const rR);
+float tWDFseriesAdaptor_getPortResistance(tWDFseriesAdaptor* const r);
+void tWDFseriesAdaptor_setIncidentWaves(tWDFseriesAdaptor* const r, float incident_wave);
+float tWDFseriesAdaptor_getReflectedWave(tWDFseriesAdaptor* const r);
+float tWDFseriesAdaptor_getVoltage(tWDFseriesAdaptor* const r);
+float tWDFseriesAdaptor_getCurrent(tWDFseriesAdaptor* const r);
+
#endif /* LEAF_INC_LEAF_WDF_H_ */
--- a/LEAF/Src/leaf-WDF.c
+++ b/LEAF/Src/leaf-WDF.c
@@ -6,6 +6,9 @@
*/
+#include "../Inc/leaf-WDF.h"
+
+//WDF resistor
void tWDFresistor_init(tWDFresistor* const r, float electrical_resistance)
{
r->port_resistance = electrical_resistance;
@@ -22,6 +25,11 @@
{
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));
@@ -28,5 +36,125 @@
}
float tWDFresistor_getCurrent(tWDFresistor* const r)
{
- return (((r->incident_wave * 0.5f) - (r->reflected_wave * 0.5f)) / r->port_conductance);
+ 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 * 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);
+}
+float tWDFseriesAdaptor_getPortResistance(tWDFseriesAdaptor* const r)
+{
+ return r->port_resistance_up;
+}
+void tWDFseriesAdaptor_setIncidentWaves(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;
+ tWDFresistor_setIncidentWave(r->rL, (-1.0f * gamma_left * incident_wave) + ((1.0f - gamma_left) * tWDFresistor_getReflectedWave(r->rL)) - (gamma_left * tWDFcapacitor_getReflectedWave(r->rR)));
+ tWDFcapacitor_setIncidentWave(r->rR, (-1.0f * gamma_right * incident_wave) + ((-1.0f * gamma_right) * tWDFresistor_getReflectedWave(r->rL)) + (1.0f - gamma_right * tWDFcapacitor_getReflectedWave(r->rR)));
+}
+
+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);
}