реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Быстрая свертка! Как?, помогите, пожалуйста, с алгоритмом
coolibin
сообщение Oct 10 2007, 06:42
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Нужен алгоритм быстрой свертки(желательно подробный). Если кто то опишет или даст линк, я буду только благодарен smile.gif


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Oct 10 2007, 09:12
Сообщение #2


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(coolibin @ Oct 10 2007, 09:42) *
Нужен алгоритм быстрой свертки(желательно подробный). Если кто то опишет или даст линк, я буду только благодарен smile.gif

Свертка во-временнОй области соответствует умножению спектров базиса Фурье в частотной. Спектры быстро вычисляюЦЦо через FFT. Вот Вам и метод.

Собственно и "гугл" рулит: http://alglib.sources.ru/fft/fastconvolution.php


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
fontp
сообщение Oct 10 2007, 12:20
Сообщение #3


Эксперт
*****

Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183



Цитата(DRUID3 @ Oct 10 2007, 13:12) *
Свертка во-временнОй области соответствует умножению спектров базиса Фурье в частотной. Спектры быстро вычисляюЦЦо через FFT. Вот Вам и метод.

Собственно и "гугл" рулит: http://alglib.sources.ru/fft/fastconvolution.php


И здесь есть очень симпатичная книга по быстрым преобразованиям
и соответствующие реализации свёртки хоть через Фурье, хоть через Хартли
http://www.jjj.de/fxt/fxtpage.html
Go to the top of the page
 
+Quote Post
coolibin
сообщение Oct 11 2007, 08:23
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Цитата
И здесь есть очень симпатичная книга по быстрым преобразованиями соответствующие реализации свёртки хоть через Фурье, хоть через Хартлиhttp://www.jjj.de/fxt/fxtpage.html

ссылка битая, помоему

а если честно, то когда береш 100 000 точек сигнала и сворачиваешь с 8 000 точками коэф. фильтра, то всё равно приходится не мало ждать. Тем более результат после быстрой свертки хуже(может не правильно сворачивал)


алгоритм быстрой свертки брал здесь - http://graphics.cs.msu.ru/courses/cg02b/li...y/dspcourse.pdf


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
fontp
сообщение Oct 11 2007, 09:42
Сообщение #5


Эксперт
*****

Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183



Цитата(coolibin @ Oct 11 2007, 12:23) *
ссылка битая, помоему

а если честно, то когда береш 100 000 точек сигнала и сворачиваешь с 8 000 точками коэф. фильтра, то всё равно приходится не мало ждать. Тем более результат после быстрой свертки хуже(может не правильно сворачивал)
алгоритм быстрой свертки брал здесь - http://graphics.cs.msu.ru/courses/cg02b/li...y/dspcourse.pdf


Ссылка не битая. По Хартли немного быстрее, чем по Фурье, если данные не комплесные. Ну а чудес не бывает
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Oct 11 2007, 09:50
Сообщение #6


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(coolibin @ Oct 11 2007, 11:23) *
ссылка битая, помоему

а если честно, то когда береш 100 000 точек сигнала и сворачиваешь с 8 000 точками коэф. фильтра, то всё равно приходится не мало ждать. Тем более результат после быстрой свертки хуже(может не правильно сворачивал)
алгоритм быстрой свертки брал здесь - http://graphics.cs.msu.ru/courses/cg02b/li...y/dspcourse.pdf

ссылка не битая, просто надо посидеть и разобраЦЦо. А немало ждать на какой машине??? Теоретически результат свертки и быстрой свертки абсолютно идентичны. Интересно, с какими типами данных работаете?


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Oldring
сообщение Oct 11 2007, 10:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(coolibin @ Oct 10 2007, 10:42) *
Нужен алгоритм быстрой свертки(желательно подробный). Если кто то опишет или даст линк, я буду только благодарен smile.gif


Свертки бывают разные. Алгоритмы тоже.
Теория довольно подробно изложеная в Блейхут "Быстрые алгоритмы цифровой обработки сигналов@/
Если я не ошибаюсь, когда-то была на dsp-book


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
coolibin
сообщение Oct 11 2007, 10:57
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Цитата
ссылка не битая, просто надо посидеть и разобраЦЦо. А немало ждать на какой машине??? Теоретически результат свертки и быстрой свертки абсолютно идентичны. Интересно, с какими типами данных работаете?

по ссылке зашел. машина - pentium 4 2.8. данные - double


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
coolibin
сообщение Oct 12 2007, 11:39
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Что в этой свертке неправильно?
Код
void fast_conv(const double *pSigA, unsigned int uSizeA, const double *pSigB,unsigned int uSizeB, double *pSigR){
    complex<double>    *pSigACx, *pSigBCx;
    size_t i;

    uint uConvSize = get_length(uSizeA + uSizeB - 1);
    
    pSigACx = new complex<double>[uConvSize];
    pSigBCx = new complex<double>[uConvSize];

    for(i = 0; i != uSizeA; i++){
        pSigACx[i] = complex<double>(pSigA[i], 0.0);
    }

    for(i = uSizeA; i != uConvSize; i++){
        pSigACx[i] = complex<double>(0.0, 0.0);
    }

    fft(pSigACx, uConvSize, false);

    for(i = 0; i != uSizeB; i++){
        pSigBCx[i] = complex<double>(pSigB[i], 0.0);
    }

    for(i = uSizeB; i != uConvSize; i++){
        pSigBCx[i] = complex<double>(0.0, 0.0);
    }

    fft(pSigBCx, uConvSize, false);

    for(i = 0; i != uConvSize; i++){
        pSigACx[i] *= pSigBCx[i];
    }

    fft(pSigACx, uConvSize, true);

    for(i = 0; i != uSizeA; i++){
        pSigR[i] = pSigACx[i].real();
    }

    delete [] pSigACx;
    delete [] pSigBCx;
}


fft работает правильно!

Сообщение отредактировал coolibin - Oct 12 2007, 11:42


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
shasik
сообщение Oct 12 2007, 12:13
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Цитата(coolibin @ Oct 12 2007, 14:39) *
Что в этой свертке неправильно?


Уверены в правильности вычисления прямого и обратного(!) преобразования Фурье?

Цитата(coolibin @ Oct 11 2007, 11:23) *
когда береш 100 000 точек сигнала и сворачиваешь с 8 000 точками коэф. фильтра, то всё равно приходится не мало ждать. Тем более результат после быстрой свертки хуже(может не правильно сворачивал)


Вы уверены, что оно Вам надо? Пример: отсчеты сигнала приходят один раз в секунду. Фильтр длиной 8000. Т.е. когда будет получен 8000-й отсчет можно посчитать свертку и выплюнуть результат. Считать можно в лоб (всего то 8000). Если же применять fft в том виде, как это сделали Вы, то придется ждать пока не будет получен весь(!) сигнал и выполнять fft для сигналов длиной 100000(!). Опеределитесь, что Вам нужно!
А еще есть алгоритмы разбиения свертки длинного сигнала на несколько более коротких - секционирование называется. Обратите внимание на это.
Go to the top of the page
 
+Quote Post
coolibin
сообщение Oct 12 2007, 12:44
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Цитата(shasik @ Oct 12 2007, 15:13) *
Уверены в правильности вычисления прямого и обратного(!) преобразования Фурье?

При пошаговой проверке спектры вычисляются правильно. Могу показать код

Цитата(shasik @ Oct 12 2007, 15:13) *
Вы уверены, что оно Вам надо? Пример: отсчеты сигнала приходят один раз в секунду. Фильтр длиной 8000. Т.е. когда будет получен 8000-й отсчет можно посчитать свертку и выплюнуть результат. Считать можно в лоб (всего то 8000). Если же применять fft в том виде, как это сделали Вы, то придется ждать пока не будет получен весь(!) сигнал и выполнять fft для сигналов длиной 100000(!). Опеределитесь, что Вам нужно!
А еще есть алгоритмы разбиения свертки длинного сигнала на несколько более коротких - секционирование называется. Обратите внимание на это.


К тому времени когда запускается моя программа сигнал уже получен. Я работаю с уже с известными данными.


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
Grt
сообщение Oct 12 2007, 14:13
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 3-10-07
Из: Moscow
Пользователь №: 31 035



При вычислении свертки, нужно обязательно учитывать предысторию сигнала.
Длина предыстории определяется порядком фильтра, т.е. если вы берете порядок фильтра 8. Значит 8 семплов сигнала вам нужно брать с предыдущего фрейма.
Go to the top of the page
 
+Quote Post
coolibin
сообщение Oct 15 2007, 08:10
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Цитата(Grt @ Oct 12 2007, 17:13) *
При вычислении свертки, нужно обязательно учитывать предысторию сигнала.
Длина предыстории определяется порядком фильтра, т.е. если вы берете порядок фильтра 8. Значит 8 семплов сигнала вам нужно брать с предыдущего фрейма.


С этим проблем нет

В статье http://alglib.sources.ru/fft/fastconvolution.php вводятся понятия положительной и отрицательной длинны отклика. В моем случае сворачивается сигнал и коэфф. фильтра, как определить длину положительного/отрицательного отклика. Пополам чтоли?


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
shasik
сообщение Oct 15 2007, 10:08
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Почему
Код
uint uConvSize = get_length(uSizeA + uSizeB - 1);

а не просто
Код
uint uConvSize = uSizeA + uSizeB - 1;
Go to the top of the page
 
+Quote Post
rloc
сообщение Oct 15 2007, 11:55
Сообщение #15


Узкополосный широкополосник
******

Группа: Свой
Сообщений: 2 316
Регистрация: 13-12-04
Из: Moscow
Пользователь №: 1 462



Цитата(coolibin @ Oct 10 2007, 10:42) *
Нужен алгоритм быстрой свертки(желательно подробный). Если кто то опишет или даст линк, я буду только благодарен smile.gif

Цитата(DRUID3 @ Oct 10 2007, 13:12) *
Свертка во-временнОй области соответствует умножению спектров базиса Фурье в частотной. Спектры быстро вычисляюЦЦо через FFT. Вот Вам и метод.

Позвольте поинтересоваться, а какой длительности сигнал нужно сворачивать? Может со сжатием в частотной области поспешили? Точно знаю, что фирма Intel в своих библиотеках MKL перед сверткой определяет длительность и в зависимости от этого уже сворачивает. Исходные данные даны не полностью, а задачку уже решаете.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 10:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01942 секунд с 7
ELECTRONIX ©2004-2016