Реализация непрерывного вейвлет-преобразования CWT

 
0
 
Алгоритмы
ava
Proger10 | 13.02.2013, 03:17
Вот решил попробовать реализовать расчёт вейвлет-коэффициентов, только не получилось ничего. А точнее - какие-то градиентные горизонтальные полосы. Ровные полосы, даже не гнущиеся никак smile Очевидно какая-то проблема, поскольку и масштаб не такой маленький (ниже), и сдвиг, но как-то информации никакой не получаю - только горизонтальные полосы, что фигня какая-то.

Не посмотрите в чём может быть дело? С комплексными проблема может быть. Хреново у меня с ними :(

Неплохое объяснение вейвлетов: http://old.computerra.ru/offline/1998/236/1123/
Формула CWT: http://old.computerra.ru/printimages/236/Image160.gif

Вроде бы всё так и делаю, но в чём же дело-то :(


    // Реализация вейвлета Морле:
    complex< double > waveletMorlet( double t, double alpha ) {
        complex< double > expVal( 0.0, 2.0 * M_PI * t );
        return ( 0.0, exp( ( - t * t ) / ( alpha * alpha ) ) * exp( expVal ) );
    }
     
    vector< vector < complex < double > > > waveletAnalysis( vector <double> &dataArr, int scalesCount, int startSignalPos, int analysingPointsCount ) {
     
        vector< vector < complex < double > > > waveletCoeffsArr;
        vector < complex < double > > waveletCoeffsOneRowArr;
     
        int endWaveletSignalPos = startSignalPos + analysingPointsCount;
     
        // Заполняем результирующий массив нулями:
        for( int b = 0; b < analysingPointsCount; b++ ) { // shift
     
            waveletCoeffsOneRowArr.clear();
     
            for ( int s = 1; s <= scalesCount; s++ ) { // scale
     
                complex < double > currCoeff1( 0.0, 0.0 );
                waveletCoeffsOneRowArr.push_back( currCoeff1 ); // Собираем массив значений одной строки
     
            }
     
            waveletCoeffsArr.push_back( waveletCoeffsOneRowArr ); // Добавляем в финальный массив
     
        }
     
        // Рассчитываем вейвлет-коэффициенты:
        for( int b = 0; b < analysingPointsCount; b++ ) { // shift - сдвиг
     
            for ( int s = 1; s <= scalesCount; s++ ) { // scale - масштаб
     
                complex < double > currCoeff( 0.0, 1.0 ); // инициализирую комплексное число с мнимой единицей
     
                for( int i = startSignalPos; i < endWaveletSignalPos; i++ ) {
     
                    currCoeff += dataArr[ i ] * waveletMorlet( ( (double) ( i - startSignalPos ) - b ) / (double) s, 3.0 );
     
                }
     
                waveletCoeffsArr[ b ][ s - 1 ] = ( 1.0 / (double)sqrt( s ) ) * currCoeff;
     
            }
     
        }
     
        return waveletCoeffsArr;
     
    }
     
    // ИСПОЛЬЗОВАНИЕ:
    int startAnalyzingPos = 0;
    // samplesArr - отсчёты из wave-сигнала, 22050Гц
     
    // указываем номер с какого отсчёта вычислять вейвлет-преобразование и сколько их брать:
    vector < vector < complex < double > > > waveletCoeffsArr = waveletAnalysis( samplesArr, 100, startAnalyzingPos, 1000 );
Ответы (0)

Комментарии не добавлены

Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить