|
Максимально возможное окно для FFT при 64МБ ОЗУ. |
|
|
|
Mar 21 2012, 10:01
|

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

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

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

|
Хотя нет  тему не стоит удалять. В общем у меня получилось примерно так. тип double (8 байт) на реальную часть и тип double (8 байт) на мнимую часть. Если величина окна 2^20=1048576, то получается на исходный массив выборок - 16МБ, плюс 8МБ на массив WStore (пока не вник, не знаю точно можно от него избавится или нет). В итоге примерно 24МБ - вот такие требования. Мне пока не хватает примерно 4МБ, поэтому окно 2^19. Считает это дело мое устройство примерно секунд 50 (100МГц тактовая, 64МБ 100МГц SDRAM). Есть у кого алгоритмы получше? Где то вроде видел что-то такое: сделать много FFT последовательно накладывая окна, а потом эти результаты подвергнуть еще раз какому-то преобразованию. В итоге будет большое окно с маленькими требованиями к памяти. Такое возможно?
|
|
|
|
|
Mar 21 2012, 18:25
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(kolobochishe @ Mar 21 2012, 14:40)  Где то вроде видел что-то такое: сделать много FFT последовательно накладывая окна, а потом эти результаты подвергнуть еще раз какому-то преобразованию. В итоге будет большое окно с маленькими требованиями к памяти. Такое возможно? Ну была тут алхимическая дискуссия лет пару назад - сшивали некогеретные блоки и пытались сделать один большой и неразрывный  . Если серьезно, что хочется получить ? Если интересует какой-то узкий участок спектра с хорошим разрешением, тогда перенос на нулевую частоту -> фильтрация - децимация -> ФФТ.
--------------------
ну не художники мы...
|
|
|
|
|
Mar 22 2012, 13:28
|
Местный
  
Группа: Свой
Сообщений: 221
Регистрация: 10-12-05
Из: Украина
Пользователь №: 12 052

|
Цитата(kolobochishe @ Mar 22 2012, 08:43)  Если разрешение по частоте допустимо порядка 100Гц, то брать последовательно по шкале времени участки (N штук) по 16384 элементов, вычислить для каждого FFT, просуммировать коэффициенты одинаковых частот и поделить на количество участков N.
Как идея? Идея называется метод периодограмм. Складывать надо квадраты модулей, т.е. мощности одноименных бинов N участков. Результат - квадратный корень из суммы, деленной на N.
|
|
|
|
|
Mar 23 2012, 04:01
|

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

|
Проверил метод на практике. Не понравилось. На плате есть источник шума 125кГц (DC-DC). При амлитуде входного сигнала 3 мВ и фиксированной частоте он раз в 100 меньше на спектрограмме, чем этот входной сигнал. Но если входной сигнал имеет широкополосную ЧМ модуляцию, то в итоге, из-за своей стабильной частоты, на периодограмме сигнал наводки увеличивается пропорционально количеству просуммированных окон. Получается что хоть полезный сигнал по амплитуде и гораздо выше, но преобладающим в периодограмме будет стационарный сигнал наводки с DC-DC. Интересная особенность, где-то может и полезная, а в моем случае это не то, что нужно.
Попробую не суммировать, а для каждого бина искать максимум из N преобразований.
|
|
|
|
|
Mar 23 2012, 15:52
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(kolobochishe @ Mar 21 2012, 15:40)  Хотя нет  тему не стоит удалять. В общем у меня получилось примерно так. тип double (8 байт) на реальную часть и тип double (8 байт) на мнимую часть. Если величина окна 2^20=1048576, то получается на исходный массив выборок - 16МБ, плюс 8МБ на массив WStore (пока не вник, не знаю точно можно от него избавится или нет). В итоге примерно 24МБ - вот такие требования. Мне пока не хватает примерно 4МБ, поэтому окно 2^19. Считает это дело мое устройство примерно секунд 50 (100МГц тактовая, 64МБ 100МГц SDRAM). Есть у кого алгоритмы получше? Где то вроде видел что-то такое: сделать много FFT последовательно накладывая окна, а потом эти результаты подвергнуть еще раз какому-то преобразованию. В итоге будет большое окно с маленькими требованиями к памяти. Такое возможно? может попробовать считать арифметикой с фиксированной точкой(исключить double и float, следя за переполнениями и вовремя сдвигая результат)?
|
|
|
|
|
Mar 26 2012, 07:08
|

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

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

Эксперт
    
Группа: Свой
Сообщений: 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/
|
|
|
|
|
Mar 26 2012, 08:43
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(kolobochishe @ Mar 21 2012, 15:40)  Считает это дело мое устройство примерно секунд 50 (100МГц тактовая, 64МБ 100МГц SDRAM). А сколько нужно? 49 секунд устроит?  И какая нужна точность по амплитуде на выходе? Для целочисленных алгоритмов число "шумящих" разрядов растет примерно как 0.5*[log2(N)-2], так что для FFT на 65536 точек с фиксированной запятой Вы потеряете семь младших бит. Точнее можно промоделировать в MATLAB'е. PS. Кстати, для вещественных данных: Efficient_FFT_Computation_of_Real_Input
|
|
|
|
|
Mar 26 2012, 09:33
|

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

|
Цитата(blackfin @ Mar 26 2012, 13:43)  А сколько нужно? 49 секунд устроит?  И какая нужна точность по амплитуде на выходе? Для целочисленных алгоритмов число "шумящих" разрядов растет примерно как 0.5*[log2(N)-2], так что для FFT на 65536 точек с фиксированной запятой Вы потеряете семь младших бит. Точнее можно промоделировать в MATLAB'е. PS. Кстати, для вещественных данных: Efficient_FFT_Computation_of_Real_Inputнет. 49 тоже многовато  до 5 секунд было бы хорошо. АЦП 16 бит - поэтому очень жалко 7 бит терять. Или я неправильно понял? Цитата(fontp @ Mar 26 2012, 12:46)  ... Если использование длинного окна обусловлено требованиями к разрешению, кардинально ничего Вы не измените. ... PS. Есть один такой чувак который лет 20 уже пишет книгу и библиотек про быстрые преобразования. Там посмотрите, может найдете "на месте". Там их столько, что огого. http://www.jjj.de/fxt/Нет. Требование к разрешению примерно 100 Гц. 16384 элемента вполне хватает. Требование по времени, которое охватывает БПФ. Т.е. спектр за 1 секунду, например. Итого - 2млн элементов. Разрешение 1Гц мне не надо. За ссылку спасибо
|
|
|
|
|
Mar 28 2012, 10:11
|

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

|
Нашел в интернете интересную статью как раз о том, какие переменные при какой разрядности входных данных надо использовать. Мне при 16 битах надо float Еще можно за 1 проход делать 2 действительных БПФ, но пока я не совсем понял, как это реализовать. Кому интересно - вот статейка Цитата(blackfin @ Mar 26 2012, 13:43)  кстати ссылка о том же  но на англицком
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|