Перейти к содержанию
    

FFT на AVR32

Добрый вечер!

кто нибудь реализовывал быстрое преобразование фурье на микроконтроллере avr32? Поделитесь мнениями и навыками

Заранее благодарен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из первых рук (от Atmel) можно найти про это здесь :

http://support.atmel.no/knowledgebase/avr3...html/index.html

 

Да и вообще много чего можно еще наковырять на эту тему из интернета, если погуглить на "AVR32 + FFT".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, но то что можно было нарыть в интернете сделал

Из примеров атмела сделал DSP16_COMPLEX_FFT, возникли кое-какие вопросы:

1) значения вых.массива отличаются от реальных значений(в даташите AVR32718 на странице этот пример изображен на картинках, но выходные значения никак не совпадают с графиками). Также сделал из массива 1;0;0;1 ,то есть импульсный сигнал, после ффт преобразования получил 0,125+0i;0.06+0.06i;0;0.06-0.06. По сути эти значения умножить на 16 , то получится верно. Но почему так? ведь в коде нигде это не прописывается

2) Далее как подключить АЦП, чтобы массив накапливался из отчетов ацп, затем делалось ффт

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) значения вых.массива отличаются от реальных значений(в даташите AVR32718 на странице этот пример изображен на картинках, но выходные значения никак не совпадают с графиками). Также сделал из массива 1;0;0;1 ,то есть импульсный сигнал, после ффт преобразования получил 0,125+0i;0.06+0.06i;0;0.06-0.06. По сути эти значения умножить на 16 , то получится верно. Но почему так? ведь в коде нигде это не прописывается

Странно, конечно, но допустимо. Т.к. обычно алгоритмы FFT оптимизируются на скорость, ради чего постоянным множителем пренебрегают.

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

 

Например для вашего случая, когда исходный массив такой:

1

0

0

1

Результат FFT-преобразования, если верить MatLAb'у, будет таков:

2

1+i

0

1-i

Тем не менее, такой ответ не совсем правильный, поскольку норма вектора увеличилась в 4 раза (до преобразования было 2, а после стало 8). Однако на такие вещи положено закрывать глаза. Т.е., будь моя воля, то я бы дала такой ответ:

1

0.5 + 0.5i

0

0.5 - 0.5i

у которого норма тоже равна 2, как и у исходных данных.

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

 

В вашем же случае алгоритм не увеличил, а урезал норму выходного вектора, хотя по соотношениям частот рассчитал все правильно. Объяснить такую реализацию не могу. Если бы сама считала FFT, то, пожалуй, предпочла бы целочисленную реализацию (где вместо синусов и косинусов большие целые числа, промасштабированные на всю разрядную сетку). Там чуточку менее точно, зато много быстрее считает и не приходится конвертировать данные АЦП в значения с плавающий точкой. Но и масштабный коэффициент там очень большой.

 

2) Далее как подключить АЦП, чтобы массив накапливался из отчетов ацп, затем делалось ффт

Тут, думаю что всё тривильно - снимаешь с АЦП результат и кладешь его в массив по порядку. Говорят, есть возможность сделать автоматом через DMA, чтобы АЦП работал в периодическом режиме, а значения сами укладывались в память, но тут уж надо приглашать знатоков конкретного железа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

будь моя воля, то я бы дала такой ответ:

1

0.5 + 0.5i

0

0.5 - 0.5i

в матлабе и делается нормировка вектора, непонятно то что в самом коде нигде это не прописывается, остается лишь вариант искать в самой dsp-инструкции

 

Говорят, есть возможность сделать автоматом через DMA

Что за метод такой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в матлабе и делается нормировка вектора, непонятно то что в самом коде нигде это не прописывается, остается лишь вариант искать в самой dsp-инструкции

DSP-алгоритмы обычно ничего не нормируют, ради повышения скорости. Надеясь, что пользователь это сделает это сам при необходимости. И это правильно, т.к. для большинства приложений нормировка не нужна, или нормировать приходится не весь массив, а какой важный его участок, а то и всего одну из частот (максимальную). Скажем эквалайзер какой-нибудь, который по частотам гистограмму на дисплее строит. Там ведь все равно придется нормировать на высоту графика, а значит и не надо делать лишную работу при FFT.

 

> Говорят, есть возможность сделать автоматом через DMA

Что за метод такой?

Это не метод, а штука такая аппаратная в микропроцессоре сидит, Direct Memorу Access называется (прямой доступ в память). Ему указывают стартовый адрес массива (куда класть), место, откуда брать, и событие (какой-то флаг прерывания), по которому следует делать копирование. Знаю, что DMA используют при приеме символов от UART, USB, SPI и др. И вроде бы в том списке АЦП тоже есть.

 

Страница 6-ая даташита на AT32UC3A (rev. J):

4.1.3 Peripheral DMA Controller

• Transfers from/to peripheral to/from any memory space without intervention of the processor.

• Next Pointer Support, forbids strong real-time constraints on buffer management.

• Fifteen channels

– Two for each USART

– Two for each Serial Synchronous Controller

– Two for each Serial Peripheral Interface

One for each ADC

– Two for each TWI Interface

P.S. AT32UC3 - расчудесный микроконтроллер! :). У последних его моделей (кажется, UC3C) появилась аппаратная арифметика с плавающей точкой! А если сделать так, что DMA собирает данные от АЦП, не отвлекая на эту работу CPU, а тот, в свою очередь, занят FFT-преобразованием ранее собранного массива (пока DMA набирает текущий), то получится такая крутизна, что вам за реализацию несомненно поставят памятник еще при жизни! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Страница 6-ая даташита на AT32UC3A (rev. J):

Похоже разные даташиты смотрим, но в своем я тоже нашел описание DMA

 

P.S. AT32UC3 - расчудесный микроконтроллер! :). У последних его моделей (кажется, UC3C) появилась аппаратная арифметика с плавающей точкой! А если сделать так, что DMA собирает данные от АЦП, не отвлекая на эту работу CPU, а тот, в свою очередь, занят FFT-преобразованием ранее собранного массива (пока DMA набирает текущий), то получится такая крутизна, что вам за реализацию несомненно поставят памятник еще при жизни! :)

Это уже и есть преобразование в реальном времени

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...