此示例说明如何通过滤波器可视化工具 (FVTool) 在单个图窗窗口中使用多个滤波器分析函数,Fvtool 是 Signal Processing Toolbox™ 中提供的一个图形用户界面。
FVTool 还有一个应用程序编程接口 (API),以支持您从命令行与 GUI 交互。这能够将 FVTool 集成到其他应用程序中。
我们希望创建一个低通滤波器,其通带频率为 0.4π 弧度/采样点、阻带频率为 0.6π 弧度/采样点、通带波纹为 1 dB、阻带衰减为 80 dB。我们将使用 Signal Processing Toolbox 的一些滤波器设计工具来设计滤波器,然后在 FVTool 中分析结果。
设计低通等波纹 FIR 滤波器
- Df1 = designfilt('lowpassfir','PassbandFrequency',0.4,...
- 'StopbandFrequency',0.6,...
- 'PassbandRipple',1,...
- 'StopbandAttenuation',80,...
- 'DesignMethod','equiripple');
设计低通椭圆 IIR 滤波器
- Df2 = designfilt('lowpassiir','PassbandFrequency',0.4,...
- 'StopbandFrequency',0.6,...
- 'PassbandRipple',1,...
- 'StopbandAttenuation',80,...
- 'DesignMethod','ellip');
使用滤波器对象启动 FVTool 并返回 FVTool 的句柄,这使我们能够重用相同的 FVTool 图窗。
hfvt = fvtool(Df1, Df2);
如图所示:
我们可以观察到两个滤波器都符合设计规范,但仍需要查看 Chebyshev II 类设计的性能如何。
可以使用 ADDFILTER 函数向 FVTool 添加滤波器。
- Df3 = designfilt('lowpassiir','PassbandFrequency',0.4,...
- 'StopbandFrequency',0.6,...
- 'PassbandRipple',1,...
- 'StopbandAttenuation',80,...
- 'DesignMethod','cheby2');
- addfilter(hfvt, Df3);
如图所示:
要识别绘图上的哪条线属于哪个滤波器,可以使用 FVTool 句柄的 LEGEND 函数添加图例。
legend(hfvt, 'Equiripple', 'Elliptic', 'Chebyshev Type II');
如图所示:
可以使用 DELETEFILTER 函数并传递要删除的滤波器的索引,从 FVTool 中删除滤波器。
deletefilter(hfvt, [1 3]);
如图所示:
FVTool 返回的句柄包含允许与滤波器和当前分析进行交互的属性。
要查看所有可用的属性,可以使用 GET 命令。前几个属性是常规 MATLAB® 图窗的属性。最后 14 个属性是特定于 FVTool 的属性。其中最后六个(从 FrequencyScale 到 MagnitudeDisplay)是特定于分析的属性。
s = get(hfvt);
如图所示:
- % Keep the last 14 properties
- c = struct2cell(s);
- f = fieldnames(s);
- s = cell2struct(c(end-14:end),f(end-14:end),1)
-
-
- s = struct with fields:
- SelectionHighlight: on
- Tag: 'filtervisualizationtool'
- UserData: []
- Visible: on
- NumberofPoints: 8192
- FrequencyVector: [0 0.0039 0.0078 0.0118 0.0157 0.0196 0.0235 ... ]
- NormalizeMagnitudeto1: 'off'
- NormalizedFrequency: 'on'
- MagnitudeDisplay: 'Magnitude (dB)'
- PolyphaseView: 'off'
- FrequencyScale: 'Linear'
- Analysis: 'magnitude'
- OverlayedAnalysis: ''
- FrequencyRange: '[0, pi)'
- ShowReference: 'on'
所有可从 FVTool 的“分析参数”对话框获得的参数也可用作 FVTool 对象的属性。只带两个输入参数的 SET 命令返回所有可能的值。
- set(hfvt, 'MagnitudeDisplay')
-
-
- ans = 1x4 cell
- Columns 1 through 3
-
- {'Magnitude'} {'Magnitude (dB)'} {'Magnitude squared'}
-
- Column 4
-
- {'Zero-phase'}
将显示转至 'Magnitude Squared'
hfvt.MagnitudeDisplay = 'Magnitude Squared';
如图所示:
获取 'Analysis' 属性的所有可能值
- set(hfvt, 'Analysis')
-
-
- ans = 1x12 cell
- Columns 1 through 5
-
- {'magnitude'} {'phase'} {'freq'} {'grpdelay'} {'phasedelay'}
-
- Columns 6 through 10
-
- {'impulse'} {'step'} {'polezero'} {'coefficients'} {'info'}
-
- Columns 11 through 12
-
- {'magestimate'} {'noisepower'}
现在让我们更改分析,看看滤波器的群延迟响应。
hfvt.Analysis = 'grpdelay';
如图所示:
GET 命令将返回新的分析参数以进行新的分析。
GroupDelayUnits = hfvt.GroupDelayUnits;
我们还想查看群延迟和幅值响应在频域中是如何重叠的。
通过设置 'OverlayedAnalysis' 属性,可以在 FVTool 中重叠共用一个 x 轴(时间或频率)的任意两个分析。
set(hfvt, 'OverlayedAnalysis', 'magnitude', 'Legend', 'On')
如图所示:
要关闭重叠的分析,只需将 'OverlayedAnalysis' 属性设置为 ''。
hfvt.OverlayedAnalysis = '';
如图所示:
也可以像对待普通图窗窗口一样对 FVTool 窗口进行注释。
FVTool 图窗的行为与普通图窗窗口一样。这允许使用 MATLAB 的 grid 和 axis 函数。
- grid on
- axis([.3 .45 5 25]);
如图所示:
也可以从命令行访问轴。可以更改标题和标签。
- title('Group Delay of an Elliptic filter');
- xlabel('Frequency (normalized to 1)');
- ylabel('Group Delay in samples');
-
- htext = text(.35, 23, 'Maximum Group Delay');
如图所示:
FVTool 不会自动从分析中删除附加注释,可以通过删除句柄本身来实现这一点。可以通过对 FVTool 句柄调用 close 函数来关闭 FVTool 图窗。
- delete(htext);
- close(hfvt)