Задача «Вейвлет преобразование»

Задача

Произвести рефакторинг исходного кода на C, реализующего дискретное вейвлет преобразование одно- и N-мерных данных.

Исходный код

Листинги с исходным кодом приведены в книге 'Numerical Recipes in C', глава 13.10, стр. 591-606.

  • nr.h – прототипы всех функций, реализующих описанные в книге численные методы.
  • nrutil.h – обработка ошибок, вспомогательные макросы, а также прототипы всех вспомогательных функций, наподобие создания / удаления вектора или матрицы чисел и т.п.
  • nrutil.c – реализация вспомогательных функций для обработки ошибок, создания / удаления вектора или матрицы чисел и т.п.
  • select.c – реализация выделения K наибольших значений из N имеющихся в массиве, поиск порогового значения.
  • wt1.c – реализация вейвлет преобразования над одномерным массивом данных.
  • wtn.c – обобщённая реализация вейвлет преобразования над многомерным массивом данных.
  • daub4.c – реализация функции преобразования DAUB4 из множества вейвлетов Добеши.
  • pwt.c – реализация процедуры частичного преобразования.
  • pwtset.c – настройка вейвлет преобразования, выбор конкретной функции из подмножества вейвлетов Добеши..

  • xwt1.c – пример использования одномерного вейвлет преобразования. Массив чисел инициализируется значениями некоторой функции, производится вейвлет преобразование, обнуляется часть коэффициентов (процент задается пользователем, обнуление производится начиная от наименьших), производится обратное вейвлет преобразование, исходные значения сравниваются с восстановленными, и вычисляется максимальное отклонение.

  • xwtn.c – пример использования многомерного вейвлет преобразования. Двумерный массив чисел инициализируется значениями некоторой функции, производится вейвлет преобразование, затем обратное преобразование, оценивается точность совпадения восстановленных значений с исходными.

Описание

В процессе рефакторинга необходимо:

  • Переписать код на C++ (new, delete, объявление переменных не в начале блока, а там, где они реально используются, и т. п.)
  • Избавиться от define'ов (объявление констант) и глобальных переменных.
  • Избавиться от авторских реализаций вектора и матрицы чисел в пользу std::vector и std::vector<std::vector>.
  • Перевести обработку ошибок на механизм исключений и std::exception.
  • Объединить 2 проекта в один. В результате получится один модуль, работающий как в режиме прямого, так и обратного преобразования с различными вейвлет функциями + общий тест.
  • Выделить класс вейвлет преобразования.
  • Выделить классы вейвлет функций.
  • Выбор конкретной вейвлет функции для преобразования организовать на основе паттерна стратегия.

Архив с проектами для Visual Studio 2013 и Visual Studio 2015