Ejemplo n.º 1
0
        public RecordService(ISampleService sampleService, IEventAggregator eventAggregator)
        {
            int i;

            _sampleService = sampleService;

            ChannelNames    = new string[_sampleService.ChannelNum];
            ChannelNames[0] = "主驾驶";
            ChannelNames[1] = "副驾驶";
            ChannelNames[2] = "左后座";
            ChannelNames[3] = "右后座";

            Nfft    = 8192;
            FrameDN = _sampleService.PackLen;

            _SampleT = Nfft / _sampleService.fs;

            double df = _sampleService.fs / Nfft / 2;

            _fstarti = (int)Math.Floor(_fstart / df);
            _fstart  = _fstarti * df;
            _flen    = (int)Math.Ceiling(_fstop / df);
            if (_flen >= Nfft)
            {
                _flen = Nfft - 1;
            }
            _fstop = _flen * df;
            _flen  = _flen - _fstarti + 1;

            _aweight   = Weight.GetWeightData(FreqWeightType.AWeight, fstart, df, _flen);
            _aweightdb = new double[_aweight.Length];

            for (i = 0; i < _flen; i++)
            {
                _aweightdb[i] = 20 * Math.Log10(_aweight[i] * Math.Sqrt(2) / Nfft) + 93.9794; //93.9794为2e-5Pa参考
                _aweight[i]  *= _aweight[i];                                                  //93.9794为2e-5Pa参考
            }
            _overallFix = 20 * Math.Log10(Math.Sqrt(2) / Nfft) + 93.9794;

            _maxFrfData = new float[_flen];

            _spectrumCalculator = new SpectrumCalculator();

            Sens = new double[4];
            for (i = 0; i < 4; i++)
            {
                Sens[i] = 0.001764087 * 2 / 10.0909;// 5.0f / 32768 * 11.56112242;5.0f / 32768;//
            }

            _oldtimeData = new Int16[ChannelNum][];
            for (i = 0; i < ChannelNum; i++)
            {
                _oldtimeData[i] = new Int16[Nfft];
            }

            _eventAggregator = eventAggregator;
            _eventAggregator.GetEvent <SampleServiceStateChangedEvent>().Subscribe(OnSampleStateChanged, ThreadOption.BackgroundThread);
            _eventAggregator.GetEvent <SampleServiceDataEvent>().Subscribe(OnDataSampled, ThreadOption.BackgroundThread);
        }
 /// <summary>
 /// 释放并清空
 /// </summary>
 public void Dispose()
 {
     if (_spectrumCalculator != null)
     {
         _spectrumCalculator.Dispose();
         _spectrumCalculator = null;
     }
 }
        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="updateIntervalMs">FFT计算间隔</param>
        /// <param name="samplingFrequency">采样频率</param>
        /// <param name="windowLength">FFT的窗口长度</param>
        /// <param name="channelCount">频道数</param>
        public RealtimeFFTCalculator(double updateIntervalMs,
                                     int samplingFrequency, int windowLength, int channelCount)
        {
            _oldData = new double[channelCount][];
            for (int i = 0; i < channelCount; i++)
            {
                _oldData[i] = new double[0];
            }

            _intervalMs         = updateIntervalMs;
            m_iChannelCount     = channelCount;
            m_iFFTWindowLen     = windowLength;
            _samplingFrequency  = samplingFrequency;
            _startTicks         = DateTime.Now.Ticks;
            _lastTicks          = _startTicks;
            _updateInterval     = TimeSpan.FromMilliseconds(updateIntervalMs).Ticks;
            _spectrumCalculator = new SpectrumCalculator();
        }
Ejemplo n.º 4
0
        public void SetGraphs(LightningChartUltimate throughputGraph, LightningChartUltimate tfGraph,
                              LightningChartUltimate timeGraph, LightningChartUltimate freqGraph)
        {
            int    i, j;
            double fstart = _dataFileNode.fstart;
            double df     = _dataFileNode.fs / _dataFileNode.Nfft / 2;

            float[] maxfreq = _dbClientService.getMaxFrf(_dataFileNode.Id);
            flen = maxfreq.Length;

            _throughputGraph = throughputGraph;
            _tfGraph         = tfGraph;
            _timeGraph       = timeGraph;
            _freqGraph       = freqGraph;

            {
                _throughputGraph.BeginUpdate();
                _throughputGraph.Title.Visible = false;
                _throughputGraph.ViewXY.LegendBoxes[0].Position = LegendBoxPositionXY.TopRight;
                _throughputGraph.ViewXY.LegendBoxes[0].Layout   = LegendBoxLayout.Vertical;
                AxisX axisX = _throughputGraph.ViewXY.XAxes[0];
                axisX.Title.Text = "时间(s)";
                AxisY axisY0 = _throughputGraph.ViewXY.YAxes[0];
                axisY0.Title.Text = "声压(Pa)";
                AxisY axisY1 = new AxisY(_throughputGraph.ViewXY);
                axisY1.Title.Text = "总声压级(dBA)";
                _throughputGraph.ViewXY.YAxes.Add(axisY1);

                _maxrmsSeries                      = new SampleDataSeries(_throughputGraph.ViewXY, axisX, axisY1);
                _maxrmsSeries.Title.Text           = "最大总声压级";
                _maxrmsSeries.LineStyle.Color      = Colors.Red;
                _maxrmsSeries.SampleFormat         = SampleFormat.SingleFloat;
                _maxrmsSeries.FirstSampleTimeStamp = _dataFileNode.Nfft / _dataFileNode.fs / 2;
                _maxrmsSeries.SamplingFrequency    = _dataFileNode.fs / _dataFileNode.FrameDN;
                _throughputGraph.ViewXY.SampleDataSeries.Add(_maxrmsSeries);

                _rmsSeries                      = new SampleDataSeries(_throughputGraph.ViewXY, axisX, axisY1);
                _rmsSeries.Title.Text           = "总声压级";
                _rmsSeries.LineStyle.Color      = Colors.Blue;
                _rmsSeries.SampleFormat         = SampleFormat.SingleFloat;
                _rmsSeries.FirstSampleTimeStamp = _maxrmsSeries.FirstSampleTimeStamp;
                _rmsSeries.SamplingFrequency    = _maxrmsSeries.SamplingFrequency;
                _throughputGraph.ViewXY.SampleDataSeries.Add(_rmsSeries);

                _throughputgraph_verticalCursor                   = new LineSeriesCursor(_throughputGraph.ViewXY, axisX);
                _throughputgraph_verticalCursor.Style             = CursorStyle.VerticalNoTracking;
                _throughputgraph_verticalCursor.LineStyle.Color   = Colors.White;
                _throughputgraph_verticalCursor.LineStyle.Pattern = LinePattern.Dot;
                _throughputgraph_verticalCursor.LineStyle.Width   = 3;
                _throughputgraph_verticalCursor.ValueAtXAxis      = 10;
                _throughputgraph_verticalCursor.MouseHighlight    = MouseOverHighlight.None;
                _throughputGraph.ViewXY.LineSeriesCursors.Add(_throughputgraph_verticalCursor);

                _throughputSeries                      = new SampleDataSeries(_throughputGraph.ViewXY, axisX, axisY0);
                _throughputSeries.Title.Text           = "时域";
                _throughputSeries.LineStyle.Color      = Colors.Orange;
                _throughputSeries.SampleFormat         = SampleFormat.SingleFloat;
                _throughputSeries.FirstSampleTimeStamp = 0;
                _throughputSeries.SamplingFrequency    = _dataFileNode.fs;
                _throughputGraph.ViewXY.SampleDataSeries.Add(_throughputSeries);

                float[] _maxrmsData = new float[_dataFileNode.NFrame];
                _rmsData[0].CopyTo(_maxrmsData, 0);
                for (i = 1; i < _dataFileNode.NFrame; i++)
                {
                    for (j = 0; j < _dataFileNode.ChannelNum; j++)
                    {
                        if (_rmsData[j][i] > _maxrmsData[i])
                        {
                            _maxrmsData[i] = _rmsData[j][i];
                        }
                    }
                }
                _maxrmsSeries.SamplesSingle = _maxrmsData;

                _throughputGraph.EndUpdate();
            }

            {
                _tfGraph.BeginUpdate();
                _tfGraph.Title.Visible = false;
                //_tfGraph.ViewXY.LegendBoxes[0].Visible = false;
                _tfGraph.ViewXY.LegendBoxes[0].Position       = LegendBoxPositionXY.TopRight;
                _tfGraph.ViewXY.LegendBoxes[0].ShowCheckboxes = false;
                AxisX axisX = _tfGraph.ViewXY.XAxes[0];
                axisX.Title.Text = "时间(s)";
                AxisY axisY = _tfGraph.ViewXY.YAxes[0];
                axisY.Title.Text = "频率(Hz)";

                _tfSeries = new IntensityGridSeries(_throughputGraph.ViewXY, axisX, axisY);
                _tfSeries.PixelRendering    = true;
                _tfSeries.ContourLineType   = ContourLineTypeXY.None;
                _tfSeries.ValueRangePalette = CreatePalette(_tfSeries, 20, 100);
                _tfSeries.SetRangesXY(_dataFileNode.Nfft / _dataFileNode.fs / 2,
                                      _dataFileNode.Nfft / _dataFileNode.fs / 2 + (_dataFileNode.NFrame - 1) * _dataFileNode.FrameDN / _dataFileNode.fs,
                                      fstart, fstart + (flen - 1) * df);
                _tfSeries.MouseInteraction      = false;
                _tfSeries.LegendBoxUnits        = null;
                _tfSeries.LegendBoxValuesFormat = "0";
                //_tfSeries.Title.Visible = false;
                _tfSeries.Title.Text = "声压级(dBA)";
                _tfGraph.ViewXY.IntensityGridSeries.Add(_tfSeries);

                _tfgraph_verticalCursor                   = new LineSeriesCursor(_tfGraph.ViewXY, axisX);
                _tfgraph_verticalCursor.Style             = CursorStyle.VerticalNoTracking;
                _tfgraph_verticalCursor.LineStyle.Color   = Colors.White;
                _tfgraph_verticalCursor.LineStyle.Pattern = LinePattern.Dot;
                _tfgraph_verticalCursor.LineStyle.Width   = 3;
                _tfgraph_verticalCursor.ValueAtXAxis      = _throughputgraph_verticalCursor.ValueAtXAxis;
                _tfgraph_verticalCursor.MouseHighlight    = MouseOverHighlight.None;
                _tfGraph.ViewXY.LineSeriesCursors.Add(_tfgraph_verticalCursor);

                _tfgraph_horizontalCursor = new ConstantLine(_tfGraph.ViewXY, axisX, axisY);
                _tfgraph_horizontalCursor.LineStyle.Color   = Colors.White;
                _tfgraph_horizontalCursor.LineStyle.Width   = 3;
                _tfgraph_horizontalCursor.LineStyle.Pattern = LinePattern.Dot;
                _tfgraph_horizontalCursor.Value             = 2000;
                _tfgraph_horizontalCursor.ShowInLegendBox   = false;
                _tfgraph_horizontalCursor.MouseHighlight    = MouseOverHighlight.None;
                _tfGraph.ViewXY.ConstantLines.Add(_tfgraph_horizontalCursor);

                spectrumCalculator = new SpectrumCalculator();
                double[] _aweight = Weight.GetWeightData(FreqWeightType.AWeight, fstart, df, flen);
                _aweightdb = new double[_aweight.Length];

                for (i = 0; i < flen; i++)
                {
                    _aweightdb[i] = 20 * Math.Log10(_aweight[i] * Math.Sqrt(2) / _dataFileNode.Nfft) + 93.9794;//93.9794为2e-5Pa参考
                }
                fstarti = (int)(fstart / df);

                ////Configure legend
                _tfGraph.ViewXY.LegendBoxes[0].IntensityScales.ScaleSizeDim1 = 400;
                _tfGraph.ViewXY.LegendBoxes[0].Layout = LegendBoxLayout.Horizontal;
                //_tfGraph.ViewXY.LegendBoxes[0].Offset = new PointIntXY(-15, -70);
                _tfGraph.ViewXY.LegendBoxes[0].ResetLocation();

                _tfGraph.EndUpdate();
            }

            {
                _timeGraph.BeginUpdate();
                _timeGraph.Title.Visible = false;
                _timeGraph.ViewXY.LegendBoxes[0].Position = LegendBoxPositionXY.TopRight;
                _timeGraph.ViewXY.LegendBoxes[0].Visible  = false;
                AxisX axisX = _timeGraph.ViewXY.XAxes[0];
                axisX.Title.Text = "时间(s)";
                AxisY axisY = _timeGraph.ViewXY.YAxes[0];
                axisY.Title.Text = "声压(Pa)";

                _timegraph_verticalCursor                   = new LineSeriesCursor(_timeGraph.ViewXY, axisX);
                _timegraph_verticalCursor.Style             = CursorStyle.VerticalNoTracking;
                _timegraph_verticalCursor.LineStyle.Color   = Colors.White;
                _timegraph_verticalCursor.LineStyle.Pattern = LinePattern.Dot;
                _timegraph_verticalCursor.LineStyle.Width   = 3;
                _timegraph_verticalCursor.ValueAtXAxis      = _dataFileNode.Nfft / _dataFileNode.fs / 2;
                _timegraph_verticalCursor.MouseHighlight    = MouseOverHighlight.None;
                _timeGraph.ViewXY.LineSeriesCursors.Add(_timegraph_verticalCursor);

                _timeSeries                      = new SampleDataSeries(_timeGraph.ViewXY, axisX, axisY);
                _timeSeries.Title.Text           = "时域";
                _timeSeries.LineStyle.Color      = Colors.Orange;
                _timeSeries.SampleFormat         = SampleFormat.SingleFloat;
                _timeSeries.FirstSampleTimeStamp = 0;
                _timeSeries.SamplingFrequency    = _dataFileNode.fs;
                _timeGraph.ViewXY.SampleDataSeries.Add(_timeSeries);

                _timeGraph.ViewXY.ZoomToFit();

                _timeGraph.EndUpdate();
            }

            {
                _freqGraph.BeginUpdate();
                _freqGraph.Title.Visible = false;
                _freqGraph.ViewXY.LegendBoxes[0].Position = LegendBoxPositionXY.TopRight;
                _freqGraph.ViewXY.LegendBoxes[0].Layout   = LegendBoxLayout.Vertical;
                AxisX axisX = _freqGraph.ViewXY.XAxes[0];
                axisX.Title.Text = "频率(Hz)";
                AxisY axisY = _freqGraph.ViewXY.YAxes[0];
                axisY.Title.Text = "声压级(dBA)";

                _freqgraph_verticalCursor                   = new LineSeriesCursor(_freqGraph.ViewXY, axisX);
                _freqgraph_verticalCursor.Style             = CursorStyle.VerticalNoTracking;
                _freqgraph_verticalCursor.LineStyle.Color   = Colors.White;
                _freqgraph_verticalCursor.LineStyle.Pattern = LinePattern.Dot;
                _freqgraph_verticalCursor.LineStyle.Width   = 3;
                _freqgraph_verticalCursor.ValueAtXAxis      = _tfgraph_horizontalCursor.Value;
                _freqgraph_verticalCursor.MouseHighlight    = MouseOverHighlight.None;
                _freqGraph.ViewXY.LineSeriesCursors.Add(_freqgraph_verticalCursor);

                _maxfreqSeries                      = new SampleDataSeries(_freqGraph.ViewXY, axisX, axisY);
                _maxfreqSeries.Title.Text           = "最大值";
                _maxfreqSeries.LineStyle.Color      = Colors.Red;
                _maxfreqSeries.SampleFormat         = SampleFormat.SingleFloat;
                _maxfreqSeries.FirstSampleTimeStamp = fstart;
                _maxfreqSeries.SamplingFrequency    = 1 / df;
                _freqGraph.ViewXY.SampleDataSeries.Add(_maxfreqSeries);
                _maxfreqSeries.SamplesSingle = maxfreq;

                _freqSeries                      = new SampleDataSeries(_freqGraph.ViewXY, axisX, axisY);
                _freqSeries.Title.Text           = "频谱";
                _freqSeries.LineStyle.Color      = Colors.Orange;
                _freqSeries.SampleFormat         = SampleFormat.DoubleFloat;
                _freqSeries.FirstSampleTimeStamp = fstart;
                _freqSeries.SamplingFrequency    = 1 / df;
                _freqGraph.ViewXY.SampleDataSeries.Add(_freqSeries);

                _freqGraph.ViewXY.ZoomToFit();

                _freqGraph.EndUpdate();
            }

            _ShowTimer.Interval = _dataFileNode.FrameDN / _dataFileNode.fs * 1000 / 2;
            _ShowTimer.Elapsed += _ShowTimer_Elapsed;

            _tfgraph_verticalCursor.PositionChanged += verticalCursor_PositionChanged;
            _tfgraph_horizontalCursor.ValueChanged  += horizontalCursor_ValueChanged;

            UpdateChannel();
        }