# Radix 2 FFT Butterfly Method in Latex

I want to use Latex to design the Radix 2 Butterfly Method to look like the (very poorly drawn) image below. I'm aware there's a similar question here to what I'm looking for, but it's not exactly what I want. I've tried playing around with the code given in the answers to get what I want but haven't made much progress. If anyone can help me or link me to an external resource, I'd be very appreciative.

\begin{tikzpicture}[c/.style={circle,fill, minimum size=4pt,
inner sep=0pt, outer sep=0pt}]
\foreach \i [count=\xe from 0, count=\xo from 2,
evaluate={\ni=int(2*\i)}, evaluate={\nii=int(\ni+1)} ] in {0,1,2,3}{%
\draw[-] (0,-\xe*0.75cm) coordinate (xe-\xe) --
node [above]{$X_e[\xe]$} ++(0:2cm) coordinate[c] (xe-\xe-1);
\draw[-] (xe-\xe-1)--++(0:2cm) coordinate[c, label=right:{$X[\xe]$},
label={[font=\scriptsize]below:{$w_8^\xe$}}] (xe-\xe-2);
\draw[-] (-2cm,-\xe*0.75cm) coordinate (xe-\xe-0)--
++(0:-1cm)node[left]{$x[\ni]$};
\begin{scope}[yshift=-4cm]
\draw[-] (0,-\xe*0.75cm) coordinate (xo-\xe)--node [above]{$X_o[\xe]$}
++(0:2cm) coordinate[c] (xo-\xe-1);
\draw[-] (xo-\xe-1)--++(0:2cm) coordinate[c, label=right:{$X[\xo]$},
label={[font=\scriptsize]below:{$w_8^\xo$}}] (xo-\xe-2);
\draw[-] (-2cm,-\xe*0.75cm) coordinate (xo-\xe-0)--
++(0:-1cm)node[left]{$x[\nii]$};
\end{scope}
}
\node[fit=(xe-0-0) (xe-1), draw, inner ysep=5mm, inner xsep=0pt,
align=center]
{N/2\\ DFT};
\node[fit=(xe-2-0) (xe-3), draw, inner ysep=5mm, inner xsep=0pt, align=center]
{N/2\\ DFT};

\foreach \i in {0,1,2,3}{
\draw (xe-\i 0) -- (xe-\i-2);
\draw (xe-\i -1) -- (xe-\i-3);
}
\end{tikzpicture}


So, what I've gotten so far is the two boxes for the first stage after the arrow, and I've tried linking the lines in the x pattern from the first line to the third line and second line to the fourth line, which I'm unable to do. I'm still trying to figure out the rest.

• Ive added the code and shown what I've done. Sorry about that. – Aidan Jan 30 at 22:52
• You might want to add some dots to distinguish between connections and crosses. – John Kormylo Jan 31 at 19:47

Here is a proposal. There are many different ways to obtain something of this sort.

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{matrix,fit,positioning,calc,shapes.arrows}
\begin{document}
\begin{tikzpicture}[cont/.style={inner sep=0pt,draw},
crossed/.style={to path={let \p1=($(\tikztotarget)-(\tikztostart)$)
in \ifdim\y1>0pt
-- ++ ({\x1-\y1)/2},0) -- ++(\y1,\y1) -- (\tikztotarget)
\else
-- ++ ({\x1+\y1)/2},0) -- ++(-\y1,\y1) -- (\tikztotarget)
\fi}},font=\strut]
\matrix[matrix of math nodes,row sep=1mm]
(mat1)
{1\\
2\\
2\\
1\\
};
\matrix[matrix of math nodes,row sep=1mm+0.4pt,right=1cm of mat1]
(mat2)
{ 1\\
2 \\
2 \\
1 \\
};
\matrix[matrix of math nodes,row sep=1mm,right=1cm of mat2,nodes={draw,minimum
width=8mm}]
(mat3)
{ 3 \\
-1 \\
3\\
-1\\
};
\matrix[matrix of math nodes,row sep=1mm,right=2cm of mat3,nodes={draw,minimum
width=15mm}]
(mat4)
{  6 \\
-1-j \\
0 \\
-1+j \\
};
\node[cont,fit=(mat1-1-1) (mat1-4-1)] (matA) {};
\node[cont,fit=(mat2-1-1) (mat2-2-1)] (matB) {};
\node[cont,fit=(mat2-3-1) (mat2-4-1)] (matC) {};
\begin{scope}[every edge/.append style={crossed,double=black,white}]
\foreach \X/\Y [evaluate=\X as \nextX using {int(\X+1)},evaluate=\Y as \nextY using {int(\Y+1)}]
in {2/1,2/3,3/1,3/3}
{
\draw (mat\X-\Y-1) edge (mat\nextX-\Y-1)
(mat\X-\nextY-1) edge (mat\nextX-\nextY-1)
(mat\X-\Y-1) edge (mat\nextX-\nextY-1)
(mat\X-\nextY-1) edge (mat\nextX-\Y-1);}
\end{scope}
\path (matA.east) -- (matA -| matB.west) node[pos=0.4,single arrow, draw,single arrow head extend=3pt,
minimum height=0.8cm,inner sep=1mm]{};
\end{tikzpicture}
\end{document}


• Thanks very much! If I were to use the tikz library 'circuits ee iec', would it be possible to do this design using that? – Aidan Jan 31 at 12:30