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(); }
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(); }