https://github.com/rafat/wavelib/wiki/DWT-Example-Code
| 490 | |
| 491 | // https://github.com/rafat/wavelib/wiki/DWT-Example-Code |
| 492 | int perform_wavelet_transform (double *data, int data_len, int wavelet, int decomposition_level, |
| 493 | int extension, double *output_data, int *decomposition_lengths) |
| 494 | { |
| 495 | std::string wavelet_str = get_wavelet_name (wavelet); |
| 496 | std::string extension_str = get_extension_type (extension); |
| 497 | if ((data == NULL) || (data_len <= 0) || (wavelet_str.empty ()) || (output_data == NULL) || |
| 498 | (extension_str.empty ()) || (decomposition_lengths == NULL) || (decomposition_level <= 0)) |
| 499 | { |
| 500 | data_logger->error ("Please review arguments."); |
| 501 | return (int)BrainFlowExitCodes::INVALID_ARGUMENTS_ERROR; |
| 502 | } |
| 503 | |
| 504 | wave_object obj = NULL; |
| 505 | wt_object wt = NULL; |
| 506 | |
| 507 | try |
| 508 | { |
| 509 | obj = wave_init (wavelet_str.c_str ()); |
| 510 | wt = wt_init (obj, "dwt", data_len, decomposition_level); |
| 511 | setDWTExtension (wt, extension_str.c_str ()); |
| 512 | setWTConv (wt, "direct"); |
| 513 | dwt (wt, data); |
| 514 | for (int i = 0; i < wt->outlength; i++) |
| 515 | { |
| 516 | output_data[i] = wt->output[i]; |
| 517 | } |
| 518 | for (int i = 0; i < decomposition_level + 1; i++) |
| 519 | { |
| 520 | decomposition_lengths[i] = wt->length[i]; |
| 521 | } |
| 522 | wave_free (obj); |
| 523 | obj = NULL; |
| 524 | wt_free (wt); |
| 525 | wt = NULL; |
| 526 | } |
| 527 | catch (const std::exception &e) |
| 528 | { |
| 529 | if (obj) |
| 530 | { |
| 531 | wave_free (obj); |
| 532 | obj = NULL; |
| 533 | } |
| 534 | if (wt) |
| 535 | { |
| 536 | wt_free (wt); |
| 537 | wt = NULL; |
| 538 | } |
| 539 | // more likely exception here occured because input buffer is to small to perform wavelet |
| 540 | // transform |
| 541 | data_logger->error ("Exception in wavelib: {}", e.what ()); |
| 542 | return (int)BrainFlowExitCodes::INVALID_BUFFER_SIZE_ERROR; |
| 543 | } |
| 544 | return (int)BrainFlowExitCodes::STATUS_OK; |
| 545 | } |
| 546 | |
| 547 | // inside wavelib inverse transform uses internal state from direct transform, dirty hack to restore |
| 548 | // it here |
no test coverage detected