Lightningchart .NET 教程:数字信号处理滤波器应用(上)
Lightningchart .NET 教程:数字信号处理滤波器应用(下)
数字信号处理滤波器应用程序可能不是典型的图表应用程序,而是一种更复杂、更强大的信号数据图表控制类型。 这种类型的图表控制对于提高所处理的信号数据的质量和完整性很有用。 在实际应用中,有很多应用实例,下面是一个例子:
音频处理和电信系统:数字信号滤波器通常用于消除背景噪声或提高频率等。 在该行业中,数字信号处理滤波器应用程序处理信号数据并允许用户应用不同的滤波器来改进接收的信号数据。
项目概况
信号滤波器是编程滤波器,用于从采集的信号数据中滤除不需要的频率。 通过这些控制,我们将能够操纵幅度、频率范围、持续时间和频谱长度。
此外,我们将能够使用有限和无限脉冲响应 FIR 和 IIR 数字信号处理滤波器。 在此示例中,我们将使用受可用过滤器影响的 XY 图表。

本地设置
对于这个项目,我们需要考虑以下要求来编译项目。
操作系统:32 位或 64 位 Windows Vista 或更高版本、Windows Server 2008 R2 或更高版本。
DirectX:9.0c(Shader 模型 3 及更高版本)或 11.0 兼容图形适配器。
Visual Studio:2010-2019 用于开发,不需要部署。
平台 .NET Framework:已安装版本 4.0 或更高版本。
现在转到下一个 URL 并下载 LightningChart .NET。 然后,您将被重定向到登录表单,您必须在其中完成简单的注册过程。 完成注册过程后,您将可以访问您的 LightningChart 帐户。

登录帐户后,您将能够下载 SDK。 该 SDK 将是“免费试用”版本,但您将能够使用此数字信号处理滤波器应用程序教程的许多重要功能。 下载 SDK 后,您将拥有一个如下所示的 .exe 文件:

安装后因此请继续安装直至完成。 安装完成后,您将看到以下程序:

License Manager
在此应用程序中,您将看到购买选项。 您将使用此试用版 SDK 创建的所有项目都将可用于未来的开发并启用所有功能。

LightningChart .NET Interactive Examples
现在,您可以看到 100 多个可用于 WPF、WinForms 和/或 UWP 的交互式可视化。
Visual Studio 项目
现在让我们使用 Visual Studio。 使用 LightningChart 可视化工具和 Visual Studio 之间的主要区别在于,我们将能够分析和试验源代码中的许多功能。 在 LC 可视化工具中,选择数字信号处理滤波器应用程序并运行示例:

在窗口的右上角区域,您将看到以下选项:

对于试用版 SDK,我们将能够使用 WPF 框架。 单击要使用的框架后,我们需要指定将在其中创建项目的文件夹:
最后,将创建项目并打开 Visual Studio,并准备好执行数字信号处理滤波器应用程序。

代码审查
主要代码将包装在 MainWindow.xaml.cs 内。 在这里我们将找到 UI 控件的代码。

在代码中,我们将检查两个方法,它们将创建正确绘制图表所需的属性。 该交互式示例是使用各种用户控件构建的,用于操作和更改图表的视觉属性。 生成此图不需要这些控件,因此我们将重点关注负责生成对象的代码。
初始设置
InitializeComponent();
//Generate Signal generator, filters and spectrum
_SignalGenerator = new SignalGenerator();
_SignalGenerator.ThreadType = ThreadType.Thread;
_SignalGenerator.OutputInterval = 0;
_IIRFilter = new IIRFilter();
_FIRFilter = new FIRFilter();
_spectrumCalculator = new SpectrumCalculator();
_FIRFilter.SetFactors(_FirLowPass);
initializeComponent() 将加载 XAML 文件,该文件将帮助我们显示图表对象。 SignalGenerator 实例将帮助我们创建将在数字信号处理滤波器应用程序中显示的信号对象。
信号对象将包含采样频率、输出间隔和波形分量等属性。 outputInterval 获取或设置该信号发生器的输出间隔(以毫秒为单位)。
threadType 获取或设置数据的生成方式。 它通过使用线程或主 UI 线程同步计时器来生成数据。 IIRFilter/FIRFilter 是我们将用来创建同名过滤器的构造函数。
SpectrumCalculator 使用 FFT(快速傅里叶变换)将信号数据(时域)转换为频谱(频域)。 频谱计算器还包含用于向后转换和频域到时域的不同方法。
SetFactors 函数将模拟滤波器设置为 FIR 滤波器。 对于 FIR 滤波器,模拟滤波器仅包含零。 要创建模拟滤波器,需要具备广泛的数学知识。
对于这个例子,我们将在数组中使用默认值。
创建图表
该主方法负责创建图表对象。 我们首先创建 LightningChart 的新实例并为图表命名。
命名图表对象
_ChartArea.BeginUpdate();
_Chart.BeginUpdate();
_Chart.ViewXY.XAxes[0].ScrollMode = XAxisScrollMode.Scrolling;
_Chart.ViewXY.XAxes[0].ZoomingEnabled = true;
_Chart.ViewXY.XAxes[0].PanningEnabled = true;
_Chart.ViewXY.XAxes[0].SetRange(-1.0, 0);
_Chart.ViewXY.XAxes[0].Visible = false;
我们需要在更新图表属性时禁用控件重绘。 在本例中,我们将创建两个图表对象(信号和频谱)。 第一个要配置的图表是信号图,在本文中,我们将重点关注过滤器,因此将简化图表属性的审查。
AxisX xAxis2 = new AxisX(_Chart.ViewXY);
xAxis2.Title.Text = "Time (s)";
xAxis2.PanningEnabled = false;
xAxis2.MajorGrid.Visible = false;
xAxis2.MinorGrid.Visible = false;
_Chart.ViewXY.XAxes.Add(xAxis2);
_Chart.ViewXY.YAxes.Add(new AxisY());
_Chart.ViewXY.XAxes[0].Title.Text = "time (s)";
_Chart.ViewXY.YAxes[0].SetRange(-1200, 1200);
_Chart.ViewXY.YAxes[0].Title.Text = "Raw signal (mV)";
_Chart.ViewXY.YAxes[1].Title.Text = "Filtered signal (mV)";
_Chart.ViewXY.YAxes[1].SetRange(-1200, 1200);
_Chart.ViewXY.AxisLayout.YAxesLayout = YAxesLayout.Stacked;
_Chart.ViewXY.AxisLayout.XAxisAutoPlacement = XAxisAutoPlacement.Off;
_Chart.ViewXY.LegendBoxes[0].Visible = false;
_Chart.Title.Text = "Signal";
_Chart.ChartName = "Signal Filter";
_Chart.ViewXY.DropOldSeriesData = true;
_Chart.ViewXY.Zoomed += ViewXY_Zoomed;
如您所见,Y 轴数组中有两个 Y 轴。 要配置特定轴,我们需要指定索引(从零索引开始)。 我们可以指定轴的文本或标题,并设置范围和其他视觉属性。 相同的过程可以应用于 X 轴。
创建面积系列来表示给定信号的计算 FFT
创建另一个区域系列并将其分配给第二个 Y 轴。 这将对应于过滤的属性
AreaSeries FilteredAreaSeries = new AreaSeries(_ChartArea.ViewXY, _ChartArea.ViewXY.XAxes[0], _ChartArea.ViewXY.YAxes[1])
{
AllowUserInteraction = false
};
FilteredAreaSeries.LineStyle.Color = SDSFiltered.Color;
FilteredAreaSeries.LineStyle.Width = 1;
FilteredAreaSeries.Fill.Color = ChartTools.CalcGradient(UnfilteredAreaSeries.LineStyle.Color, Colors.Black, 50);
FilteredAreaSeries.Fill.GradientFill = GradientFill.Solid;
FilteredAreaSeries.Title.Text = "P(f)";
FilteredAreaSeries.LimitYToStackSegment = true;
_ChartArea.ViewXY.AreaSeries.Add(FilteredAreaSeries);
添加信号选择列表:
SelectSignals.ItemsSource = new List<string>()
{
"Chirp (freq. sweep)",
"1500Hz sine and 3500Hz sine",
"Multiple square signals",
"Multiple triangle signals",
"Mixed sine, triangle, square"
};
这些信号的行为将在另一种方法中配置

默认选择信号类型并启用控件重绘:
SelectSignals.SelectedIndex = 0;
_Chart.EndUpdate();
_ChartArea.EndUpdate();
Filters过滤器
滑块将更新信号的值和行为。 您可以看到位于 XAML 布局中的滑块对象:

<Label Grid.Row="1" Content="Amplitude" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Slider Style="{DynamicResource SliderStyle}" Grid.Row="2" Minimum="0" Maximum="1000" x:Name="Amplitude" ValueChanged="SliderValueChanged" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Label Grid.Row="2" Grid.Column="1" Content="{Binding Value, ElementName=Amplitude,Converter={StaticResource Rounder}}" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Label Grid.Row="3" Content="Frequency From" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Slider Style="{DynamicResource SliderStyle}" Grid.Row="4" Minimum="0" Maximum="5000" x:Name="FrequencyFrom" ValueChanged="SliderValueChanged" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Label Grid.Row="4" Grid.Column="1" Content="{Binding Value, ElementName=FrequencyFrom,Converter={StaticResource Rounder}}" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Label Grid.Row="5" Content="Frequency To" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Slider Style="{DynamicResource SliderStyle}" Grid.Row="6" Minimum="0" Maximum="5000" x:Name="FrequencyTo" ValueChanged="SliderValueChanged" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Label Grid.Row="6" Grid.Column="1" Content="{Binding Value, ElementName=FrequencyTo,Converter={StaticResource Rounder}}" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Label Grid.Row="7" Content="Duration ms" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Slider Style="{DynamicResource SliderStyle}" Grid.Row="8" Minimum="1" Maximum="1000" x:Name="DurationMs" ValueChanged="SliderValueChanged" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
<Label Grid.Row="8" Grid.Column="1" Content="{Binding Value, ElementName=DurationMs, Converter={StaticResource Rounder}}" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding GenVisibility,ElementName=SignalFiltersIIRFIR}"/>
当任何滑块的值发生更改时,将触发 SliderValueChanged 方法。 您可以在 Slider 元素的 ValueChanged 属性中看到对该方法的引用。
更新波形频率的方法非常简单。 根据元素名称,相关类型频率的值将被更新。 该值将从元素(对象)中获取。
private void SliderValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if(e.OldValue == e.NewValue || _SignalGenerator is null)
return;
Slider sli = sender as Slider;
switch (sli.Name)
{
case "Amplitude":
_SignalGenerator.WaveformFrequencySweepSines[0].Amplitude = e.NewValue;
break;
case "FrequencyFrom":
_SignalGenerator.WaveformFrequencySweepSines[0].FrequencyFrom = e.NewValue;
break;
case "FrequencyTo":
_SignalGenerator.WaveformFrequencySweepSines[0].FrequencyTo = e.NewValue;
break;
case "DurationMs":
_SignalGenerator.WaveformFrequencySweepSines[0].DurationMs = e.NewValue;
break;
case "SelectSmooth":
_spectrumSmoothLength = (int)e.NewValue;
break;
}
• 频率正弦扫频分量
o 幅度:正弦扫描的幅度。
o 偏移:正弦扫描的偏移。
o DurationMs:正弦扫描的持续时间(以毫秒为单位)。 在此期间从起始频率运行到结束频率。
o FrequencyFrom:正弦扫描的起始频率。
o FrequencyTo:正弦扫描的结束频率。
o 启用:扫描分量包含在输出信号的计算中。
Lightningchart .NET 教程:数字信号处理滤波器应用(上)
Lightningchart .NET 教程:数字信号处理滤波器应用(下)
渝公网安备50010702505508