clean signal_generator example

This commit is contained in:
Amar Mahmutbegovic
2024-09-22 17:02:53 +02:00
parent ff2be131d2
commit dc150c2c0d

View File

@@ -1,83 +1,106 @@
#include <array> #include <array>
#include <cmath> #include <cmath>
#include <numbers>
#include <fstream> #include <fstream>
template <typename T, std::size_t N> struct signal : public std::array<T, N> { template <typename T, std::size_t N>
struct signal : public std::array<T, N>
{
constexpr signal() {} constexpr signal() {}
constexpr signal(float begin, float end) { constexpr signal(float begin, float end)
{
float step = (end - begin) / (N - 1); float step = (end - begin) / (N - 1);
for (std::size_t i = 0; i < N; i++) { for (std::size_t i = 0; i < N; i++)
{
this->at(i) = begin + i * step; this->at(i) = begin + i * step;
} }
} }
constexpr signal(const std::array<T, N> &x, auto fun) { constexpr signal(const std::array<T, N> &x, auto fun)
for (std::size_t i = 0; i < N; i++) { {
for (std::size_t i = 0; i < N; i++)
{
this->at(i) = fun(x.at(i)); this->at(i) = fun(x.at(i));
} }
} }
constexpr signal(const signal &sig, auto fun) { constexpr signal(const signal &sig, auto fun)
for (std::size_t i = 0; i < N; i++) { {
for (std::size_t i = 0; i < N; i++)
{
this->at(i) = fun(sig.at(i)); this->at(i) = fun(sig.at(i));
} }
} }
constexpr signal operator+(const T &t) const { constexpr signal operator+(const T &t) const
return signal(*this, [&](T elem) { return elem + t; }); {
return signal(*this, [&](T elem)
{ return elem + t; });
}; };
constexpr signal operator-(const T &t) const { constexpr signal operator-(const T &t) const
return signal(*this, [&](T elem) { return elem - t; }); {
return signal(*this, [&](T elem)
{ return elem - t; });
}; };
constexpr signal operator*(const T &t) const { constexpr signal operator*(const T &t) const
return signal(*this, [&](T elem) { return elem * t; }); {
return signal(*this, [&](T elem)
{ return elem * t; });
}; };
constexpr signal operator/(const T &t) const { constexpr signal operator/(const T &t) const
return signal(*this, [&](T elem) { return elem / t; }); {
return signal(*this, [&](T elem)
{ return elem / t; });
}; };
constexpr signal operator+(const signal &sig) const { constexpr signal operator+(const signal &sig) const
{
signal ret; signal ret;
for (std::size_t i = 0; i < N; i++) { for (std::size_t i = 0; i < N; i++)
{
ret.at(i) = this->at(i) + sig.at(i); ret.at(i) = this->at(i) + sig.at(i);
} }
return ret; return ret;
}; };
constexpr signal operator-(const signal &sig) const { constexpr signal operator-(const signal &sig) const
{
signal ret; signal ret;
for (std::size_t i = 0; i < N; i++) { for (std::size_t i = 0; i < N; i++)
{
ret.at(i) = this->at(i) - sig.at(i); ret.at(i) = this->at(i) - sig.at(i);
} }
return ret; return ret;
}; };
friend constexpr signal operator+(const T& t, const signal& sig) { friend constexpr signal operator+(const T &t, const signal &sig)
return sig + t; {
return sig + t;
} }
friend constexpr signal operator*(const T& t, const signal& sig) { friend constexpr signal operator*(const T &t, const signal &sig)
return sig * t; {
return sig * t;
} }
friend constexpr signal operator/(const T& t, const signal& sig) { friend constexpr signal operator/(const T &t, const signal &sig)
signal ret; {
for (std::size_t i = 0; i < N; i++) { signal ret;
ret.at(i) = t / sig.at(i); for (std::size_t i = 0; i < N; i++)
} {
return ret; ret.at(i) = t / sig.at(i);
}
return ret;
} }
}; };
int main() { int main()
{
constexpr float A = 1.18090254918130e-3; constexpr float A = 1.18090254918130e-3;
constexpr float B = 2.16884014794388e-4; constexpr float B = 2.16884014794388e-4;
@@ -88,17 +111,22 @@ int main() {
constexpr signal<float, c_lut_points> resistance(1e3, 10e3); constexpr signal<float, c_lut_points> resistance(1e3, 10e3);
constexpr auto temperature_k = 1 / (A + constexpr auto temperature_k = 1 / (A +
B * signal(resistance, [](float x) {return std::log(x);}) + B * signal(resistance, [](float x)
C * signal(resistance, [](float x) {return std::pow(std::log(x), 2);}) + { return std::log(x); }) +
D * signal(resistance, [](float x) {return std::pow(std::log(x), 3);})); C * signal(resistance, [](float x)
{ return std::pow(std::log(x), 2); }) +
D * signal(resistance, [](float x)
{ return std::pow(std::log(x), 3); }));
constexpr auto temperature_celsius = temperature_k - 273.15f; constexpr auto temperature_celsius = temperature_k - 273.15f;
std::ofstream file("out.csv"); std::ofstream file("out.csv");
for(int i = 0; i < c_lut_points; i++) { file << "Resistance[Ohm], Temperature[Celsius]\n";
file << resistance[i] << ", " << temperature_celsius[i] << "\n"; for (int i = 0; i < c_lut_points; i++)
{
file << resistance[i] << ", " << temperature_celsius[i] << "\n";
} }
return 0; return 0;
} }