2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Быстрая корреляция. Правильно или нет?
Сообщение08.11.2007, 18:34 


22/10/07
54
Вот на одном уважаемом сайте нашел такой исходник для вычисления быстрой корреляции через БПФ. Там в API многие операторы перегружены, так что будем считать, что синтаксис правильный... Вопрос по теории.

Известно, что корреляция вычисляется также как свертка, но для получения ядра необходимо развернуть паттерн-сигнал вокруг нулевой точки.
Смущает, отсутсвие этого преобразования в помеченном месте.

Это ошибка или Быстрая корреляция вычисляется именно так, т.е без преобразования в ядро свертки? И почему?

Код:
/*************************************************************************
Корелляция с использованием БПФ

На входе:
    Signal      -   сигнал, с которым проводим корелляцию.
                    Нумерация элементов от 0 до SignalLen-1
    SignalLen   -   длина сигнала.
   
    Pattern     -   образец, корелляцию сигнала с которым мы ищем
                    Нумерация элементов от 0 до PatternLen-1
    PatternLen  -   длина образца

На выходе:
    Signal      -   значения корелляции в точках от 0 до
                    SignalLen-1.
*************************************************************************/
void fastcorrelation(ap::real_1d_array& signal,
     int signallen,
     const ap::real_1d_array& pattern,
     int patternlen)
{
    ap::real_1d_array a1;
    ap::real_1d_array a2;
    int nl;
    int i;
    double t1;
    double t2;

// начиная отсюда

    nl = signallen+patternlen;
    i = 1;
    while(i<nl)
    {
        i = i*2;
    }
    nl = i;

//до сюда, ИМХО, тоже ошибка, т.к. nl должно быть >= signallen+patternlen-1
//Например, если signal = 3, pattern=2,  nl = signallen+patternlen-1 = 4 что является
// допустимым значением. Но данный алгоритм найдет 8, а не 4
// А интервал должен быть от 0 до nl-1 , т.е. от 0 до 3
// Или я не прав ???

    a1.setbounds(0, nl-1);
    a2.setbounds(0, nl-1);
    for(i = 0; i <= signallen-1; i++)
    {
        a1(i) = signal(i);
    }
    for(i = signallen; i <= nl-1; i++)
    {
        a1(i) = 0;
    }
    for(i = 0; i <= patternlen-1; i++)
    {
        a2(i) = pattern(i);
    }
    for(i = patternlen; i <= nl-1; i++)
    {
        a2(i) = 0;
    }
//
вот тут, по идее, должно быть преобразование паттерн-сигнала в ядро свертки,
или сразу надо было переворачивать при копировании.
//
    realfastfouriertransform(a1, nl, false);
    realfastfouriertransform(a2, nl, false);
    a1(0) = a1(0)*a2(0);
    a1(1) = a1(1)*a2(1);
    for(i = 1; i <= nl/2-1; i++)
    {
        t1 = a1(2*i);
        t2 = a1(2*i+1);
        a1(2*i) = t1*a2(2*i)+t2*a2(2*i+1);
        a1(2*i+1) = t2*a2(2*i)-t1*a2(2*i+1);
    }
    realfastfouriertransform(a1, nl, true);
    for(i = 0; i <= signallen-1; i++)
    {
        signal(i) = a1(i);
    }
}

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group