Автор Тема: Микроконтроллер - как перспектива примочкостроения  (Прочитано 25088 раз)

0 Пользователей и 1 Гость просматривают эту тему.

burjak

  • Сообщений: 186
  • фуз forever!
    • Просмотр профиля
    • E-mail
Ну не обязательно Матлаб. Если Вы уже написали программу, корректно вычисляющую линейную свертку, то этого достаточно.
Хотя загоните сюда данные и результаты(проги и контроллера), я сравню с матлабовскими

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Кажется, догадываюсь, в чем дело. Пересматривал еще раз доки на эти функции и увидел кое-что, что сначала ускользнуло: оказывается, БПФ надо скармливать комплексный сигнал парами значений re1 im1, re2 im2, и т.д. А я подсовывал ей действительный массив :D. Это как раз  объясняет, почему прямое-обратное дает правильный исходный результат, а вместо перемножения образов перемножаем неизвестно что!
Пошел пробовать, как я раньше этого не доглядел!!!

Да, именно это и было причиной глюка. Спасибо, что откликнулись, burjak :)
« Последнее редактирование: Февраля 27, 2012, 07:08:45 pm от Rus »

burjak

  • Сообщений: 186
  • фуз forever!
    • Просмотр профиля
    • E-mail
Ну вот ;)
Рад, что разобрались
Сам бывает долго и нудно какую-то несчастную фигулинку ищу :)

bunyaman

  • Сообщений: 136
  • GtLab.Net forever!
    • ICQ клиент - 485470807
    • Просмотр профиля
    • E-mail
Хочу собрать сей агрегат
http://www.diystompboxes.com/smfforum/index.php?topic=77471.0

МК нашел, купил. А вот с программатором дела обстоят похуже. Купить готовый не получается(где был- нету, а слишком навороченнный мне не нужен пока). Схем в инете валом, но выбрать мне сложно:) Подскажите, пожалуйста, вариант попроще для МК  PIC 16F684.

research

  • Гость
PICkit3 очень даже.
Либо купи готовый контроллер прошитый (т.к. на этой прошивке многие тремоло делают), или прошей у соседа.

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Домучил наконец свой проект в Keil'e...удалось получить длину импульса до 37.5 мс при частоте дискретизации 44.1.
Задумался вот теперь, как это воплотить в реальность. Микроконтроллеры в руках никогда не держал вообще. Пока положил глаз вот на эту борду http://www.rcscomponents.kiev.ua/product/EA-XPR-003.html. Подскажите, совместима ли она с Кейлом и надо ли что-то еще, чтоб прошить и запустить проц?

klb128

  • Сообщений: 34
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Keil поддерживает все ARM-ы, это какгбе родимый компилятор, только с другой оболочкой.
Чтобы нормально делать проекты на ARMах, надо иметь дебагер, j-link на пример.

С фурье в риалтайме ничего дельного не выйдет - будет задержка на длину импульса
А циклическая свертка "в лоб" - надо считать, хватит ли тактовой или нет, зависит от длины импульса.
Ну такие вещи лучше делать на DSP, там архитектура более заточена под такую математику, хотя в Cortex-M3 есть некоторые юзабельные инструкции, но все же спец.дсп будет быстрее.

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Да я в курсе, что родной, но поддерживает ли он тот дебаггер, что я по ссылке привел?
Не спорю, что на специализированных дсп быстрее, но хочу пока что-то недорогое поиграться на первое время, обкатать алгоритмы, а дальше видно будет.
а с чего вы взяли про задержку в длину импульса? Не обязательно ведь делать входной буфер равным длине импульса. Можно и меньше ;) У меня в текущей конфигурации задержка ровно в 2 входных блока, что получается около 18 мсек при импульсе 37.5 мсек.
В лоб считать не пробовал, но думаю, что будет затратнее.
« Последнее редактирование: Марта 10, 2012, 09:53:10 am от Rus »

klb128

  • Сообщений: 34
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Цитировать
Да я в курсе, что родной, но поддерживает ли он тот дебаггер, что я по ссылке привел?
, сорри, не заметил,что то де баггер. Нет,конечно. No, there is no way connecting the LPC-Link to the Keil IDE.

Цитировать
а с чего вы взяли про задержку в длину импульса? Не обязательно ведь делать входной буфер равным длине импульса. Можно и меньше
Не, ну можно конечно делать ффт низкого разрешения, все зависит от импульса, требуемой детализации на нч тобышь...
Судя по задержке 18мс, разрешение где-то 44110/512.
По длине буффера - а как иначе? Интерполировать что ли?

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Цитировать
Нет,конечно. No, there is no way connecting the LPC-Link to the Keil IDE.
Ну это ничего. Можно ведь отлаженнй проект из кейла перенести в родную IDE експрессы и через нее залить. Или через бутлоадер какой-нибудь. Пока не вникал в тонкости этого процесса.
Кстати... а на сколько симулятор кейла адекватен реальности? Боюсь, чтоб не получилось так, что в симе работает, а на железке не будет.
Ну смотрите... У меня длина буфера сигнала 400 точек  и 1648 длина импульса. Следовательно, длина свертки будет 2047 точек. Поэтому, делаю 2048-точечное ффт 400-сот точек буфера и всего импульса (один раз при старте). А разрешение ффт от длины буфера не зависит, он м.б. и меньше, но проц не будет успевать считать.

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Ну смотрите... У меня длина буфера сигнала 400 точек  и 1648 длина импульса. Следовательно, длина свертки будет 2047 точек. Поэтому, делаю 2048-точечное ффт 400-сот точек буфера и всего импульса (один раз при старте). А разрешение ффт от длины буфера не зависит, он м.б. и меньше, но проц не будет успевать считать.

Ересь какая-то. Разрешение по частоте у Фурье - fдискретизации/N. Далее - тема склейки блоков не раскрыта совершенно. Далее - не охота тут разводить арифметику, но поверьте, для получения адекватной задержки с адекватной обрабатываемой длинной импульса есть только одна возможность - тупо считать свертку.

Дальше чистая арифметика (для Cortex-M3):

LDM в два регистра (текущий коэффициент и текущий семпл) - 3 такта
MLA (собственно операция MAC) - 2 такта

Примечание - буфер семплов и буфер коэффициентов - это одно и тоже, идет 32хбитный коэффициент (усеченный до 16 бит), потом 32хбитный семпл (усеченный до 16 бит) и так далее. Посему надо еще организовывать сдвиг семплов в буфере, но это выполняется при помощи DMA одновременно с собственно вычислением свертки самим процом.

Итого имеем 5 тактов на тап. При частоте дискретизации 48кГц и 100МГц тактовой имеем N=100МГц/(5*48кГц)=416 тапов. Что, конечно, маловато, ибо позволяет иметь нижнюю обрабатываемую частоту всего лишь 115Гц (=48кГц/416).

Ну можно соптимизировать до 4.25 такта на тап (с общей задержкой в 4 семпла), но это не сделает погоды. Можно еще скинуть семплрейт до 44.1кГц - в общем, можно достигнуть нижней обрабатываемой частоты в 82Гц.

Овчинка на CM3 не стоит выделки. Можно попробовать на Cortex-M4 - там есть двухствольный MAC, который за один такт обрабатывает 2 тапа. Плюс загрузка нужна будет только одна на два тапа - это будет 1+3 такта на два тапа, т.е. 2 такта на тап. При заявляемых частотах 150МГц и 48кГц будем иметь 1562 тапа за семпл, что, в общем, вполне адекватная цифра (30Гц нижняя обрабатываемая частота).

Как-то так.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Цитировать
Разрешение по частоте у Фурье - fдискретизации/N
И где я этому противоречил? Скорее всего, вы не так что-то поняли.
Цитировать
Далее - тема склейки блоков не раскрыта совершенно.
С ней все в порядке.
Цитировать
Овчинка на CM3 не стоит выделки. Можно попробовать на Cortex-M4 - там есть двухствольный MAC, который за один такт обрабатывает 2 тапа. Плюс загрузка нужна будет только одна на два тапа - это будет 1+3 такта на два тапа, т.е. 2 такта на тап. При заявляемых частотах 150МГц и 48кГц будем иметь 1562 тапа за семпл, что, в общем, вполне адекватная цифра (30Гц нижняя обрабатываемая частота).
На данном этапе меня вполне устраивает 1648 точек на 120 МГц проце. :)
Для особо неверующих:
http://www.onlinedisk.ru/image/842130/1.jpg
http://www.onlinedisk.ru/image/842131/2.jpg
« Последнее редактирование: Марта 14, 2012, 12:12:15 am от Rus »

klb128

  • Сообщений: 34
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Цитировать
Ересь какая-то. Разрешение по частоте у Фурье - fдискретизации/N. Далее - тема склейки блоков не раскрыта совершенно. Далее - не охота тут разводить арифметику, но поверьте, для получения адекватной задержки с адекватной обрабатываемой длинной импульса есть только одна возможность - тупо считать свертку.
+1, природу не обманешь

А так да, я тож на кортексе м3 начинал обработку делать, но потом забросил это дело, перешел на дсп и фпга. так что Rus, Вы на правильном пути. Тему раскисите и будете двигатся дальше ;)
По поводу 18мс - не знаю для чего Ваш девайс, но для звука это много, на слух 10мс уже слышно, при 20 я уже играть на гитаре не могу :)
« Последнее редактирование: Марта 14, 2012, 09:24:02 am от klb128 »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
перешел на дсп и фпга

К сожалению, FPGA с приличными ресурсами - слишком дорого. Из подходящих DSP могу предложить VS1053 - там вполне 50MMAC в секунду получается, что для 44100 дает длину импульса чуть больше килобайта, уже можно жить. Заодно в одном флаконе аудио-кодек.

Цитировать
Для особо неверующих:
http://www.onlinedisk.ru/image/842130/1.jpg
http://www.onlinedisk.ru/image/842131/2.jpg

Да таких картинок можно валом сделать. Дайте на вход пилот длинной 100мс (заведомо больше Вашего окна) и частотой 1кГц и покажите выход, вот тогда посмеемся.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

research

  • Гость
Еще несколько ведер и получится Line6 M9 ;) ARM есть, еще к нему шарк, рамы и кодек, и все.


Если серьезно. Засоветуйте, каким инструментарием шить SPI ROM. Интересует бюджетный программатор (инструмент предпочитаю покупать, чем делать самому абы как) и ненаколеночный софт.
Уже много где спрашивал, но натыкаюсь или на проекты под LPT или варез под вин98.

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Цитировать
Дайте на вход пилот длинной 100мс (заведомо больше Вашего окна) и частотой 1кГц и покажите выход, вот тогда посмеемся.
Не понял, что такое "пилот" - дал синус.

http://www.onlinedisk.ru/image/842508/1.jpg
Лень делать референсный тест в акустик миррор. Думаю, вы и сами знаете, как оно должно выглядеть. Всплеск в конце - следствие небольшой ступеньки в конце входного синуса. Т.к. он не закончился на 0, я его принудительно опустил. Но это не принципиально.
А теперь, Rst7, говорите, где смеяться. :D

Про 18 мс - да, согласен, для практического применения многовато (хотя лично для меня играбельно), но это не окончательный вариант.
« Последнее редактирование: Марта 14, 2012, 02:47:19 pm от Rus »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Думаю, вы и сами знаете, как оно должно выглядеть.

Выглядит похоже. Как Вы склеиваете вместе окна? Просто встык?
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

klb128

  • Сообщений: 34
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
@ Rst7
FPGA для более сложных вещей, где ресурсов даже 400мгц блекфина далеко не хватает. А так конечно дорого, а разработка еще дороже в разы :) Ну там своя кухня, можно и последовательно делать некот. вычисления, тем самым экономить вентили...
То все от задачи зависит, в одном проекте даже была пара простеньких фильтров на CPLD EPM1270 затактированный на 60мгц ;D просто нужно было считать довольно толстый поток, решение на процессоре стоило бы гороздо дороже в итоге

@ Rus, да картинки ни о чем не говорят, псевдокод выложите и всем знающим и так станет ясно
Да и на fft можно добится малой задержки, если в overlap-add напихать много нулей и мало сигнала, только по ресурсам это врядли дешевле будет, чем тупая свертка
« Последнее редактирование: Марта 14, 2012, 03:29:35 pm от klb128 »

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
@ Rst7
Завел выходной буфер, равный длине блока (А)+импульса. Свертки блоков суммирую с буфером, для каждой следующей итерации прибавляя к начальному индексу длину буфера. При этом последние А точек, к-рые ложатся на уже считанные данные, не суммирую, а перезаписываю.

@ klb128
Да, вроде-бы это так называется. Выигрышнее или нет, тут зависит от конкретной длины блока, длины ффт и длины импульса. Для короткого импульса может и будет выигрышнее в лоб считать.
« Последнее редактирование: Марта 14, 2012, 03:50:09 pm от Rus »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Завел выходной буфер, равный длине блока (А)+импульса. Свертки блоков суммирую с буфером, для каждой следующей итерации прибавляя к начальному индексу длину буфера. При этом последние А точек, к-рые ложатся на уже считанные данные, не суммирую, а перезаписываю.

Я не о том. Смотрите, Вы бьете отсчеты входного сигнала на кадры (назовем их так). Каждый кадр размером, как я понимаю, 400 отсчетов (семплов). Дальше над каждым блоком Вы выполняете линейную свертку с импульсом. И результат записываете на выход? Так?

Так вот, если Вы делаете именно так, то это неверно для сигнала длительностью более фрейма. В вычислении свертки каждого следующего фрейма отсутствует предыстория предыдущего фрейма. Например, если мы подадим на вход сигнал в виде перехода 0->1, совпадающего с 50тым семплом фрейма и другой сигнал, но с точкой перехода на 350м семпле, то на выходе получим разный результат, чего, естественно, не должно происходить при обычной лобовой линейной свертке, ибо она инвариантна от времени.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен