적응형 피드백 취소를 위한 dsp/TikZ가 포함된 블록 다이어그램

적응형 피드백 취소를 위한 dsp/TikZ가 포함된 블록 다이어그램

그래픽 텍스를 사랑하는 여러분, 안녕하세요 :) 저는 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는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

즉, 제대로 재현할 수 없었던 것들은 다음과 같습니다.

  1. 마이크 및 스피커 기호(회색 블록)
  2. 필터 블록의 수직 정렬
  3. 점선의 올바른 위치 지정(중앙에서 \hat{F}가 있는 블록을 잘라야 함)
  4. F를 사용하여 필터 블록을 오가는 곡선
  5. 가산기의 플러스 및 마이너스 기호.

이 불쌍한 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}

여기에 이미지 설명을 입력하세요

특정 질문에 대한 답변:

  1. 표준 TikZ 모양을 사용하십시오. 예를 들어 스피커는 단순히 라이브러리 trapezium에서 회전된 것입니다 shapes.geometric.

  2. 추가로 조정할 필요가 없습니다. 노드 minimum height의 표준 키를 사용할 수 있습니다 dspfilter.

  3. 보조 좌표를 adfilt.center(선이 "F"와 겹치는 것을 방지하기 위해 약간 아래쪽으로 이동) 배치한 다음 ( $ (<name1>)!<length>!(<name2>) $ )계산 라이브러리의 좌표를 사용했습니다.

  4. 당신이 사용할 수있는 to[out=<angle1>,in=<angle2>].

  5. 원하는 라벨을 노드에 배치했습니다 add.

댓글에서 외부 파일의 그림을 포함할 때 컷 라벨에 대한 일부 문제가 언급되었습니다. 이 경우 standalone클래스를 사용하여 이미지를 별도의 pdf 파일로 생성한 다음 의 표준 \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}

그리고 그것이 생산하는 것은 다음과 같습니다:

여기에 이미지 설명을 입력하세요

관련 정보