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