예제 #1
0
        /// <summary>
        /// SteppedSine波形生成
        /// </summary>
        /// <param name="sampleRate">采样率</param>
        /// <param name="amplitude">波幅</param>
        /// <param name="frequencyMin">最低频率</param>
        /// <param name="frequencyMax">最大频率</param>
        /// <param name="steps">频率阶数</param>
        /// <param name="minCycle">最小周期数</param>
        /// <param name="minDuration">最小持续时间</param>
        /// <param name="isLog">是否对数波形</param>
        /// <param name="isInverse">是否反转</param>
        /// <returns>波形数据</returns>
        public static double[] SteppedSineWaveform(double sampleRate, double amplitude,
                                                   double frequencyMin, double frequencyMax, ushort steps, ushort minCycle,
                                                   double minDuration, bool isLog = false, bool isInverse = false)
        {
            SteppedSineWaveform steppedSineWaveform = new SteppedSineWaveform();

            steppedSineWaveform.CreateData(amplitude, frequencyMin, frequencyMax, steps, isLog, isInverse, minCycle,
                                           minDuration, sampleRate);
            double[] waveData = new double[steppedSineWaveform.GetTotalPoints()];
            steppedSineWaveform.GetCopyOfData(waveData);
            return(waveData);
        }
        public void Start()
        {
            Generator waveGenerator = tableLayoutPanel_waveConfig.Controls[0] as Generator;
            double    sampleRate    = (double)numericUpDown_sampleRate.Value;

            AITask.AITask input  = _globalInfo.AITask;
            AOTask.AOTask output = _globalInfo.AOTask;
            output.SetUpdateRate(sampleRate);
            input.SetSampleRate(sampleRate);

            double[] outData = waveGenerator.GetWaveform().GetWaveData();

            double channelRange = (double)(waveGenerator.GetAmplitude());

            output.AddChannel(comboBox_aoChannel.SelectedIndex, -1 * channelRange, channelRange);
            input.AddChannel(comboBox_refChannel.SelectedIndex, -1 * channelRange, channelRange);
            input.AddChannel(comboBox_testChannel.SelectedIndex, -1 * channelRange, channelRange);

            output.SetSamplesToUpdate(outData.Length);
            double outTime = outData.Length / output.GetUpdateRate();

            input.SetSamplesToAcquire((int)(outTime * input.GetSampleRate() * GlobalInfo.ExtraReadTime));
            output.WriteData(outData, -1);
            input.Start();
            output.Start();
            double[,] readData = new double[input.GetSamplesToAcquire(), 2];
            input.ReadData(ref readData, input.GetSamplesToAcquire(), GlobalInfo.ReadTimeOut);
            _refData  = new double[readData.GetLength(0)];
            _testData = new double[readData.GetLength(0)];
            for (int i = 0; i < readData.GetLength(0); i++)
            {
                _refData[i]  = readData[i, 0];
                _testData[i] = readData[i, 1];
            }
            double[,] plotData = new double[2, readData.GetLength(0)];
            Buffer.BlockCopy(_refData, 0, plotData, 0, _refData.Length * sizeof(double));
            Buffer.BlockCopy(_testData, 0, plotData, _refData.Length * sizeof(double),
                             _testData.Length * sizeof(double));
//            easyChart_data.Plot(plotData);
            _globalInfo.Mainform.Invoke(new Action <double[, ], double, double>(easyChart_data.Plot), plotData, 0, 1);
            _refWaveform = waveGenerator.GetRefWaveform() as SteppedSineWaveform;
//            ArrayPair<double, double> crossTalk = SeeSharpTools.JY.Audio.AudioAnalyzer.AnalyzeSteppedSineCrosstalk(
//                refWaveForm, testWaveForm, _globalInfo.AITask.GetSampleRate(), frequencyMax, frequencyMin, steps, minCycle, minDuration, amplitude);

            _analyzeSize = _refWaveform.GetTotalPoints();
        }
예제 #3
0
        /// <summary>
        /// 分析SteppedSine波形的串扰
        /// </summary>
        /// <param name="refWaveForm">参考波形</param>
        /// <param name="testWaveform">测试波形</param>
        /// <param name="sampleRate">采样率</param>
        /// <param name="maxFrequency">波形最大频率</param>
        /// <param name="minFrequency">波形最低频率</param>
        /// <param name="steps">阶数</param>
        /// <param name="minCycles">最小周期</param>
        /// <param name="minDuration">最小时间</param>
        /// <param name="amplitude">振幅</param>
        /// <param name="isLog">是否对数波形</param>
        /// <returns>返回串扰值,X和Y分别为各自的频率和对应的串扰值</returns>
        public static ArrayPair <double, double> AnalyzeSteppedSineCrosstalk(double[] refWaveForm,
                                                                             double[] testWaveform, double sampleRate, double maxFrequency, double minFrequency,
                                                                             ushort steps, ushort minCycles, double minDuration, double amplitude, bool isLog = false)
        {
//            const double refDataSampleRate = 96000.0;
//            const double minDuration = 40.0 / 1000.0;
//            const ushort minCycles = 40;
//            const double amplitude = 1;
//
            SteppedSineWaveform steppedSineWaveform = new SteppedSineWaveform();

            steppedSineWaveform.CreateData(1, minFrequency, maxFrequency, steps, false, false, minCycles,
                                           minDuration, sampleRate);
            double[] refData = new double[steppedSineWaveform.GetTotalPoints()];
            steppedSineWaveform.GetCopyOfData(refData);
            double[] testData = new double[refWaveForm.Length + testWaveform.Length];
            Buffer.BlockCopy(refWaveForm, 0, testData, 0, refWaveForm.Length * sizeof(double));
            Buffer.BlockCopy(testWaveform, 0, testData, refWaveForm.Length * sizeof(double),
                             testWaveform.Length * sizeof(double));

            SteppedSineCrosstalkAnalyzer analyzer = new SteppedSineCrosstalkAnalyzer();

//            pathDelay = 6000;
            analyzer.SetDataSampleRate(sampleRate);
            uint pathDelay = AnalyzePathDelay(testData, refData.Take(refWaveForm.Length).ToArray());

            analyzer.SetDataDelayCounts(pathDelay);
            analyzer.SetReferenceData(testData);
            analyzer.SetReferenceWaveform(steppedSineWaveform);
            analyzer.Analyze(testWaveform, (uint)testWaveform.Length);
            double[] frequency = new double[steppedSineWaveform.GetNumberOfSteps()];
            double[] crossTalk = new double[steppedSineWaveform.GetNumberOfSteps()];
            for (ushort index = 0; index < steppedSineWaveform.GetNumberOfSteps(); index++)
            {
                frequency[index] = steppedSineWaveform.GetFrequencyPoint(index);
                crossTalk[index] = analyzer.GetCrosstalk(index);
            }
            return(new ArrayPair <double, double>(frequency, crossTalk));
        }
예제 #4
0
        public WaveformBase GetRefWaveform()
        {
            ushort steps        = (ushort)numericUpDown_steps.Value;
            double amplitude    = (double)numericUpDown_amplitude.Value;
            double frequencyMin = (double)numericUpDown_startFreq.Value;
            double frequencyMax = (double)numericUpDown_stopFreq.Value;
            ushort minCycle     = (ushort)numericUpDown_minCycle.Value;
            double minDuration  = (double)numericUpDown_duration.Value / 1000;

            GlobalInfo globalInfo = GlobalInfo.GetInstance();

            //            double[] outData = AudioGenerator.SteppedSineWaveform(globalInfo.AOTask.GetUpdateRate(),
            //                amplitude, frequencyMin, frequencyMax, steps, minCycle, minDuration);
            SteppedSineWaveform waveform = new SteppedSineWaveform(globalInfo.AITask.GetSampleRate(),
                                                                   amplitude, frequencyMin, frequencyMax, steps, minCycle, minDuration);

            if (null != _equalizer)
            {
                waveform = new SteppedSineWaveform(waveform, _equalizer);
            }
            return(waveform);
        }