Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разное (электроника) > Сигнальные процессоры и с чем их едят


Автор: Курсант 14.5.2011, 10:45
Всем здравствуйте smile

Пытаюсь срочно изготовить для дипломного проекта железяку. Идеология железяки - считывание входного сигнала и генерация выходного. Алгоритм обработки входного сигнала есть, схему на микроконтроллере в общем то сделаю, программу адаптирую. И вроде никаких трудностей, но есть подозрение, что лучше реализовать все на сигнальном процессоре... Но я ничего про них не знаю. Ни как их втыкать в схему, ни вообще что это такое, какие у них бывают входы и выходы. Разбираться по мануалам времени совсем нет - осталось только 1.5 месяца до сдачи, на работе график напряженный, дома приходится работать иногда.
В связи с этим вопрос - сигнальные процессоры с точки зрения применения в схеме - это то же самое что микроконтроллеры? Им нужно только питание и аналоговый вход/выход? У них есть встроенные АЦП и ЦАП? Тактовые генераторы?

Или это тоже самое что процессоры, и им нужен чипсет там и прочая фигня, и устройство по сложности рискует превратиться в материнскую плату...

Намного ли сложнее программировать под сигнальный процессор по сравнению с программированием под микроконтроллер?

Наверное, эти ответы и станут определяющими в выборе железа для реализации.

Пока что собираюсь поставить Attiny 2313, в качестве входа юзать встроенный АЦП, на выходе поставить ЦАП, после ЦАП поставить усилитель. Но это мне кажется примитивным.

Автор: xvr 15.5.2011, 15:45
Цитата(Курсант @  14.5.2011,  10:45 Найти цитируемый пост)
В связи с этим вопрос - сигнальные процессоры с точки зрения применения в схеме - это то же самое что микроконтроллеры? Им нужно только питание и аналоговый вход/выход? У них есть встроенные АЦП и ЦАП? Тактовые генераторы?

Грубо говоря - да.

Цитата(Курсант @  14.5.2011,  10:45 Найти цитируемый пост)
Намного ли сложнее программировать под сигнальный процессор по сравнению с программированием под микроконтроллер?

У них разные сферы применения. Сигнальные процессоры (или как их называют родители - DSP) оптимизированы под цифровую обработку сигналов (ЦОС как к нас говорят), т.е. под математические алгоритмы, в основном циклические. Так что у них в системе команд присутствуют специальные команды для организации циклов, а так же есть специальные команды (и аппаратура)  для всяких специфичных вычислений, например умножение с накоплением (MAC) - перемножаются 2 числа и прибавляются к аккумулятору расширенной разрядности.


Цитата(Курсант @  14.5.2011,  10:45 Найти цитируемый пост)
Алгоритм обработки входного сигнала есть, 

Огласите алгоритм, можно будет сказать более подробно - нужен вам DSP или будет достаточно обычного контролера. Например, если вам нужно считать FFT в реальном времени, то DSP однозначно нужно. Если же нужно сделать примитивное скользящее усреднение, то DSP не нужен.

Подсказка - многие м/сх разных кодеков (например все аппаратные MP3 декодеры), это специализированные DSP с масочными прошивками


Автор: Mazzi 15.5.2011, 17:29
Цитата(Курсант @ 14.5.2011,  10:45)
Пока что собираюсь поставить Attiny 2313, в качестве входа юзать встроенный АЦП...

В этом микроконтроллере нет АЦП.

Автор: Курсант 16.5.2011, 21:08
Цитата(Mazzi @  15.5.2011,  17:29 Найти цитируемый пост)
В этом микроконтроллере нет АЦП.


Да, действительно, в нем нет АЦП, а мне в одном месте сказали что есть... Спасибо большое.

Цитата(xvr @  15.5.2011,  15:45 Найти цитируемый пост)
Огласите алгоритм, можно будет сказать более подробно - нужен вам DSP или будет достаточно обычного контролера.


Алгоритм сейчас не могу расписывать - достаточно нудное дело... Он циклический, на каждом шаге высчитываются коэффициенты, один по формуле e^f(t), второй по формуле sin(wt+fi)... Потом эти коэффициенты участвуют в формуле типа ax+by... и так далее, в общем умножение и сложение...
Про сигнальный процессор подумалось потому, что есть подозрение, что на нем за фиксированное время можно посчитать экспоненту или синус... Раз уж вычисления циклические, и на каждом шаге надо считать экспоненту и синус, и чем выше частота тем выше точность прибора...

Автор: Курсант 16.5.2011, 21:40
впрочем, попозже сяду и распишу... сейчас не могу... smile

Автор: Курсант 21.5.2011, 22:01
Собственно расписываю... 
Код

include <avr/io.h>
#include <math.h>

float x11 = 0;
float x21 = 0;

void main (void) {

 float T=0.1;
 float K=10;
 float ksi=0.2;
 float dt = 0.00001;
 float u = -ksi/T;
 float v = sqrt (1-ksi*ksi)/T;
 float A11 = exp(u*dt)*(v*cos(v*dt)-u*sin(v*dt))/v;
 float A12 = exp(u*dt)*sin(v*dt)/v;
 float A21 = -exp(u*dt)*sin(v*dt)*(u*u+v*v)/v;
 float A22 = exp(u*dt)*(u*sin(v*dt)+v*cos(v*dt))/v;
 float B11 = -exp(u*dt)*K*cos(v*dt)+K+exp(u*dt)*K*u*sin(v*dt)/v;
 float B21 = exp(u*dt)*K*u*sin(v*dt)*u/v+exp(u*dt)*K*v*sin(v*dt);
 float C11 = 1;
 float C12 = 0;
 float g = 1;
 x11 = A11*x11+A12*x21+B11*g;
 x21 = A21*x11+A22*x21+B21*g;
 float y = C11*x11+C12*x21;

}


Примерно такой код.
Это код обработки входного сигнала.
При эмуляции в AVR Studio для контроллера Atmega 16 получилось 80 000 тактов. То есть частота дискретизации и обработки - порядка 200 действий в секунду. Маловато будет... Можно конечно вынести за скобки экспоненту и синусы с косинусами. Но в общем то мало верится в результат. Еще ближе мне идея работать через ассемблер, но это получится нетехнологично - под си у меня даже моделирование сделано...

Применение сигнального процессора принесет больший эффект?

Автор: xvr 21.5.2011, 22:27
Непонятно, что из этого всего переменные, а что константы. Пока складывается впечатление, что все константы. Если так, то процессор вообще не нужен  smile 
В противном случае AVR явно не потянет, тут надо что то типа ARM'а (как минимум). sin и exp считать табличным методом.
DSP в данном случае IMHO перебор.

Автор: Курсант 21.5.2011, 22:47
Да, точно smile Получилось что константы - но это только шаг бесконечного цикла, я сделал тестовый прогон одного шага чтобы выяснить время выполнения, да так и отправил smile

Автор: Курсант 22.5.2011, 09:52
В продолжение темы... Скачал 5-ю студию, пытаюсь отладить программу на 32-разрядной архитектуре. Пишет что "undefined reference to sqrt, sin, cos, exp". Текст программы:
Код

#include <avr32/io.h>
#include <math.h>

double x11 = 0;
double x21 = 0;
double T=0.1;
double K=10;
double ksi=0.2;
double dt = 0.00001;

double A11, A12, A21, A22, B11, B21, C11, C12, g, y;

void main (void) {

double u = -ksi/T;
double v = sqrt (1-ksi*ksi)/T;
double eudt = exp ( u * dt );
double vdt = v * dt;
double cosvdt = cos (vdt);
double sinvdt = sin (vdt );
double keudt = K * eudt;
double vsinvdt = v * sinvdt;
double usinvdt = u * sinvdt;
double vcosvdt = v * cosvdt;
double ucosvdt = u * cosvdt;

 A11 = eudt*(vcosvdt - usinvdt)/v;
 A12 = eudt*sinvdt/v;
 A21 = -eudt*sinvdt*(u*u+v*v)/v;
 A22 = eudt*(u*sin(vdt)+v*cos(vdt))/v;
 B11 = -keudt*cos(vdt)+K+keudt*u*sin(vdt)/v;
 B21 = keudt*u*sin(vdt)*u/v+keudt*v*sin(vdt);
 C11 = 1;
 C12 = 0;
 g = 1;
 x11 = A11*x11+A12*x21+B11*g;
 x21 = A21*x11+A22*x21+B21*g;
 y = C11*x11+C12*x21;

}


Файл math.h я нашел, во внутренностях какой то 
Код

extern double sqrt _PARAMS((double));

прописан, дальше я не понял ничего... Можно ли для начала воспользоваться какими-то библиотечными синусами-косинусами-экспонентами, или сразу табличное вычисление реализовывать?

Автор: daemonaz 19.8.2011, 15:53
На мой взгляд лучше заранее вычислить эти константы где-нибудь на ПК (mathlab), затем созадть таблицу констант, остается ввести исходные данные и вычислить. Лучше делать не в float, а в Int. предварительно преобразовав числа с плавающей точкой в целочисленные.

Автор: ТарасАтавин 23.11.2013, 17:04
Целочисленный синус - это очень весело. И ну ка прикиньте, сколько будет весить таблица, например, синуса на весь период с шагом в нанорадиан?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)