解释/交流光谱:生成可视化

信息处理 频谱 可视化
2021-12-25 23:42:33

我经常遇到需要解释/可视化信号频谱或系统频率行为(尤其是滤波器)的情况。在更简单的情况下,我最喜欢的、非常“教科书”式的交流方式是:

简单光谱,Bellanger¹

通常,我必须可视化诸如混叠、抑制载波的效果等。这也会导致不太简单的情况,比如

复杂光谱,Bellanger¹

现在,如果使用我选择的矢量程序(即 Inkscape)来绘制这些图表,真的是一种负担——我想以参数方式指定光谱,而不是手动移动、复制、镜像和重复线条!

所以:

您如何处理这些可视化?矢量图形程序和耐心?笔和纸?或者您是否有一套私有脚本,例如在 matplotlib 或 tikz 的帮助下绘制图表?


¹ Bellanger:信号的数字处理:理论与实践。第 2 版,Wiley 1988。P. 17 & p. 18.

2个回答

就个人而言,我重视文档的美观性和一致性,因此我尽可能使用 Latex。不过,如果我赶时间,我会使用 Inkscape。

我发现 pgfplots 包(建立在 tikz 之上)大大减少了编写绘图所需的时间,特别是一旦你掌握了它。作为一个简单的示例,以下过滤器响应:

筛选

使用以下 Latex 代码生成:

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis} [
        height=5cm, width=7cm, xlabel={$f$}, ylabel={Filter A},
        xmin=0, xmax=300, ymin=0, ymax=1.6, no markers,
        xtick={100,175,250}, ytick={0.25,0.5,0.75,1},
        axis lines=middle
    ]
    \addplot coordinates {(0,1) (100,1) (250,0)};
    \addplot[black,dotted] coordinates {(0,0.5) (175,0.5) (175,0)}; 
\end{axis}
\end{tikzpicture}
\end{document}

不包括样板(可以在绘图之间重用),这只是两行“真实”代码(\addplot行)。好处是通常的乳胶质量,以及与文档其余部分的字体/样式/大小一致性。

作为另一个例子,我尝试了问题中最后一个情节的(简化)版本:

过滤器2

这需要更多的代码:

\documentclass{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis} [
        height=5cm,width=9cm,xlabel={$f$},axis lines=middle,
        xmin=-120,xmax=200,ymin=0,ymax=1.8,no markers,
        xtick={80,160},xticklabels={$\frac{f_s}{2}$,$f_s=\frac{1}{T}$},
        ytick={0},yticklabels={},ylabel={$S_s(f)$}
	]
    \addplot[black] coordinates {(-100,0) (-20,1) (0,0)};
    \addplot[black] coordinates {(0,0) (20,1) (100,0)};
    \addplot[black,name path=A] coordinates {(60,0) (140,1) (160,0)};
    \addplot[black,dashed,name path=B] coordinates {(80,0) (80,1.5)};
    \addplot[blue] fill between[of=A and B,soft clip={domain=60:80}];
\end{axis}
\end{tikzpicture}
\end{document}

生成这些图确实需要时间。在处理最琐碎的情节之外的任何事情时,我经常需要参考手册和 tex.stackexchange.com。我认为上面的例子表明 pgfplots 包消除了一些痛苦;一旦你练习了最常用的命令,创建漂亮的绘图应该不会花费长时间。

最后一点:虽然我(还)没有一个程序来自动生成频谱图,但它应该不会太难做。确实有一个脚本可以从 Matlab/Octave 生成​​ pgfplots 脚本,你可以在这里看到。该脚本采用两个或多个 Matlab 数组和一个绘图描述,写入一个 Latex 文件,并在其上运行 pdflatex。虽然费力,但编码并不是特别困难。应该可以对其进行修改以获取频谱描述(可能是滤波器设计命令的edges格式amplitudes)并自动生成图。

过去,我必须可视化不同的数学和技术过程。我知道 Inkscape 和 Inkscape ......嗯,它是免费的,或多或少是跨平台的。但除此之外,使用起来也很痛苦。

以下是我在这些情况下所做的:

如果是一次性的草图

如果我只需要某物的草图(即功能可以是不稳定的线条,不必非常准确,角度不必完全正确等),我通常会使用适当的程序并通过以下方式创建插图手。

如果它必须非常准确

我在一些数学程序(例如 MATLAB、iPython、Maple)中使用适当的参数函数等进行计算。如果图形输出是......

  1. 好的,我只是接受它并快乐
  2. 不好(我在看着你,MATLAB!你的 SVG 输出太糟糕了!),我尝试导出图形并手动增强它们,例如在矢量图像程序中

如果它必须是可重现的

如果有可能,您必须更频繁地进行可视化,可能需要进行修改,否则无法通过脚本创建图像。通常,我会花很长时间在数学程序中获得足够好的图形输出。如果有另一种可视化方式,我会编写数学程序以输出数字并将其提供给适当的程序,然后创建我的图像。这里不得不提一下用于 3D 可视化的 PovRay,它还带有脚本功能,这很有帮助。

对你的图表的想法

我想在你的情况下,我会选择另一种选择:

  1. 考虑输出样式以简化它。例如,您真的需要对重叠区域进行孵化吗?如果重叠是另一种颜色,或者从两个重叠的半透明多边形中可见,由于半透明而在重叠区域中产生更深的颜色,这会更容易吗?

  2. 使用对矢量图形具有高级支持的脚本语言(例如带有一些 SVG 模块的 Python)实现您希望可视化的事物的参数模型

  3. 创建必要的 SVG 对象(以箭头为轴的线、以虚线为网格、三角形和正方形等),并相应地定位它们。

  4. 确保您的图像始终包含在绘图区域中,以便在您更改模型参数和重新创建图像时它们始终具有相同的大小。您不希望最终得到画布大小不同的图像,因为这会使重新创建文档成为一种新的地狱。

最后说明

我确信有一些可视化工具可以让您绘制一些东西并应用某种动态参数化,其中单击滑块直接生成带有修改参数的图像的实时视图。但是,我不会指望这样的事情,原因很简单:如果缺少一个您需要的选项,那么为您需要的功能实施解决方法可能会变得痛苦或不可能。除了操作系统限制、互操作性问题、成本等。