2014 dxdy logo

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

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




 
 Быстрая корреляция. Правильно или нет?
Сообщение08.11.2007, 18:34 
Вот на одном уважаемом сайте нашел такой исходник для вычисления быстрой корреляции через БПФ. Там в 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 сообщение ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group