Получить график в реальном времени, синусоиду, состоящую из 100 точек и частотой от 0,01 гц до 0,5 г

ChiliC

New Member
25.03.2015
2
0
#1
Задача состоит в создании фильтра Analog to Digital.
Имеем такую схему:

и вот такую функцию:
y(n*T)=a*x(n*T)+a*x((n-1)*T)-b*y((n-1)*T)
a=T/T+2*R*C
b=T-2*R*C/T+2*R*C
T=1 секунде
Амплитудная характеристика:

Нужно получить график в реальном времени, синусоиду, состоящую из 100 точек и частотой от 0,01 Гц до 0,5 Гц получаемую с приборов.
Наброски программы:

Код:
r:='M2T5E';
send(adress,r,status);
delay(1000);
enter(r,255,1,adress,status);
s:=copy(r,3,12);
val(s,x[i],code);
initialize(21,0);
i:=3; j:=1;
intergraph(i,j,'C:\TP6\BGI');
line(x1,y1,x2,y2);
putpixel(x1,y1,red);
cleardevice;
 
R

rrrFer

Гость
#2
рисовать вот так вот линиями очень сложно. Устарело это лет на 20. Эти ваши line и putpixel рисуют в консоли BGI графикой, но так уже давно никто не делает и BGI поддерживается далеко не везде...

Есть готовые, удобные библиотеки. Все что от вас надо - сгенерировать массив точек (или 2 массива - отдельно координаты x, отдельно y). Ну и передать эти массивы рисовальщику графика. Вы сэкономите кучу времени, программа будет в тысячи раз надежнее (т.к. код таких библиотек используется миллионами людей ежедневно и баги фиксятся) и удобнее (юзер получит возможность масштабировать график, например). С небольшими доработками можно приделать к графику легенду и изменить тип диаграммы, например.

Если вы используете библиотеку Qt - то для отображения графиков, например, можно использовать QCustomPlot или QtCharts (последний раньше был платным, сейчас - не знаю, вроде как ходили слухи что стал бесплатным). Кроме того, есть Qwt, например.

Т.е. после того, как ты каким-то образом настроишь отображение линий (толщина графика, цвет, цвет точек, оси координат и т.п.):
C++:
m_curve->attach(m_plot);
  m_approx->attach(m_plot);
 
  m_curve->setVisible(true);
  m_approx->setVisible(true);
 
  m_curve->setPen(QPen(Qt::red, 2));
 
  m_approx->setBaseline(0);
  m_approx->setBrush(QColor(0, 0, 255, 50));
И заполнишь массивы точек (тебе это надо делать в любом случае - даже при использовании древнего BGI) - тут пример, но ты сам введешь свою функцию, при желании:
Код:
for (int i = 0; i < m_points_num; ++i) {
   x.push_back(a + i * h);
   y.push_back(integfun(a + i * h));
}
Тебе останется только установить эти данные для линии графика и обновить график:
Код:
m_curve->setSamples(x, y);
 
m_plot->replot();
Пример кода я взял из
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
. Весь код ты можешь скопировать без изменения - изменишь только функцию генерации точек и все будет работать.
 
Последнее редактирование:

ChiliC

New Member
25.03.2015
2
0
#3
рисовать вот так вот линиями очень сложно. Устарело это лет на 20. Эти ваши line и putpixel рисуют в консоли BGI графикой, но так уже давно никто не делает и BGI поддерживается далеко не везде...
спасибо большое за ответ, но задача стоит именно в BGI. Не так уж оно и сложно получается.
Теперь осталось подключить прибор и в реальном времени измерять частоту и строить график.
 
R

rrrFer

Гость
#4
Но значит у вас будет немного другой цикл. Вам надо помещать получаемые данные в массив и с заданным интервалом времени перестраивать график. Если данных может быть много (они же поступают постоянно) - то вместо массива лучше использовать связный список (это позволит быстро удалять старые данные, если скажем, надо рисовать график только за последние 30 секунд).