コード例 #1
0
        /// <summary>
        /// 构造SteppedSineWaveform
        /// </summary>
        /// <param name="sourceWaveform">源波形</param>
        /// <param name="equalizer">均衡器</param>
        public SteppedSineWaveform(SteppedSineWaveform sourceWaveform, SteppedSineEqualizer equalizer)
        {
            this.SampleRate = sourceWaveform.SampleRate;

            double maxEqalizer = 0;

            for (ushort i = 0; i < equalizer.GetPointsOfEQ(); i++)
            {
                // TODO 凌华的均衡器实际数值是倒数,待确认
                maxEqalizer = Math.Abs(equalizer.GetEQ(i)) < maxEqalizer
                    ? Math.Abs(equalizer.GetEQ(i))
                    : maxEqalizer;
            }
            this.Amplitude    = sourceWaveform.Amplitude / (maxEqalizer > 0 ? maxEqalizer : 1);
            this.FrequencyMax = sourceWaveform.FrequencyMax;
            this.FrequencyMin = sourceWaveform.FrequencyMin;
            this.Steps        = sourceWaveform.Steps;
            this.MinCycle     = sourceWaveform.MinCycle;
            this.MinDuration  = sourceWaveform.MinDuration;
            this.IsLog        = sourceWaveform.IsLog;
            this.IsInverse    = sourceWaveform.IsInverse;

            var waveform     = new ManagedAudioLibrary.SteppedSineWaveform();
            var rawWaveform  = sourceWaveform.GetRawWaveform() as ManagedAudioLibrary.SteppedSineWaveform;
            var rawEqualizer = equalizer.GetRawEqualizer() as ManagedAudioLibrary.SteppedSineEqualizer;

            waveform.CreateData(rawWaveform, rawEqualizer);
            RawWaveform = waveform;
        }
コード例 #2
0
        /// <summary>
        /// 分析SteppedSineWave波形串扰
        /// </summary>
        /// <param name="testWaveform">测试波形</param>
        /// <param name="refWaveform">参考波形</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[] testWaveform,
                                                                             Waveform.SteppedSineWaveform refWaveform, double sampleRate, double maxFrequency,
                                                                             double minFrequency, ushort steps, ushort minCycles, double minDuration,
                                                                             double amplitude, bool isLog = false)
        {
            SteppedSineCrosstalkAnalyzer analyzer = new SteppedSineCrosstalkAnalyzer();

            //            pathDelay = 6000;
            analyzer.SetDataSampleRate(sampleRate);
            double[] refWaveData = refWaveform.GetWaveData();
            uint     pathDelay   = AnalyzePathDelay(testWaveform, refWaveData);

            analyzer.SetDataDelayCounts(pathDelay);
            analyzer.SetReferenceData(refWaveData);
            analyzer.SetReferenceWaveform((SteppedSineWaveform)refWaveform.GetRawWaveform());
            analyzer.Analyze(testWaveform, (uint)testWaveform.Length);

            double[] frequency = new double[refWaveform.Steps];
            double[] crossTalk = new double[refWaveform.Steps];
            for (ushort index = 0; index < refWaveform.Steps; index++)
            {
                frequency[index] = refWaveform.GetFrequencyPoint(index);
                crossTalk[index] = analyzer.GetCrosstalk(index);
            }
            return(new ArrayPair <double, double>(frequency, crossTalk));
        }