Views: 1255
Частенько приходиться на дисплей выводить данные в виде графиков, так более наглядно можно проследить за процессом и проанализировать его. Для этого разберем простую функцию на Си для реализации такой визуализации.
Данные полученные при измерениях должны быть помещены в буфер CaptBuf[N] где N – размер буфера. предварительно надо указать размер дисплея для вывода данных и координаты нижнего левого угла расположения дисплея. Данные в буфере должны иметь формат signed int (16 бит -32768 … 32767 со знаком).
#define dispoX 60 // ширина окна #define dispoY 32 // высота окна #define startX 0 // координата X левый нижний угол окна #define startY 0 // координата Y левый нижний угол окна
При вызове функции она извлекает количество данных (равных размеру дисплея dispoX) и преобразовывает их (если это необходимо) в одно полярное, а затем к диапазону 0-31, по высоте дисплея dispoY (в этом месте нет оптимизации, для других размеров придется подбирать значения деления и вводить постоянную смешения нуля). Преобразованные данные помещаем в массив BflyBuf[].
for(a=0;a<dispoX;a++) { pr=CaptBuf[a]+32768; // преобразование signed int -> unsigned int BflyBuf[a]= (pr>>11); // перевести в однополярное значение в диапазоне }
После это используя функции построение точки и линии на дисплее строим график из обработанных данных помещенных в массив BflyBuf[].
// рисование графика for(a=0;a<dispoX-1;a++) { line(1, startX+a+1, startY, startX+a+1, startY+dispoY);// очистка следующего столбца дисплея if(abs(BflyBuf[a]-BflyBuf[a+1])>1)// если разность больше по модулю 1 { if((a+1)<dispoX-1)line(0, startX+a, startY+BflyBuf[a], startX+a+1, startY+BflyBuf[a+1]);// рисовать линию } else { point(0, startX+a, startY+BflyBuf[a]); // рисовать точку } }
Пример работы функции для реализации визуализации аудио-данных в реальном времени.
Полный текст функции.
void oscilloscope (void)//Осцилограф { /*область индикации * dispX dispY * диапазон входного значения signed int -32768 … 32767 * преобразовывается в значение 0-32 * данные выводятся с позиции 0/0 */ #define dispoX 60 // ширина окна #define dispoY 32 // высота окна #define startX 0 // координата X левый нижний угол окна #define startY 40 // координата Y левый нижний угол окна unsigned int a,pr; for(a=0;a<dispoX;a++) { pr=CaptBuf[a]+32768; // преобразование signed int -> unsigned int BflyBuf[a]= (pr>>11); // перевести в однополярное значение в диапазоне } line(1, startX, startY, startX, startY+dispoY);// очистка первого столбца дисплея // рисование графика for(a=0;a<dispoX-1;a++) { line(1, startX+a+1, startY, startX+a+1, startY+dispoY);// очистка следующего столбца дисплея if(abs(BflyBuf[a]-BflyBuf[a+1])>1)// если разность больше по модулю 1 { if((a+1)<dispoX-1)line(0, startX+a, startY+BflyBuf[a], startX+a+1, startY+BflyBuf[a+1]);// рисовать линию } else { point(0, startX+a, startY+BflyBuf[a]); // рисовать точку } } }
Это может быть интересно
- Униполярный шаговый двигатель – часть 2Views: 798 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …
- ch-4050 – дифференциальный терморегуляторViews: 1851 ch-4050 – это не новая модель, это расширенная версия универсального терморегулятора ch-4000. Различия коснулись в появлении новой функции дифференциального регулирования. Это вид регулирования по разности температур измеренного двумя …
- Просто о внешних переменныхViews: 767 Часто возникает задача когда необходимо предавать данные между модулями программы. Например, передать данные между файлами, или управлять работой модулей. Для этого создаем заголовочный файл и описываем наши переменные как …
- Просто о структурах и объединениях в СиViews: 2145 Какие задачи нам позволяют решать структуры и объединения? Для разработчика встроенных систем эффективность и компактность кода всегда на первом месте. Если программировании на Ассемблере ты сам определяешь как …
- Проект с использованием MCC часть 12-2Views: 1009 Настало время для изучения шины I2C. Изучать будем на примере работы с индикатором RET012864E. Что изменили со старой схемы: В прошлой теме я затупил и не добавил подтягивающие резисторы …
- Real-time music visualization technologyViews: 95 Music visualization technology in real time (RTMV-technology). Я не музикант і я не маю спеціальної музичної освіти, я інженер розробник вбудованих систем. Але моє хобі розроблення технології візуалізації …
- Регулятор влажностиViews: 1370 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
- LED модуль P10C4V12Views: 3073 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
- Простой цифровой регулятор мощностиViews: 6428 Простой регулятор мощности с цифровой индикацией. Этот проект создан как обучающий, для ознакомления с основами построения сетевых регуляторов мощности. Устройства подобного типа можно использовать для управления освещением, скоростью …
- Altium Designer my setup system and project structure V23.3Views: 146 Оновлення бази даних та шаблонів від березня 2023 року. Updating the database and templates from March 2023. Altium Designer my Libraries, Project templates, System settings by Catcatcat. Дивись …