グラフィック テックス愛好家の皆さん、こんにちは :) TikZ でこれにできるだけ近い図を描こうとしています:
私はdsp TikZライブラリを使用しており、私の試みは正しい方向に進んでいると思います。しかし、MWEからわかるように、適切に設定できなかったことがいくつかあります。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{dsp,chains}
\begin{document}
\begin{tikzpicture}
% Blocks and nodes
\node[dspnodeopen,dsp/label=below] (ns) {$v(t)$};
\node[dspmultiplier,left=of ns,fill=gray] (mic) {};
\node[dspadder,left=of mic,left=1.5cm] (add) {};
\node[coordinate,left=of add,left=2.35cm] (fp1) {};
\node[dspfilter,above=of fp1,above=1.5cm] (gain) {$G$};
\node[coordinate,above=of gain,above=1.5cm] (fp2) {};
\node[dspnodefull,right=of fp2,right=2.55cm] (adnode) {$u(t)$};
\node[dspfilter,right=of gain,right=1.15cm] (adfilt) {$\hat{F}$};
\node[dspsquare,right=of fp2,right=4cm] (ls) {};
\node[dspfilter,right=of gain,right=4cm] (feedback) {F};
\node[dspnodefull,left=of add] (afupd1) {};
\node[coordinate,above=of afupd1,above=1cm] (afupd2) {};
\node[coordinate,right=of adfilt,above=3.5cm,right=0.5cm] (afupd3) {};
% Connections
\draw[dspconn] (ns) -- (mic);
\draw[dspline] (mic) -- node[midway,below=0.09cm] {$y(t)$} (add);
\draw[dspline] (add) -- node[midway,below] {$d[t,\hat{\mathbf{f}}(t)]$} (fp1);
\draw[dspline,dashed] (afupd1) -- (afupd2);
\draw[dspconn,dashed] (afupd2) -- (afupd3);
\draw[dspconn] (fp1) -- (gain);
\draw[dspline] (gain) -- (fp2);
\draw[dspline] (fp2) -- (adnode);
\draw[dspline] (adnode) -- (ls);
\draw[dspconn] (adnode) -- (adfilt);
\draw[dspconn] (adfilt) -- node[midway,right] {$\hat{y}[t |\hat{\mathbf{f}}(t)]$} (add);
\draw[dspconn] (ls) -- (feedback);
\draw[dspconn] (feedback) -- (mic);
\end{tikzpicture}
\end{document}
私の MWE は次のようになります:
つまり、適切に再現できなかったものは次のとおりです。
- マイクとスピーカーのシンボル(灰色のブロック)
- フィルターブロックの垂直方向の配置
- 破線の正しい位置(\hat{F}でブロックを真ん中で切る必要があります)
- F のフィルタブロックとの間の曲線
- 加算器のプラス記号とマイナス記号。
このかわいそうな TikZ ユーザーを助けてくれる人はいますか?
ありがとう ;)
答え1
一つの可能性:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{dsp,chains,calc,shapes.geometric}
\begin{document}
\begin{tikzpicture}
% Blocks and nodes
\node[dspnodeopen,dsp/label=below]
(ns) {$v(t)$};
\node[left=of ns,fill=gray,circle,draw]
(mic) {};
\draw ([yshift=8pt]mic.east) -- ([yshift=-8pt]mic.east);
\node[dspadder,left=of mic,left=1.5cm,label={above right:$-$},label={below right:$+$}]
(add) {};
\node[coordinate,left=of add,left=2.35cm]
(fp1) {};
\node[dspfilter,minimum height=2cm,above=of fp1,above=1.5cm]
(gain) {$G$};
\node[coordinate,above=of gain,above=1.5cm]
(fp2) {};
\node[dspnodefull,right=of fp2,right=2.55cm]
(adnode) {$u(t)$};
\node[dspfilter,minimum height=2cm,right=of gain,right=1.15cm]
(adfilt) {$\hat{F}$};
\node[draw,right= 4cm of fp2,fill=gray,trapezium,shape border rotate=90,shape border uses incircle]
(ls) {};
\draw ([yshift=-10pt]ls.west) -- ([yshift=10pt]ls.west);
\node[dspfilter,minimum height=2cm,right=of gain,right=4cm]
(feedback) {F};
\node[dspnodefull,left=of add]
(afupd1) {};
\node[coordinate,above=of afupd1,above=1cm]
(afupd2) {};
\coordinate (aux) at ([yshift=-4pt]adfilt.center);
% Connections
\draw[dspconn] (ns) -- (mic);
\draw[dspconn] (mic) -- node[midway,below=0.09cm] {$y(t)$} (add);
\draw[dspline] (add) -- node[midway,below] {$d[t,\hat{\mathbf{f}}(t)]$} (fp1);
\draw[dspline,dashed] (afupd1) -- (afupd2);
\draw[dspconn,dashed] (afupd2) -- ( $ (afupd2)!2.7cm!(aux) $ );
\draw[dspconn] (fp1) -- (gain);
\draw[dspline] (gain) -- (fp2);
\draw[dspline] (fp2) -- (adnode);
\draw[dspconn] (adnode) -- (ls);
\draw[dspconn] (adnode) -- (adfilt);
\draw[dspconn] (adfilt) -- node[midway,right] {$\hat{y}[t |\hat{\mathbf{f}}(t)]$} (add);
\draw[dspconn] (ls) to[out=0,in=90] (feedback);
\draw[dspconn] (feedback) to[out=-90,in=30] ([yshift=3pt]mic.east);
\end{tikzpicture}
\end{document}
具体的な質問に対する回答:
標準の TikZ シェイプを使用します。たとえば、スピーカーはライブラリ
trapezium
から回転しただけですshapes.geometric
。追加の調整は必要ありません。ノードには標準
minimum height
キーを使用できますdspfilter
。補助座標を に配置し
adfilt.center
(線が「F」と重ならないように少し下方向にシフト)、( $ (<name1>)!<length>!(<name2>) $ )
calc ライブラリの を使用しました。を使用できます
to[out=<angle1>,in=<angle2>]
。必要なラベルを
add
ノードに配置しました。
コメントで、外部ファイルから図を取り込むときにカット ラベルに問題が発生することが言及されていました。この場合、 クラスを使用して画像を別の PDF ファイルとして生成し、の標準メカニズムstandalone
を使用して簡単にドキュメントに取り込むことをお勧めします。必要に応じて、スタンドアロンのオプションを使用して図の周囲のパディングを制御できます。\includegraphics
graphicx
border
たとえば、次のものを次のように保存しますMyImage.tex
。
\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{dsp,chains,calc,shapes.geometric}
\begin{document}
\begin{tikzpicture}
% Blocks and nodes
\node[dspnodeopen,dsp/label=below]
(ns) {$v(t)$};
\node[left=of ns,fill=gray,circle,draw]
(mic) {};
\draw ([yshift=8pt]mic.east) -- ([yshift=-8pt]mic.east);
\node[dspadder,left=of mic,left=1.5cm,label={above right:$-$},label={below right:$+$}]
(add) {};
\node[coordinate,left=of add,left=2.35cm]
(fp1) {};
\node[dspfilter,minimum height=2cm,above=of fp1,above=1.5cm]
(gain) {$G$};
\node[coordinate,above=of gain,above=1.5cm]
(fp2) {};
\node[dspnodefull,right=of fp2,right=2.55cm]
(adnode) {$u(t)$};
\node[dspfilter,minimum height=2cm,right=of gain,right=1.15cm]
(adfilt) {$\hat{F}$};
\node[draw,right= 4cm of fp2,fill=gray,trapezium,shape border rotate=90,shape border uses incircle]
(ls) {};
\draw ([yshift=-10pt]ls.west) -- ([yshift=10pt]ls.west);
\node[dspfilter,minimum height=2cm,right=of gain,right=4cm]
(feedback) {F};
\node[dspnodefull,left=of add]
(afupd1) {};
\node[coordinate,above=of afupd1,above=1cm]
(afupd2) {};
\coordinate (aux) at ([yshift=-4pt]adfilt.center);
% Connections
\draw[dspconn] (ns) -- (mic);
\draw[dspconn] (mic) -- node[midway,below=0.09cm] {$y(t)$} (add);
\draw[dspline] (add) -- node[midway,below] {$d[t,\hat{\mathbf{f}}(t)]$} (fp1);
\draw[dspline,dashed] (afupd1) -- (afupd2);
\draw[dspconn,dashed] (afupd2) -- ( $ (afupd2)!2.7cm!(aux) $ );
\draw[dspconn] (fp1) -- (gain);
\draw[dspline] (gain) -- (fp2);
\draw[dspline] (fp2) -- (adnode);
\draw[dspconn] (adnode) -- (ls);
\draw[dspconn] (adnode) -- (adfilt);
\draw[dspconn] (adfilt) -- node[midway,right] {$\hat{y}[t |\hat{\mathbf{f}}(t)]$} (add);
\draw[dspconn] (ls) to[out=0,in=90] (feedback);
\draw[dspconn] (feedback) to[out=-90,in=30] ([yshift=3pt]mic.east);
\end{tikzpicture}
\end{document}
処理が完了すると、次のようなファイルpdflatex
が生成されますMyImage.pdf
(図の周囲の灰色の領域は結果の PDF の一部ではありません)。
次に、
\usepackage{graphicx}% in preamble
\includegraphics{MyImage}% in document body
ファイルに.tex
画像を含めるには、boder
キーを使用して個々の余白を制御できます (スタンドアロンのドキュメントを参照)。
答え2
私は Gonzalo のコードを取得し、それを微調整して質問 2 (フィルターのサイズ) を解決しました。
ライブラリには、フィルタ ブロックの幅を設定するdsp
コマンドが含まれています(少なくとも私のテストでは、フィルタ ブロックとがうまく連携しないのはそのためです)。\dspfilterwidth
minimum width
minimum height
そこで、まずはそれをもう少し扱いやすいものにして、dspfilter
フィルターの特定の高さを取得するためにスタイルを拡張しました。
\renewcommand{\dspfilterwidth}{8mm}
\newcommand{\dspfilterheight}{1.8cm}
\tikzset{dspfilter/.append style = {minimum height=\dspfilterheight}}
残念ながら、これにより多くのブロックの間隔が台無しになるため、ノード コードを調べて、異なる定数を自分で選択した場合でもブロックが整列するように一部を調整しました。
また、右端のフィルターに数式モードの記号を追加しました。元の図と一致させたい場合は、$F$
プレーンではなく数式モードの記号を使用する必要があります。F
調整したコードは次のとおりです。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{dsp,chains,calc,shapes.geometric}
\begin{document}
\begin{tikzpicture}
\renewcommand{\dspfilterwidth}{8mm}
\newcommand{\dspfilterheight}{1.8cm}
\tikzset{dspfilter/.append style = {minimum height=\dspfilterheight}}
\newcommand{\dspvspace}{1.2cm}
% Blocks and nodes
\node[dspnodeopen, dsp/label=below]
(ns) {$v(t)$};
\node[left=of ns, fill=gray, circle, draw]
(mic) {};
\draw ([yshift=8pt] mic.east) -- ([yshift=-8pt] mic.east);
\node[dspadder, left=of mic, left=2.35cm, label={above right:$-$}, label={below right:$+$}]
(add) {};
\node[coordinate, left=of add, left=1.8cm]
(fp1) {};
\node[dspfilter, above=of fp1, above=\dspvspace]
(gain) {$G$};
\node[coordinate, above=of gain, above=\dspvspace]
(fp2) {$fp2$};
\node[dspnodefull, above=of add, above=2*\dspvspace+\dspfilterheight-0.5*\dspoperatordiameter-\dspblocklinewidth]
(adnode) {$u(t)$};
\node[dspfilter, above=of add, above=\dspvspace-0.5*\dspoperatordiameter]
(adfilt) {$\hat{F}$};
\node[draw, above=of mic, above=2*\dspvspace+\dspfilterheight-\dspblocklinewidth-0.4cm, fill=gray, trapezium, shape border rotate=90, shape border uses incircle]
(ls) {};
\draw ([yshift=-10pt] ls.west) -- ([yshift=10pt] ls.west);
\node[dspfilter, above=of ns, above=\dspvspace]
(feedback) {$F$};
\node[dspnodefull, left=of add, left=0.8cm]
(afupd1) {};
\node[coordinate, above=of afupd1, above=\dspvspace]
(afupd2) {};
\coordinate (aux) at (adfilt.center);
% Connections
\draw[dspconn] (ns) -- (mic);
\draw[dspconn] (mic) -- node[midway,below=0.09cm] {$y(t)$} (add);
\draw[dspline] (add) -- node[midway,below] {$d[t,\hat{\mathbf{f}}(t)]$} (fp1);
\draw[dspline,dashed] (afupd1) -- (afupd2);
\draw[dspconn,dashed] (afupd2) -- ( $ (afupd2)!3cm!(aux) $ );
\draw[dspconn] (fp1) -- (gain);
\draw[dspline] (gain) -- (fp2);
\draw[dspline] (fp2) -- (adnode);
\draw[dspconn] (adnode) -- (ls);
\draw[dspconn] (adnode) -- (adfilt);
\draw[dspconn] (adfilt) -- node[midway,right] {$\hat{y}[t |\hat{\mathbf{f}}(t)]$} (add);
\draw[dspconn] (ls) to[out=0,in=90] (feedback);
\draw[dspconn] (feedback) to[out=-90,in=30] ([yshift=3pt]mic.east);
\end{tikzpicture}
\end{document}
そして、これが生成するものです: