当前位置: 首页 > 知识库问答 >
问题:

减少实时绘图数据的有效方法

解晟睿
2023-03-14

现在,我需要使用Windows窗体图表以实时速度绘制数据。它将是完美的750个样本绘制在图表内的速度约为30 fps。我遇到的问题在于以一种快速的方式减少数据库而又不损失图的可靠性的算法。

我的想法(数据在值=127附近振荡):

>

  • 只需选择每(20万/750)个点即可选择750点

    最后一个问题:考虑到我收集的数据总是相同的缓冲区(设备只是不断地用新数据覆盖这个缓冲区),我是否应该考虑使用指向我庞大的数据缓冲区或数据副本的指针表作为绘图数据?

    这是我的第一个帖子,所以如果在帖子的风格上会有什么错误,请通知我。

  • 共有1个答案

    微生旻
    2023-03-14

    我开发了一个应用程序,它以256Hz(256个样本/秒)从16个通道读取数据,并以16种不同的图表显示数据。实时绘制所有数据的最佳方式是使用一个单独的线程来更新绘图。下面的解决方案(用C#编写)可能对您也很有用。

    当读取新数据时,数据存储在列表或数组中。由于是实时数据,所以这里也生成了时间戳。使用所获取数据的采样率:timeStamp=timeStamp+sampleidx/sampleRate;

    public void OnDataRead(object source, EEGEventArgs e)
            {
                if ((e.rawData.Length > 0) && (!_shouldStop))
                {
                    lock (_bufferRawData)
                    {
                        for (int sampleIdx = 0; sampleIdx < e.rawData.Length; sampleIdx++)
                        {
                            // Append data
                            _bufferRawData.Add(e.rawData[sampleIdx]);
    
                           // Calculate corresponding timestamp
                          secondsToAdd = (float) sampleIdx/e.sampleRate;
    
                        // Append corresponding timestamp
                        _bufferXValues.Add( e.timeStamp.AddSeconds(secondsToAdd));
                        }
                    }
    

    然后,创建一个每N毫秒Hibernate一次的线程(100ms适合于2秒的数据显示,但如果我想显示10秒,我需要增加到500ms的线程Hibernate时间)

     //Create thread
     //define a thread to add values into chart
     ThreadStart addDataThreadObj = new ThreadStart(AddDataThreadLoop);
     _addDataRunner = new Thread(addDataThreadObj);
     addDataDel += new AddDataDelegate(AddData);
    
     //Start thread
     _addDataRunner.Start();
    
     private void AddDataThreadLoop()
        {
            while (!_shouldStop)
            {
                chChannels[1].Invoke(addDataDel);
    
                // Sleeep thread for 100ms
                Thread.Sleep(100); 
            }
        }
    
    private void AddData()
        {
            // Copy data stored in lists to arrays
            float[] rawData;
            DateTime[] xValues;
    
                if (_bufferRawData.Count > 0)
                {
                    // Copy buffered data in thread-safe manner
                    lock (_bufferRawData)
                    {
                        rawData = _bufferRawData.ToArray();
                        _bufferRawData.Clear();
                        xValues = _bufferXValues.ToArray();
                        _bufferXValues.Clear();
                    }
    
                    for (int sampleIdx = 0; sampleIdx < rawData.Length; sampleIdx++)
                    {
                            foreach (Series ptSeries in chChannels[channelIdx].Series)
                                // Add new datapoint to the corresponding chart (x, y, chartIndex, seriesIndex)
                                AddNewPoint(xValues[sampleIdx], rawData[sampleIdx], ptSeries);
               }
          }
     }
    
     类似资料:
    • 在Spark中有几个优化可以减少批处理的时间。这些可以在优化指南中作了讨论。这节重点讨论几个重要的。 数据接收的并行水平 通过网络(如kafka,flume,socket等)接收数据需要这些数据反序列化并被保存到Spark中。如果数据接收成为系统的瓶颈,就要考虑并行地接收数据。注意,每个输入DStream创建一个receiver(运行在worker机器上) 接收单个数据流。创建多个输入DStrea

    • 我们希望单独写每个列表,也以前写的文件不应该加载到堆,而写下一个列表。

    • 减少图层数量     初始化图层,处理图层,打包通过IPC发给渲染引擎,转化成OpenGL几何图形,这些是一个图层的大致资源开销。事实上,一次性能够在屏幕上显示的最大图层数量也是有限的。     确切的限制数量取决于iOS设备,图层类型,图层内容和属性等。但是总得说来可以容纳上百或上千个,下面我们将演示即使图层本身并没有做什么也会遇到的性能问题。 裁切     在对图层做任何优化之前,你需要确定你

    • 本文向大家介绍Python产生Gnuplot绘图数据的方法,包括了Python产生Gnuplot绘图数据的方法的使用技巧和注意事项,需要的朋友参考一下 gnuplot的绘图可以直接选取文件绘图,文件格式要求如下: x1 y1 x2 y2 ...... xn yn 在python中利用文件操作的write方法可以非常方便实现,在此记录一下,这里强调s的是gnuplot的绘图,用python只是产生一

    • 问题内容: 我以两个数组获取一些数据:一个用于时间,另一个用于值。当我达到1000点时,我会触发信号并绘制这些点(x =时间,y =值)。 我需要保持与之前相同的图形,但只有一个合理的数字才能避免减慢处理速度。例如,我想在图表上保留10,000点。matplotlib交互式绘图工作正常,但是我不知道如何删除第一个点,这会很快减慢计算机速度。我查看了matplotlib.animation,但它似乎

    • 问题内容: 我有一个应用程序,该应用程序每秒更新一次变量约5到50次,并且我正在寻找某种实时绘制此变化的连续XY图的方法。 尽管不建议使用JFreeChart来获得如此高的更新速率,但是许多用户仍然说它适用于他们。我尝试使用此演示并将其修改为显示随机变量,但似乎一直都在使用100%的CPU。即使我忽略了这一点,我也不希望限于JFreeChart的ui类来构造表单(尽管我不确定其功能到底是什么)。可