22 std::function<std::vector<std::vector<double>>(int, double)>
    25            double cutoff_freq) -> std::vector<std::vector<double>> {
    27   std::vector<Ipp64f> taps(2 * (filter_order + 1));
    28   IppStatus status = ippStsNoErr;
    29   int internal_buffer_size;
    32   status = ippsIIRGenGetBufferSize(filter_order, &internal_buffer_size);
    33   if (status != ippStsNoErr) {
    34     throw std::runtime_error(
    35         "\nERROR: in signal_processing::hp_butterworth: Error in buffer size "    40   Ipp8u * internal_calcs = ippsMalloc_8u(internal_buffer_size);
    41   status = ippsIIRGenHighpass_64f(cutoff_freq / 2.0, 0, filter_order, taps.data(),
    42                                   ippButterworth, internal_calcs);
    45   if (status != ippStsNoErr) {
    46     throw std::runtime_error(
    47         "\nERROR: in signal_processing::hp_butterworth: Error in coefficient "    51   std::vector<double> numerator(filter_order + 1);
    52   std::vector<double> denominator(filter_order + 1);
    54   for (
int i = 0; i < filter_order + 1; ++i) {
    55     numerator[i] = taps[i];
    56     denominator[i] = taps[i + filter_order + 1];
    60   ippsFree(internal_calcs);
    62   return std::vector<std::vector<double>>{numerator, denominator};
    74 std::function<std::vector<double>(std::vector<double>, std::vector<double>,
    77                           const std::vector<double>& denominator_coeffs,
    78                           int order, 
int num_samples) -> std::vector<double> {
    79   if (numerator_coeffs.size() != denominator_coeffs.size()) {
    80     throw std::runtime_error(
    81         "\nERROR: in signal_processing::impulse_response: Inputs for numerator "    82         "and denominator coefficients not same length\n");
    85   IppStatus status = ippStsNoErr;
    86   int internal_buffer_size;
    87   IppsIIRState_64f * filter_state = 
nullptr;
    88   Ipp64f *samples = ippsMalloc_64f(num_samples),
    89          *impulse = ippsMalloc_64f(num_samples);
    90   std::vector<double> taps(numerator_coeffs.size() + denominator_coeffs.size());
    94   for (
int i = 1; i < num_samples; ++i) {
    99   for (
unsigned int i = 0; i < numerator_coeffs.size(); ++i) {
   100     taps[i] = numerator_coeffs[i];
   101     taps[i + numerator_coeffs.size()] = denominator_coeffs[i];
   105   status = ippsIIRGetStateSize_64f(order, &internal_buffer_size);
   106   if (status != ippStsNoErr) {
   107     throw std::runtime_error(
   108         "\nERROR: in signal_processing::impulse_response: Error in buffer size "   113   Ipp8u * internal_calcs = ippsMalloc_8u(internal_buffer_size);
   116   status = ippsIIRInit_64f(&filter_state, taps.data(), order, 
nullptr, internal_calcs);
   117   if (status != ippStsNoErr) {
   118     throw std::runtime_error(
   119         "\nERROR: in signal_processing::impulse_response: Error in filter initialization\n");
   123   status = ippsIIR_64f(impulse, samples, num_samples, filter_state);
   124   if (status != ippStsNoErr) {
   125     throw std::runtime_error(
   126         "\nERROR: in signal_processing::impulse_response: Error in filter application\n");
   129   std::vector<double> sample_vec(num_samples);
   130   for (
int i = 0; i < num_samples; ++i) {
   131     sample_vec[i] = samples[i];
   137   ippsFree(internal_calcs);
 std::function< std::vector< std::vector< double > >int, double)> hp_butterworth
 
std::function< std::vector< double >std::vector< double >, std::vector< double >, int, int)> impulse_response