This is an example of a block diagram of a radiofrequency front-end (RF-FE).
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usepackage{pgfplots} % loads tikz which loads pgf
\usepackage[american,siunitx]{circuitikz}
\usetikzlibrary{arrows,calc,positioning,fit}
\pgfplotsset{
compat=1.15,
within block/.style={
scale only axis,
scale=0.423,
anchor=center,
axis x line=middle,
axis y line=none,
enlargelimits=0.1,
width=2cm,
height=15mm,
xtick=\empty,
ytick=\empty,
domain=0:85,
samples=15,
tickwidth=0,
clip mode=individual,
every axis plot/.append style={
smooth,
mark options={
draw=black,
fill=black,
mark size=1pt
}
},
before end axis/.code={
\node [draw,thick, shape=circle, inner sep=-2pt,
fit=(current axis), label={below:{NCO}}] (nco) {};
}
}
}
\newcommand{\mixer}[2]
{ % #1 = reference coordinate, #2 = name
\node[draw, thick, shape=circle, minimum size=24pt, at={#1}](#2){};
\draw[rotate=45,line width=0.5pt] (#2.center)+(0,-12pt) -- +(0,12pt);
\draw[rotate=-45,line width=0.5pt] (#2.center)+(0,-12pt) -- +(0,12pt);
}
\newcommand{\BPF}[3]
{ % #1 - reference coordinate, #2 - name, #3 - subscript label
\node[
draw,
shape=rectangle,
thick,
minimum size=24pt,
at={#1},
label={below:{#3}}
](#2){};
%%% middle tilde
\draw (#2.center)+(-8pt,0) % first coordinate for the line segment
to[bend left] (#2.center) % draw a curved line that bends to the left. The curve starts at the first coordinate and ends at the next coordinate.
to[bend right] +(8pt,0); % This means to draw a curved line that bends to the right. The curve starts at the previous coordinate and ends at the next coordinate.
%%% upper tilde
\draw ([yshift=5pt]#2.center)+(-8pt,0) % starting point of the path. The yshift key is used to shift the starting point vertically by 5pt.
to[bend left] ([yshift=5pt]#2.center) % second point of the path. It is located at the center of the bpf node, shifted 5pt vertically.
to[bend right] +(8pt,0); % third point of the path. It is located 8pt to the right, relative to the second point. The + sign indicates that the point is relative to the second control point.
\draw[rotate=20] ([yshift=5pt]#2.center)+(-4pt,0) -- +(7pt,0); % strike out the upper tilde
%%% lower tilde
\draw ([yshift=-5pt]#2)+(-8pt,0)
to[bend left] ([yshift=-5pt]#2.center)
to[bend right] +(8pt,0);
\draw[rotate=20] ([yshift=-5pt]#2.center) +(-7pt,0) -- +(4pt,0);
}
\newcommand{\ADC}[2]{
\begin{scope}[transform shape,rotate=#2]
%%% sampler
\node[draw, shape=rectangle, thick, minimum width=28pt, minimum height=28pt, at={(#1)}](sampler){};
\draw (sampler.center)+(-9pt,-8pt)
to +(1pt,-8pt)
to +(8pt,5pt);
\draw[->] (sampler.center)+(-8pt,3pt)
node[shift={(7pt,5pt)}]() {\(T_{s,IF}\)}
to[bend left] +(8pt,-8pt);
%%% quantizer
\node[draw, shape=rectangle, thick, minimum size=28pt, at={([xshift=50pt]sampler)}](quantizer){}; % rectangle
\draw[->, line width=0.1pt, dashed, dash pattern= on 6pt off 2pt] ($(quantizer.south)+(0pt,+2pt)$) -- ($(quantizer.north)+(0pt,-2pt)$); % axis
\draw[->, line width=0.1pt, dashed, dash pattern= on 6pt off 2pt] ($(quantizer.west)+(3pt,0pt)$) -- ($(quantizer.east)+(-2pt,0pt)$);
\coordinate (begin) at ($(quantizer.center)+(-6pt,-9pt)$); % steps
\foreach \i in {0,...,5} {
\ifnum \i=0
\draw (begin)+(-5pt,0pt) -- (begin) -- +(2pt,0pt) -- +(2pt,3pt);
\else
\ifnum \i=5
\draw ($(begin)+\i*(2pt,3pt)$) -- +(2pt,0pt) -- +(2pt,3pt) -- +(8pt,3pt);
\else
\draw ($(begin)+\i*(2pt,3pt)$) -- +(2pt,0pt) -- +(2pt,3pt);
\fi
\fi
}
%%% ADC (outside block)
\node[draw, fit=(sampler) (quantizer), thick, rounded corners=5pt, inner ysep=20pt, inner xsep=5pt, yshift=5pt, dashed](adc-fit){};
\node[below, inner sep=5pt] at (adc-fit.north) {ADC};
\end{scope}
}
\tikzset{ar/.style={-latex,shorten >=-1pt, shorten <=-1pt}}
\begin{document}
\begin{circuitikz}
%%% antenna
\node[shape=antenna, xscale=-1, at={(-0.5,3)}](antenna){};
%%% LNA
\draw ([xshift=20pt]antenna.south) % starts a new drawing command at coordinate (0,3)
node[shape=buffer,scale=0.8](lna){} % adds a node at the current coordinate with the shape buffer and a scaling factor of 0.8. The lna label is assigned to this node, which can be used later to reference it.
node[below=0.6cm]{LNA}; % adds a label "LNA" above the buffer node, positioned 0.8 cm above the node's center.
%%% RF BPF
\BPF{([xshift=20pt]lna.out)}{rf-bpf}{\(B_{RF}\)}
%%% mixer1
\mixer{([xshift=25pt]rf-bpf.east)}{mixer1}
%%% IF BPF
\BPF{([xshift=25pt]mixer1.east)}{if-bpf}{\(B_{IF}\)}
%%% LO
\path (mixer1.center)
to[midway, sV, name=lo]
node[at={(lo.south)}](){LO}
([yshift=-100pt]mixer1.south);
%%% AGC
\draw (if-bpf.east)+(0.8,0) % starts a new drawing command at coordinate (0,3)
node[shape=buffer,scale=0.8](agc){} % adds a node at the current coordinate with the shape buffer and a scaling factor of 0.8. The lna label is assigned to this node, which can be used later to reference it.
node[below=0.6cm]{AGC}; % adds a label "LNA" above the buffer node, positioned 0.8 cm above the node's center.
%%% ADC
\path (agc.out)+(2,0)
to[sV,color=white,name=adc]
(agc.out)+(3,0);
\ADC{adc.center}{0}
%%% mixer2
\mixer{([xshift=110pt]adc.east)}{mixer2}
%%% NCO
\begin{axis}[ % no position defined, so this ends up at (0,0)
within block=ax1,
at={($(mixer2.center)+(-12pt,-48pt)$)},
anchor=north west]
\addplot+[
ycomb,
black,
mark options={
draw=black,
fill=black,
mark size=1pt
},
] {sin(2*pi*x)};
\end{axis}
%%% digital LPF
\node[draw, thick, shape=rectangle, minimum size=12pt, at={([xshift=40pt]mixer2.center)}, align=center](digital-lpf){Digital\\LPF};
%%% down-converter (outside block)
\node[draw, fit=(nco) (digital-lpf), thick, rounded corners=5pt, inner ysep=20pt, inner xsep=5pt, yshift=5pt, dashed](down-converter){};
\node[below, inner sep=5pt] at (down-converter.north) {Down-converter};
%%% decimator
\node[draw, thick, shape=rectangle, minimum size=12pt, at={([xshift=50pt]digital-lpf.center)}, align=center](decimator){$D \downarrow$};
%%% digital processing
\node[draw, thick, shape=rectangle, minimum size=12pt, at={([xshift=50pt]decimator.east)}, align=center](digital-processing){Digital\\processing};
%%% wiring
\draw[] (antenna.south) -- (lna.in);
\draw[ar] (lna.out)--(rf-bpf);
\draw[ar] (rf-bpf)--(mixer1);
\draw[ar] (lo.west)--(mixer1); % `lo' is rotated, `lo.west' actually means its top
\draw[ar] (lo.west)-- +(0pt,15pt) |- +(-55pt,15pt) |- +(-55pt,35pt) -- +(-20pt,58pt);
\draw[ar] (mixer1) -- (if-bpf);
\draw[] (if-bpf) -- (agc.in);
\draw[ar] (agc.out) -- (sampler.west);
\draw[ar] (sampler.east) -- (quantizer.west);
\draw[ar] (quantizer.east) -- (mixer2.west);
\draw[ar] (nco.north) -- (mixer2.south);
\draw[ar] (mixer2.east) -- (digital-lpf.west);
\draw[ar] (digital-lpf.east) -- (decimator.west);
\draw[ar] (digital-lpf.east) -- +(10pt,0pt) |- +(0pt,-100pt) -- +(-220pt,-100pt) -- +(-220pt,-10pt) -- ([yshift=-5pt, xshift=6pt]agc.north);
\draw[ar] (decimator.east) --
node[pos=0.5, above]() {\(r\left[ n \right]\)}
(digital-processing.west);
\end{circuitikz}
\end{document}
