1 #ifndef _FORCECAUSAL_HPP_INC_
2 #define _FORCECAUSAL_HPP_INC_
12 F(
const std::vector<T> &
freq,
const std::vector<std::complex<T> > & data, T tau,
14 return (data[n] -
k) *
20 K(
const std::vector<T> &
freq,
const std::vector<std::complex<T> > & data, T tau) {
21 return std::real(data.back()) -
22 std::imag(data.back()) /
28 f0(
const std::vector<T> &
freq,
const std::vector<std::complex<T> > & data, T tau) {
29 std::complex<T>
toRet = 0;
31 for (
size_t i = 1;
i <
freq.size() - 1;
i++) {
37 return std::real(
toRet);
50 getTau(
const std::vector<T> &
freq,
const std::vector<std::complex<T> > & data,
51 T tol = 1e-7,
size_t maxIter = 30, T
step = 1e-8) {
52 T currentGuess = 1e-8;
53 for (
size_t i = 0;
i < maxIter;
i++) {
54 T f0Curr =
f0(
freq, data, currentGuess);
55 if (f0Curr * f0Curr < tol) {
59 currentGuess = currentGuess - f0Curr / diff;
79 const std::vector<std::complex<T> > & data) {
81 toRet.data = std::vector<T>(2 *
freq.size() - 2);
87 if (
abs(std::imag(data.back())) < 1e-5) {
90 for (
size_t i = 0;
i <
freq.size() - 1;
i++) {
94 for (
size_t i = 1;
i <
freq.size();
i++) {
102 for (
size_t i = 0;
i <
freq.size() - 1;
i++) {
106 for (
size_t i = 1;
i <
freq.size();
i++) {
113 for (
size_t i = 0;
i < idftVal.size();
i++) {
114 toRet.data[
i] = std::real(idftVal[
i]);
117 if (
abs(std::imag(data.back())) >= 1e-5) {
ForceCausal::CausalData< T > forceCausal(const std::vector< T > &freq, const std::vector< std::complex< T > > &data)
std::vector< std::complex< T > > idft(const std::vector< std::complex< T > > &inputData)
end if abs(real(dotprod))>rstoerst rstoerst
std::complex< T > F(const std::vector< T > &freq, const std::vector< std::complex< T > > &data, T tau, T k, size_t n)
T K(const std::vector< T > &freq, const std::vector< std::complex< T > > &data, T tau)
T getTau(const std::vector< T > &freq, const std::vector< std::complex< T > > &data, T tol=1e-7, size_t maxIter=30, T step=1e-8)
T f0derivative(const std::vector< T > &freq, const std::vector< std::complex< T > > &data, T tau, T step)
T f0(const std::vector< T > &freq, const std::vector< std::complex< T > > &data, T tau)
a helper struct to return the result of the forced causal IDFT