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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Максимально возможное окно для FFT при 64МБ ОЗУ.
kolobochishe
сообщение Mar 21 2012, 10:01
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Посоветуйте алгоритм (точнее его реализацию на С или С++) для ARM9 (NXP LPC3250) с ОЗУ 64МБ.
Один рабочий нашел вот тут. "Прицепил" к своему проекту. Все работает, но до величины окна 65536. Больше - и программа виснет. Под "кучу" выделил 15МБ ОЗУ. В принципе если постараться, то можно еще 40МБ добавить.

Интересует вопрос - каковы требования к объему памяти разных алгоритмов?




Тему можно удалить. Проблема не в БПФ, а во мне sad.gif массив для получения результата не того размера подготовил krapula.gif
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 21 2012, 11:40
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Хотя нет sm.gif тему не стоит удалять. В общем у меня получилось примерно так.

тип double (8 байт) на реальную часть и тип double (8 байт) на мнимую часть. Если величина окна 2^20=1048576, то получается на исходный массив выборок - 16МБ, плюс 8МБ на массив WStore (пока не вник, не знаю точно можно от него избавится или нет). В итоге примерно 24МБ - вот такие требования. Мне пока не хватает примерно 4МБ, поэтому окно 2^19.

Считает это дело мое устройство примерно секунд 50 (100МГц тактовая, 64МБ 100МГц SDRAM). Есть у кого алгоритмы получше?



Где то вроде видел что-то такое: сделать много FFT последовательно накладывая окна, а потом эти результаты подвергнуть еще раз какому-то преобразованию. В итоге будет большое окно с маленькими требованиями к памяти. Такое возможно?
Go to the top of the page
 
+Quote Post
alex_os
сообщение Mar 21 2012, 18:25
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030



Цитата(kolobochishe @ Mar 21 2012, 14:40) *
Где то вроде видел что-то такое: сделать много FFT последовательно накладывая окна, а потом эти результаты подвергнуть еще раз какому-то преобразованию. В итоге будет большое окно с маленькими требованиями к памяти. Такое возможно?


Ну была тут алхимическая дискуссия лет пару назад - сшивали некогеретные блоки и пытались сделать один большой и неразрывный sm.gif. Если серьезно, что хочется получить ? Если интересует какой-то узкий участок спектра с хорошим разрешением, тогда перенос на нулевую частоту -> фильтрация - децимация -> ФФТ.




--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 22 2012, 03:51
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(alex_os @ Mar 21 2012, 23:25) *
... что хочется получить ? Если интересует какой-то узкий участок спектра с хорошим разрешением, тогда перенос на нулевую частоту -> фильтрация - децимация -> ФФТ.


нет. есть оцифрованный сигнал. надо увидеть спектр (не в динамике, а именно график) на большом временном промежутке. примерно 1 сек. При этом частоты могут быть от 100Гц до 1МГц, примерно. Вот получается, что окно должно быть 2*10^6 выборки.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 22 2012, 06:43
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Вот сейчас в голову пришла такая "идея". Если разрешение по частоте допустимо порядка 100Гц, то брать последовательно по шкале времени участки (N штук) по 16384 элементов, вычислить для каждого FFT, просуммировать коэффициенты одинаковых частот и поделить на количество участков N. Получим спектральную характеристику продолжительного участка, но с небольшими требованиями к памяти и небольшим размером файла результата.

Как идея?

Одно "НО". Как суммировать коэффициенты? векторно (как комплексные числа) или по модулю?

По сути это вариант "скользящего" окна, но с суммированием.
Go to the top of the page
 
+Quote Post
анатолий
сообщение Mar 22 2012, 13:28
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 10-12-05
Из: Украина
Пользователь №: 12 052



Цитата(kolobochishe @ Mar 22 2012, 08:43) *
Если разрешение по частоте допустимо порядка 100Гц, то брать последовательно по шкале времени участки (N штук) по 16384 элементов, вычислить для каждого FFT, просуммировать коэффициенты одинаковых частот и поделить на количество участков N.

Как идея?

Идея называется метод периодограмм.
Складывать надо квадраты модулей, т.е. мощности одноименных бинов N участков. Результат - квадратный корень из суммы, деленной на N.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 23 2012, 04:01
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Проверил метод на практике. Не понравилось. На плате есть источник шума 125кГц (DC-DC). При амлитуде входного сигнала 3 мВ и фиксированной частоте он раз в 100 меньше на спектрограмме, чем этот входной сигнал. Но если входной сигнал имеет широкополосную ЧМ модуляцию, то в итоге, из-за своей стабильной частоты, на периодограмме сигнал наводки увеличивается пропорционально количеству просуммированных окон. Получается что хоть полезный сигнал по амплитуде и гораздо выше, но преобладающим в периодограмме будет стационарный сигнал наводки с DC-DC. Интересная особенность, где-то может и полезная, а в моем случае это не то, что нужно.

Попробую не суммировать, а для каждого бина искать максимум из N преобразований.
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Mar 23 2012, 15:52
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(kolobochishe @ Mar 21 2012, 15:40) *
Хотя нет sm.gif тему не стоит удалять. В общем у меня получилось примерно так.

тип double (8 байт) на реальную часть и тип double (8 байт) на мнимую часть. Если величина окна 2^20=1048576, то получается на исходный массив выборок - 16МБ, плюс 8МБ на массив WStore (пока не вник, не знаю точно можно от него избавится или нет). В итоге примерно 24МБ - вот такие требования. Мне пока не хватает примерно 4МБ, поэтому окно 2^19.

Считает это дело мое устройство примерно секунд 50 (100МГц тактовая, 64МБ 100МГц SDRAM). Есть у кого алгоритмы получше?



Где то вроде видел что-то такое: сделать много FFT последовательно накладывая окна, а потом эти результаты подвергнуть еще раз какому-то преобразованию. В итоге будет большое окно с маленькими требованиями к памяти. Такое возможно?

может попробовать считать арифметикой с фиксированной точкой(исключить double и float, следя за переполнениями и вовремя сдвигая результат)?
Go to the top of the page
 
+Quote Post
АНТОН КОЗЛОВ
сообщение Mar 26 2012, 05:16
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 344
Регистрация: 3-01-09
Из: УФА
Пользователь №: 42 894



А 6-байтовых real или float в этом компиляторе не существует. Порой удавалось на Single (4-х байтовых real) БПФ на 65000 точек заделать. Считал мгоновенно (нетбук). Алгоритм древний из Голда-Рабинера.Синусы и косинусы там интерактивно считались. Когда таблично пробовал задать, считало медленнее, как ни странно. Еще на электронике60 работало.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 26 2012, 07:08
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(АНТОН КОЗЛОВ @ Mar 26 2012, 10:16) *
А 6-байтовых real или float в этом компиляторе не существует. Порой удавалось на Single (4-х байтовых real) БПФ на 65000 точек заделать. Считал мгоновенно (нетбук). Алгоритм древний из Голда-Рабинера.Синусы и косинусы там интерактивно считались. Когда таблично пробовал задать, считало медленнее, как ни странно. Еще на электронике60 работало.


Хочется готовое 100% работающее решение. Имел ввиду что-то, что кардинально изменит требования к памяти и скорость, а не использование других типов. Ну и чтобы кто-нибудь поделился своим мнением и опытом по поводу различных реализаций БПФ.

А float наверно можно использовать.
Go to the top of the page
 
+Quote Post
fontp
сообщение Mar 26 2012, 07:46
Сообщение #11


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

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



QUOTE (kolobochishe @ Mar 22 2012, 10:43) *
Вот сейчас в голову пришла такая "идея". Если разрешение по частоте допустимо порядка 100Гц, то брать последовательно по шкале времени участки (N штук) по 16384 элементов, вычислить для каждого FFT, просуммировать коэффициенты одинаковых частот и поделить на количество участков N. Получим спектральную характеристику продолжительного участка, но с небольшими требованиями к памяти и небольшим размером файла результата.

Как идея?

Одно "НО". Как суммировать коэффициенты? векторно (как комплексные числа) или по модулю?

По сути это вариант "скользящего" окна, но с суммированием.


Идея так себе. Перидиограммы так и считают, но там ставится цель не обеспечить разрешение, а усреднить случайные флуктуации. Однако разрешение при некогерентном складывании "многих окон" не возрастет вообще, а определяется размером преобразования.

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

QUOTE (kolobochishe @ Mar 26 2012, 11:08) *
Хочется готовое 100% работающее решение. Имел ввиду что-то, что кардинально изменит требования к памяти и скорость, а не использование других типов. Ну и чтобы кто-нибудь поделился своим мнением и опытом по поводу различных реализаций БПФ.


Если использование длинного окна обусловлено требованиями к разрешению, кардинально ничего Вы не измените.
Скорость немного можно подправить использованием целых типов, а требование по памяти немного можно уменьшить как сказано выше, если считать синусы/косинусы итеративно, а не держать таблицу. Короткий целый тип тоже даст экономию в двое.
Кроме того можно найти реализации без всяких больших рабочих массивов WSTORE, в том числе и "на месте", т.е. такие чтобы входной массив совпадал с выходным. Теретически можно избавиться от всех таблиц (синусных и инверсной адресации) и провести преобразование "на месте". Тогда получите N/2 от ОЗУ


PS. Есть один такой чувак который лет 20 уже пишет книгу и библиотек про быстрые преобразования. Там посмотрите, может найдете "на месте". Там их столько, что огого. http://www.jjj.de/fxt/
Go to the top of the page
 
+Quote Post
blackfin
сообщение Mar 26 2012, 08:43
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(kolobochishe @ Mar 21 2012, 15:40) *
Считает это дело мое устройство примерно секунд 50 (100МГц тактовая, 64МБ 100МГц SDRAM).

А сколько нужно? 49 секунд устроит? wink.gif

И какая нужна точность по амплитуде на выходе?

Для целочисленных алгоритмов число "шумящих" разрядов растет примерно как 0.5*[log2(N)-2], так что для FFT на 65536 точек с фиксированной запятой Вы потеряете семь младших бит.

Точнее можно промоделировать в MATLAB'е.

PS. Кстати, для вещественных данных: Efficient_FFT_Computation_of_Real_Input
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 26 2012, 09:33
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(blackfin @ Mar 26 2012, 13:43) *
А сколько нужно? 49 секунд устроит? wink.gif

И какая нужна точность по амплитуде на выходе?

Для целочисленных алгоритмов число "шумящих" разрядов растет примерно как 0.5*[log2(N)-2], так что для FFT на 65536 точек с фиксированной запятой Вы потеряете семь младших бит.

Точнее можно промоделировать в MATLAB'е.

PS. Кстати, для вещественных данных: Efficient_FFT_Computation_of_Real_Input


нет. 49 тоже многовато sm.gif до 5 секунд было бы хорошо.
АЦП 16 бит - поэтому очень жалко 7 бит терять. Или я неправильно понял?

Цитата(fontp @ Mar 26 2012, 12:46) *
...
Если использование длинного окна обусловлено требованиями к разрешению, кардинально ничего Вы не измените.
...
PS. Есть один такой чувак который лет 20 уже пишет книгу и библиотек про быстрые преобразования. Там посмотрите, может найдете "на месте". Там их столько, что огого. http://www.jjj.de/fxt/



Нет. Требование к разрешению примерно 100 Гц. 16384 элемента вполне хватает. Требование по времени, которое охватывает БПФ. Т.е. спектр за 1 секунду, например. Итого - 2млн элементов. Разрешение 1Гц мне не надо.

За ссылку спасибо sm.gif
Go to the top of the page
 
+Quote Post
blackfin
сообщение Mar 26 2012, 09:35
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(kolobochishe @ Mar 26 2012, 13:26) *
АЦП 16 бит - поэтому очень жалко 7 бит терять. Или я неправильно понял?

Всё правильно. Если процессор целочисленный, можно посчитать FFT в целых числах - в формате "fract 24.8".

Сообщение отредактировал blackfin - Mar 26 2012, 09:36
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 28 2012, 10:11
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Нашел в интернете интересную статью как раз о том, какие переменные при какой разрядности входных данных надо использовать. Мне при 16 битах надо float

Еще можно за 1 проход делать 2 действительных БПФ, но пока я не совсем понял, как это реализовать. Кому интересно - вот статейка


Цитата(blackfin @ Mar 26 2012, 13:43) *
PS. Кстати, для вещественных данных: Efficient_FFT_Computation_of_Real_Input


кстати ссылка о том же sm.gif но на англицком
Прикрепленные файлы
Прикрепленный файл  ________________________.pdf ( 259.67 килобайт ) Кол-во скачиваний: 60
Прикрепленный файл  fft.pdf ( 358.79 килобайт ) Кол-во скачиваний: 35
 
Go to the top of the page
 
+Quote Post

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

 


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


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