Вот возникла задумка сделать штуковину для обработки сигналов кардиограммы, с использованием нейронных сетей и нахождением паттернов (различных нарушений работы сердца) в режиме реалтайм. Это конечно не медицинское оборудование, а прототип, целью которого является демонстрация возможностей атини и отсутсвие необходимости использования "суперкомпьютеров" с матлабами и прочей лабудой.
Первично - возникла проблема разделения сигнала ЭКГ на циклы. Что в матлабе делалось мышкой (взять статистику по уровню, найти выбросы, по выбросам уже найти период, или непрерывное вейвлет преобразование, или автокорреляционная функция, или вычисление минимума функции на промежутке и т.п....) на атини просто не влазит в память. Попробовал сделать фильтр Гаусса с сплавающим весовым окном. Результат как на картинке:

Теперь нахождение циклов - плёвое дело: берём любые три максимума подряд - самый большой и будет началом цикла - далее отсчитываем по три.
Проблема с кодом. Делает то он то что надо, но тормозит жутко, да и памяти жрёт немеренно. Вот он собственно сам:
Код: Выделить всё
int *MWGWF(int DATA[])
{
double ALPHA = 2.5; char WINDOW = 31;
int OUT[(sizeof DATA / sizeof DATA[0])];
char j, i, n, x, N = WINDOW - 1;
double power, h[WINDOW-1];
for(i = - N / 2; i <= N / 2; i++)
{
if (i & 32768u) { n = 32768u - (i & 32767u); } else { n = i; }
power = - 0.5 * (2.5 * n / 15.0);
union { double d; int x[2]; } u = { power };
u.x[1] = (int)(2 * (u.x[1] - 1072632447) + 1072632447); u.x[0] = 0;
union { double df; int xf[2]; } uf = { 2.7 };
uf.xf[1] = (int)(u.d * (uf.xf[1] - 1072632447) + 1072632447);
uf.xf[0] = 0;
h[i+(WINDOW-1)/2] = uf.df / 20;
}
x = (sizeof DATA / sizeof DATA[0]);
for(i = 0; i < x; i++)
{
for(j = -1 * WINDOW; j <= WINDOW; j++)
{
if(j > -1 && j < x - i + 1)
OUT[i] = OUT[i] + DATA[i+j] * h[j+WINDOW+1];
}
}
return OUT;
}Есть ли идеи как его можно оптимизировать?
only pure true norwegian blackx 