clean signal_generator example
This commit is contained in:
@@ -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;
|
signal ret;
|
||||||
for (std::size_t i = 0; i < N; i++) {
|
for (std::size_t i = 0; i < N; i++)
|
||||||
|
{
|
||||||
ret.at(i) = t / sig.at(i);
|
ret.at(i) = t / sig.at(i);
|
||||||
}
|
}
|
||||||
return ret;
|
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;
|
||||||
@@ -89,14 +112,19 @@ 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";
|
||||||
|
for (int i = 0; i < c_lut_points; i++)
|
||||||
|
{
|
||||||
file << resistance[i] << ", " << temperature_celsius[i] << "\n";
|
file << resistance[i] << ", " << temperature_celsius[i] << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user