使用 tikz / pgf 绘制波形

使用 tikz / pgf 绘制波形

我想绘制音频片段的波形。由于我在 matlab 中工作,我将音频文件导出为包含两列(n、in)的 csv。当然,这会为我的 1 000 000 个数据点生成一个约 40MB 的巨大文件。当我现在尝试使用 pgf latex 绘制此文件时,会遇到内存错误。

TeX capacity exceeded, sorry [main memory size=5000000]. ...=in,col sep=comma] {audio.csv};

这是我用来绘图的代码:

\begin{tikzpicture}
    \begin{axis}[width = 18cm, height=6cm,grid=both,xlabel={$n$},ylabel={$x(n)$},ymin=-1, ymax=1,minor y tick num=1,xmin=0, xmax=1000000]
    \addplot[color=niceblue] table[x=n,y=in,col sep=comma] {audio.csv};
    \end{axis}
\end{tikzpicture}

我的第一个尝试是通过仅使用每 128 个数据点来减小文件大小。但这样我会丢失“有趣”的数据点,例如峰值。这使我的图看起来不正确。

有人知道如何绘制我的波形的漂亮图表吗?

答案1

也许你可以通过只绘制波形的包络线来减少点数。我不确定这是否足以满足你的波形,但你可以使用 Matlab 从波形中提取包络线;http://mathworks.com/help/signal/ug/envelope-extraction-using-the-analytic-signal.html

答案2

有点晚了,但我想在我的 LaTeX 文档中绘制(相当多)波形,并在搜索中发现了这个。不幸的是,这不是精确的回答您的问题,但无需使用 tikz / pgf 即可完成您想要的操作。

  1. 使用PythonTeX(你需要安装 Python - 我使用了 Anaconda Python)
  2. 创建\begin{pycode}\end{pycode}环境
  3. pycode环境中,导入以下内容:
    1. from scipy.io import wavfile
    2. from matplotlib import pyplot as plt
    3. import numpy as np
  4. samplerate, data = wavfile.read(FILENAME/PATH)
  5. times = np.arange(len(data))/float(samplerate)
  6. 如果需要,设置图表
  7. plt.plot(times, data, color='k')
  8. plt.savefig('FILENAME/PATH')
  9. 编译.tex文档
  10. 通过`pythontex.exe“FILENAME.tex”编译python代码
  11. 再次编译.tex文档(将图像合并到文档中)

matplotlib.pyplottikz / pgf 绘制波形的内存限制对我来说太有限了,这就是我选择 Python 路线的原因。与绘图相关的选项相当多。

显然,这是一种替代方法。但希望它能帮助那些认为 tikz/pgf 不是在 LaTeX 中绘制波形的正确选择的人。

相关内容