mirror of
https://github.com/boostorg/math.git
synced 2026-01-19 04:22:09 +00:00
Numerical evaluation of Fourier transform of Daubechies scaling funct… (#921)
* Numerical evaluation of Fourier transform of Daubechies scaling functions. * Update example/calculate_fourier_transform_daubechies_constants.cpp Co-authored-by: Matt Borland <matt@mattborland.com> * Update example/fourier_transform_daubechies_ulp_plot.cpp Co-authored-by: Matt Borland <matt@mattborland.com> * Update include/boost/math/special_functions/fourier_transform_daubechies_scaling.hpp Co-authored-by: Matt Borland <matt@mattborland.com> * Update include/boost/math/special_functions/fourier_transform_daubechies_scaling.hpp Co-authored-by: Matt Borland <matt@mattborland.com> * Rename include file to reflect it implements both the scaling and wavelet. * Add performance to docs. * Update test/math_unit_test.hpp Co-authored-by: Matt Borland <matt@mattborland.com> * Add boost-no-inspect to files with non-ASCII characters. --------- Co-authored-by: Matt Borland <matt@mattborland.com>
This commit is contained in:
43
example/calculate_fourier_transform_daubechies_constants.cpp
Normal file
43
example/calculate_fourier_transform_daubechies_constants.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
// (C) Copyright Nick Thompson 2023.
|
||||
// Use, modification and distribution are subject to the
|
||||
// Boost Software License, Version 1.0. (See accompanying file
|
||||
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <utility>
|
||||
#include <boost/math/filters/daubechies.hpp>
|
||||
#include <boost/math/tools/polynomial.hpp>
|
||||
#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
#include <boost/math/constants/constants.hpp>
|
||||
|
||||
using std::pow;
|
||||
using boost::multiprecision::cpp_bin_float_100;
|
||||
using boost::math::filters::daubechies_scaling_filter;
|
||||
using boost::math::tools::polynomial;
|
||||
using boost::math::constants::half;
|
||||
using boost::math::constants::root_two;
|
||||
|
||||
template<typename Real, size_t N>
|
||||
std::vector<Real> get_constants() {
|
||||
auto h = daubechies_scaling_filter<cpp_bin_float_100, N>();
|
||||
auto p = polynomial<cpp_bin_float_100>(h.begin(), h.end());
|
||||
|
||||
auto q = polynomial({half<cpp_bin_float_100>(), half<cpp_bin_float_100>()});
|
||||
q = pow(q, N);
|
||||
auto l = p/q;
|
||||
return l.data();
|
||||
}
|
||||
|
||||
template<typename Real>
|
||||
void print_constants(std::vector<Real> const & l) {
|
||||
std::cout << std::setprecision(std::numeric_limits<Real>::digits10 -10);
|
||||
std::cout << "return std::array<Real, " << l.size() << ">{";
|
||||
for (size_t i = 0; i < l.size() - 1; ++i) {
|
||||
std::cout << "BOOST_MATH_BIG_CONSTANT(Real, std::numeric_limits<Real>::digits, " << l[i]/root_two<Real>() << "), ";
|
||||
}
|
||||
std::cout << "BOOST_MATH_BIG_CONSTANT(Real, std::numeric_limits<Real>::digits, " << l.back()/root_two<Real>() << ")};\n";
|
||||
}
|
||||
|
||||
int main() {
|
||||
auto constants = get_constants<cpp_bin_float_100, 1>();
|
||||
print_constants(constants);
|
||||
}
|
||||
60
example/fourier_transform_daubechies_ulp_plot.cpp
Normal file
60
example/fourier_transform_daubechies_ulp_plot.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
// boost-no-inspect
|
||||
// (C) Copyright Nick Thompson 2023.
|
||||
// Use, modification and distribution are subject to the
|
||||
// Boost Software License, Version 1.0. (See accompanying file
|
||||
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/math/special_functions/fourier_transform_daubechies.hpp>
|
||||
#include <boost/math/tools/ulps_plot.hpp>
|
||||
|
||||
using boost::math::fourier_transform_daubechies_scaling;
|
||||
using boost::math::tools::ulps_plot;
|
||||
|
||||
template<int p>
|
||||
void real_part() {
|
||||
auto phi_real_hi_acc = [](double omega) {
|
||||
auto z = fourier_transform_daubechies_scaling<double, p>(omega);
|
||||
return z.real();
|
||||
};
|
||||
|
||||
auto phi_real_lo_acc = [](float omega) {
|
||||
auto z = fourier_transform_daubechies_scaling<float, p>(omega);
|
||||
return z.real();
|
||||
};
|
||||
auto plot = ulps_plot<decltype(phi_real_hi_acc), double, float>(phi_real_hi_acc, float(0.0), float(100.0), 20000);
|
||||
plot.ulp_envelope(false);
|
||||
plot.add_fn(phi_real_lo_acc);
|
||||
plot.clip(100);
|
||||
plot.title("Accuracy of 𝔑(𝓕[𝜙](ω)) with " + std::to_string(p) + " vanishing moments.");
|
||||
plot.write("real_ft_daub_scaling_" + std::to_string(p) + ".svg");
|
||||
|
||||
}
|
||||
|
||||
template<int p>
|
||||
void imaginary_part() {
|
||||
auto phi_imag_hi_acc = [](double omega) {
|
||||
auto z = fourier_transform_daubechies_scaling<double, p>(omega);
|
||||
return z.imag();
|
||||
};
|
||||
|
||||
auto phi_imag_lo_acc = [](float omega) {
|
||||
auto z = fourier_transform_daubechies_scaling<float, p>(omega);
|
||||
return z.imag();
|
||||
};
|
||||
auto plot = ulps_plot<decltype(phi_imag_hi_acc), double, float>(phi_imag_hi_acc, float(0.0), float(100.0), 20000);
|
||||
plot.ulp_envelope(false);
|
||||
plot.add_fn(phi_imag_lo_acc);
|
||||
plot.clip(100);
|
||||
plot.title("Accuracy of 𝕴(𝓕[𝜙](ω)) with " + std::to_string(p) + " vanishing moments.");
|
||||
plot.write("imag_ft_daub_scaling_" + std::to_string(p) + ".svg");
|
||||
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
real_part<3>();
|
||||
imaginary_part<3>();
|
||||
real_part<6>();
|
||||
imaginary_part<6>();
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user