shithub: leaf

Download patch

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);
 }