我想绘制音频片段的波形。由于我在 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 即可完成您想要的操作。
- 使用
PythonTeX
(你需要安装 Python - 我使用了 Anaconda Python) - 创建
\begin{pycode}\end{pycode}
环境 - 在
pycode
环境中,导入以下内容:from scipy.io import wavfile
from matplotlib import pyplot as plt
import numpy as np
samplerate, data = wavfile.read(FILENAME/PATH)
times = np.arange(len(data))/float(samplerate)
- 如果需要,设置图表
plt.plot(times, data, color='k')
plt.savefig('FILENAME/PATH')
- 编译
.tex
文档 - 通过`pythontex.exe“FILENAME.tex”编译python代码
- 再次编译
.tex
文档(将图像合并到文档中)
matplotlib.pyplot
tikz / pgf 绘制波形的内存限制对我来说太有限了,这就是我选择 Python 路线的原因。与绘图相关的选项相当多。
显然,这是一种替代方法。但希望它能帮助那些认为 tikz/pgf 不是在 LaTeX 中绘制波形的正确选择的人。