-
Notifications
You must be signed in to change notification settings - Fork 226
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Numerical evaluation of Fourier transform of Daubechies scaling funct…
…ions. [ci skip] [CI SKIP]
- Loading branch information
1 parent
4aac532
commit 6db459e
Showing
9 changed files
with
608 additions
and
1 deletion.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
example/calculate_fourier_transform_daubechies_constants.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
#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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#include <boost/math/special_functions/fourier_transform_daubechies_scaling.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; | ||
} |
Oops, something went wrong.