Lightningchart .NET 教程:数字信号处理滤波器应用(上)
Lightningchart .NET 教程:数字信号处理滤波器应用(下)
信号选择

选择信号的方式与滑块非常相似。 XAML 中有一个执行 SelectSignals_SelectionChanged 方法的组合框元素。
<StackPanel Grid.Row="0">
<Label Content="Select signals"></Label>
<ComboBox x:Name="SelectSignals" SelectedItem="0" SelectionChanged="SelectSignals_SelectionChanged" Template="{DynamicResource SelectSignalsCB}"></ComboBox>
</StackPanel>
组合框中的值是在 CreateChart 方法中创建的。 根据所选索引,将显示具有其自身属性的波形。
case 0:
_SignalGenerator.WaveformFrequencySweepSines.Add(new FrequencySineSweepComponent()
{
Amplitude = 1000,
DurationMs = 1000,
FrequencyFrom = 0,
FrequencyTo = 5000
});
Amplitude.Value = _SignalGenerator.WaveformFrequencySweepSines[0].Amplitude;
FrequencyFrom.Value = _SignalGenerator.WaveformFrequencySweepSines[0].FrequencyFrom;
FrequencyTo.Value = _SignalGenerator.WaveformFrequencySweepSines[0].FrequencyTo;
DurationMs.Value = _SignalGenerator.WaveformFrequencySweepSines[0].DurationMs;
Controls(true);
break;
//Sines 2x
case 1:
_SignalGenerator.WaveformSines.Add(new SineComponent()
{
Amplitude = 1000,
Frequency = 1500
});
_SignalGenerator.WaveformSines.Add(new SineComponent()
{
Amplitude = 1000,
Frequency = 3500
});
Controls(false);
break;
//Squares 3x
如您所见,根据所选索引创建新的频率分量。 第一个索引将包含 Amplitude、FrequencyFrom、FrequencyTo 和 DurationMs 过滤器。 索引的其余部分不会有过滤器。 对于此示例,每个波形都会创建随机信号。
• 信号发生器:
o 正弦分量:正弦波形。
o SquareComponent:方波。
o TriangleComponent:三角波形。
o AmplitudeSineSweepComponent:正弦幅度扫描波形分量。 在给定的持续时间内以恒定频率运行,从幅度到另一个幅度。
• FIR过滤器

FIR 过滤器是 XAML 按钮元素,它将执行 Button_Click 方法:

根据名称,特定因子数组将分配给 FIR 或 IIR 选定的滤波器:
case "LowPassFIR":
_FIRFilter.SetFactors(_FirLowPass);
FirIsInUse = true;
break;
case "HighPassFIR":
_FIRFilter.SetFactors(_FirHighPass);
FirIsInUse = true;
break;
case "BandPassFIR":
_FIRFilter.SetFactors(_FirBandPass);
FirIsInUse = true;
break;
case "BandStopFIR":
_FIRFilter.SetFactors(_FirBandStop);
FirIsInUse = true;
break;
case "LowPassIIR":
_IIRFilter.SetABFactors(new double[] {
0.4040290988223374,-1.979297129242377,3.6857057965464457,-3.1010890119996937,1},
new double[] {1,4,6,4,1},
-10000000000, 10000000000, 1711.4579957006445);
FirIsInUse = false;
放大/缩小 – 波形拟合

这些控件是位于 XAML 中的按钮元素:
<Button Style="{DynamicResource RoundedButton}" Grid.Row="3" Grid.Column="0" Margin="10,5" Content="Zoom In" Tag="In" Click="SignalZoom"/>
<Button Style="{DynamicResource RoundedButton}" Grid.Row="3" Grid.Column="1" Margin="10,5" Content="Zoom Out" Tag="Out" Click="SignalZoom"/>
<Button Style="{DynamicResource RoundedButton}" Grid.Row="5" Grid.Column="0" Margin="10,5" Content="Fit Signals" Tag="SignalsFit" Click="SignalZoom"/>
<Button Style="{DynamicResource RoundedButton}" Grid.Row="5" Grid.Column="1" Margin="10,5" Content="Fit Spectrum" Tag="SpectrumFit" Click="SignalZoom"/>
单击按钮时,将执行 SignalZoom 方法:
private void SignalZoom(object sender, RoutedEventArgs e)
{
switch((sender as Button).Tag)
{
case "In":
if(_Chart.ViewXY.XAxes[0].Maximum > (_Chart.ViewXY.XAxes[0].Maximum - _Chart.ViewXY.XAxes[0].Minimum) / 2)
{
_Chart.ViewXY.XAxes[0].Minimum += (_Chart.ViewXY.XAxes[0].Maximum - _Chart.ViewXY.XAxes[0].Minimum)/2;
_Chart.ViewXY.XAxes[1].Minimum += (_Chart.ViewXY.XAxes[1].Maximum - _Chart.ViewXY.XAxes[1].Minimum)/2;
}
break;
case "Out":
_Chart.ViewXY.XAxes[0].Minimum -= (_Chart.ViewXY.XAxes[0].Maximum - _Chart.ViewXY.XAxes[0].Minimum)/2;
_Chart.ViewXY.XAxes[1].Minimum -= (_Chart.ViewXY.XAxes[1].Maximum - _Chart.ViewXY.XAxes[1].Minimum)/2;
break;
case "SignalsFit":
FitSignalsY();
break;
case "SpectrumFit":
FitSpectrumY();
break;
}
}
标签属性将有助于确定要采取的操作。 对于放大,最小轴值将增加当前最大值减去当前最小值的结果加2; 仅当最大值大于最小值时。
要缩小,我们只需要增加最小轴值,无论它是否大于最大值。 “拟合”选项会将轴调整为波形的最大值。 对于 FitSignalsY,它将为 X 轴和 Y 轴设置默认范围值。
private void FitSpectrumY()
{
_ZoomSpectrumthread = new Thread(ThreadedZoom);
_ZoomSpectrumthread.IsBackground = true;
_ZoomSpectrumthread.Start();
}
/// <summary>
/// Thread to do zoom operation 1s cap
/// </summary>
private void ThreadedZoom()
{
_highestSpectrumSpike = 0;
Thread.Sleep(1000);
Dispatcher.Invoke(() =>
{
_ChartArea.BeginUpdate();
_ChartArea.ViewXY.YAxes[0].SetRange(0, _highestSpectrumSpike);
_ChartArea.ViewXY.XAxes[0].SetRange(0,5000);
_ChartArea.EndUpdate();
});
}
FitSpectrumY:它将获取幅度值并将这些值设置为负/正范围。
private double getAmplidutes()
{
double overal = 0;
foreach (AmplitudeSineSweepComponent aswc in _SignalGenerator.WaveformAmplitudeSweepSines)
{
overal += aswc.AmplitudeTo - aswc.AmplitudeFrom;
}
foreach (FrequencySineSweepComponent fssc in _SignalGenerator.WaveformFrequencySweepSines)
{
overal += fssc.Amplitude;
}
foreach (SineComponent sc in _SignalGenerator.WaveformSines)
{
overal += sc.Amplitude;
}
foreach (SquareComponent sc in _SignalGenerator.WaveformSquares)
{
overal += sc.Amplitude;
}
foreach (TriangleComponent tc in _SignalGenerator.WaveformTriangles)
{
overal += tc.Amplitude;
}
foreach (RandomNoiseComponent rnc in _SignalGenerator.WaveformRandomNoises)
{
overal += rnc.Amplitude;
}
return overal;
}
}
根据当前选择的波形类型,循环将返回幅度值。 幅度是存储在波形类型类中的值,该值是在我们首次为数字信号处理滤波器应用程序项目创建波形对象时从信号生成器类派生的。
这个项目相当长,但我们认为它是如何实现接口控件的一个很好的例子,它可以修改数字信号处理滤波器应用中的信号结构。 信号发生器类为我们提供了许多属性,帮助我们获取和修改波形的值和形状。
我想真正的挑战是获取模拟滤波器的值。 我对此主题了解不多,但 LightningCharts 交互式示例确实很有帮助,并且可以更轻松地通过编程逻辑理解该主题。
如果您还没有尝试过交互式示例,我强烈建议您下载交互式示例应用程序。 您可以使用此示例以及 LightningChart .NET 提供的其他图表应用程序示例进行练习。
非常感谢您的阅读!
Lightningchart .NET 教程:数字信号处理滤波器应用(上)
Lightningchart .NET 教程:数字信号处理滤波器应用(下)
渝公网安备50010702505508