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