\typeout{ }
\typeout{This is psDSP, the LaTeX style file for most of the PStricks macros}
\typeout{ used in the book "Signal Processing for Communications"}
\typeout{ edited by PPUR-CRC.}
\typeout{by Paolo Prandoni, May 2007 }
\typeout{contact: paolo.prandoni@epfl.ch}
\typeout{ }
% required packages:
\usepackage{calc}
\usepackage{fp}
\usepackage{pst-xkey}
\usepackage{fmtcount}
\usepackage{ifthen}
% turn off FP messages
\FPmessagesfalse
\makeatletter
%% General plot sizes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\psDSPlargeWidth{0.9\textwidth}
\def\psDSPlargeHeight{\psDSPlargeWidth * \real{0.42}}
\def\psDSPmediumWidth{\psDSPlargeWidth * \real{0.7}}
\def\psDSPmediumHeight{\psDSPmediumWidth * \real{0.5}}
\def\psDSPsmallWidth{\psDSPlargeWidth * \real{0.43}}
\def\psDSPsmallHeight{\psDSPsmallWidth * \real{0.7}}
\edef\MRspecHeight{2.5cm }
\def\psDSPctLineWidth{2pt}
%% Axis labels:
\newlength{\psDSPlabelSpaceX}\setlength{\psDSPlabelSpaceX}{6mm}
\newlength{\psDSPlabelSpaceY}\setlength{\psDSPlabelSpaceY}{4mm}
\newlength{\psDSPlabelSpaceF}\setlength{\psDSPlabelSpaceF}{6mm}
%\newlength{\psDSPzpSpacer}\setlength{\zpSpacer}{1mm}
%% Plot font (was {\fontfamily{phv}\selectfont\footnotesize} )
\newcommand{\selectPlotFont}{\footnotesize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Discrete-time signal plots %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcounter{psDSPminN}
\newcounter{psDSPmaxN}
\newcounter{psDSPnumDtPts}
\newcounter{psDSPtmpInt}
\newlength{\psDSPunitX}
\newlength{\psDSPunitY}
\newlength{\psDSPtmpLen}
\newlength{\psDSPtmpLenY}
\newlength{\psDSPdotSize}
\newlength{\psDSPlineWidth}
\newlength{\psDSPwidth}
\newlength{\psDSPheight}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Keyvals for ALL psDSP plots %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% size=["small" | "medium" | "large" | DIM]
% Plot size; if a dimension is specified, it is taken as
% the WIDTH of the plot; height is 0.4 times the width
%
% width, height
% Custom plot size
%
% dx=N, dx=N
% tick increments on the X and Y axis
%
% labelx=["true" | "false"]
% labely=["true" | "false"]
% self-explanatory
%
% labelnudge=DIM
% nudge horizontal labels by DIM
%
\define@key{psDSP}{dx}{\def\Dx{#1}}
\define@key{psDSP}{dy}{\def\Dy{#1}}
\define@key{psDSP}{labelx}{\def\labelx{#1}}
\define@key{psDSP}{labely}{\def\labely{#1}}
\define@key{psDSP}{labelnudge}{\def\labelnudge{#1}}
\define@key{psDSP}{sidegap}{\def\sideGap{#1}}
\define@key{psDSP}{size}[large]{%
\ifthenelse{\equal{#1}{small}}{%
%% Small figure
\setlength{\psDSPwidth}{\psDSPsmallWidth}%
\setlength{\psDSPheight}{\psDSPsmallHeight}%
\setlength{\psDSPdotSize}{3.8pt}%
\setlength{\psDSPlineWidth}{1pt}}{%
\ifthenelse{\equal{#1}{medium}}{%
%% Medium figure
\setlength{\psDSPwidth}{\psDSPmediumWidth}%
\setlength{\psDSPheight}{\psDSPmediumHeight}%
\setlength{\psDSPdotSize}{4.2pt} %{3.2pt}%
\setlength{\psDSPlineWidth}{1.1pt}}{ %{1pt}}{%
\ifthenelse{\equal{#1}{large}}{%
%% Large figure
\setlength{\psDSPwidth}{\psDSPlargeWidth}%
\setlength{\psDSPheight}{\psDSPlargeHeight}%
\setlength{\psDSPdotSize}{4.2pt}%
\setlength{\psDSPlineWidth}{1.1pt}}{%
%% Custom
\setlength{\psDSPwidth}{#1}%
\setlength{\psDSPheight}{0.4\psDSPwidth}%
\setlength{\psDSPdotSize}{4.2pt}%
\setlength{\psDSPlineWidth}{1pt}}}}}
\define@key{psDSP}{width}{%
\setlength{\psDSPwidth}{#1}}
\define@key{psDSP}{height}{%
\setlength{\psDSPheight}{#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Set up DISCRETE TIME plot %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{psDTplot}[OPTIONS]{MIN_N}{MAX_N}{MIN_Y}{MAX_Y}
%
% MIN_N, MAX_N range for the discrete-time index
% MIN_Y, MAX_Y range for the signal values
%
% Specialized options:
% sidegap=N extra space (in number of discrete-time points)
% added to the left and right of the n-axis;
% set to 0.5 for small ranges
%
%
%
\newenvironment{psDTplot}[5][]{%
\def\psDSPminN{#2}\def\psDSPmaxN{#3}%
\def\Dx{0}\def\Dy{0}%
\presetkeys{psDSP}{size=large,%
labelx=true,labely=true,labelnudge=0pt,%
sidegap=2}{}%
\setkeys{psDSP}{#1}%
%
%% Axes range, increment and labels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% X-axis tick and label increment
\FPifeq\Dx{0} % Unless set by keyval...
\FPupn\N{#2 #3 - 1 + 6 swap /}%
\FPtrunc\Dx\N{0}%
\fi
%
% trick to eliminate axis labels
\ifthenelse{\equal{\labelx}{false}}{%
\FPupn\Dx{#2 abs #3 abs max 2 *}}{}
\ifthenelse{\equal{\labely}{false}}{%
\FPupn\Dy{#4 abs #5 abs max 2 *}}{}
%
%% X-axis total length
\FPupn\minN{\sideGap{} #2 -}%
\FPupn\maxN{\sideGap{} #3 +}%
\FPupn\numPts{#2 #3 - \sideGap{} 2 * + }%
%
%% Y-axis total length
\FPupn\rangeY{#4 #5 -}%
%% Y-axis tick and label increment
\FPifeq\Dy{0}%
\FPtrunc\tmpY\rangeY{0}%
\FPupn\tmpY{4 \tmpY{} /}%
\FPtrunc\Dy\tmpY{2}%
\fi
%
%% Units and limits %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\setlength{\psDSPunitX}%
{1mm*\ratio{\psDSPwidth-\psDSPlabelSpaceY}{{\numPts}mm}} %
\setlength{\psDSPunitY}%
{1mm*\ratio{\psDSPheight-\psDSPlabelSpaceX}{{\rangeY}mm}} %
\psset{xunit=\psDSPunitX, yunit=\psDSPunitY}%
%
%% Make room for axis labels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\u{\strip@pt\psDSPunitX}%
\def\g{\strip@pt\psDSPlabelSpaceY}%
\FPupn\leftLim{\u{} \g{} / \minN{} -}%
\def\u{\strip@pt\psDSPunitY}%
\def\g{\strip@pt\psDSPlabelSpaceX}%
\FPupn\bottomLim{\u{} \g{} / #4 -}%
%
% Do it! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{pspicture}(\leftLim,\bottomLim)(\maxN,#5)%
%% Font
\def\pshlabel##1{\selectPlotFont ##1 \hspace{-\labelnudge}}%
\def\psvlabel##1{\selectPlotFont ##1}%
%% Box
\psaxes[axesstyle=frame,%
yAxis=false,%
ticks=none]%
(\minN,#4)(\maxN,#5)
%% X-axis
\psaxes[Dx=\Dx,%
ticks=x, tickstyle=full, ticksize=-3pt,%
labelsep=3pt,labelpos=45]%
(0,0)(\minN,0)(\maxN,0)
%% Y-axes
\psaxes[Dy=\Dy,%
ticks=y, ticksize=3pt,%
showorigin=false]%
(\minN,0)(\minN,#4)(\maxN,#5)
\psaxes[Dy=\Dy, ticksize=-3pt, labels=x]%
(\maxN,0)(\maxN,#4)(\maxN,#5) }
{
\end{pspicture}
}
%
%% Keyvals for discrete-time plots
%
\define@key[psset]{psDSP@DTfun}{nmin}{\def\minN{#1}}
\define@key[psset]{psDSP@DTfun}{nmax}{\def\maxN{#1}}
\pst@addfams{psDSP@DTfun}
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot discrete-time point
%
% \psDTplotPoint[PSTRICKS_OPTIONS]{N}{Y}
%
% N index
% Y value
%
\newcommand{\psDTplotPoint}[3][]{%
\listplot[plotstyle=LineToXAxis, linestyle=solid,%
showpoints=true, dotstyle=*,%
linewidth=\psDSPlineWidth,%
dotsize=\psDSPdotSize,#1]{#2 #3 #2 #3}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot discrete-time data
%
% \psDTplotFunction[PSTRICKS_OPTIONS]{DATA}
%
% DATA space-separated index-value pairs
%
\newcommand{\psDTplotData}[1][]{%
\listplot[plotstyle=LineToXAxis, linestyle=solid,%
showpoints=true, dotstyle=*,%
linewidth=\psDSPlineWidth,%
dotsize=\psDSPdotSize,#1]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot discrete-time signal
%
% \psDTplotSignal[OPTIONS]{SIGNAL}
%
% SIGNAL PostScript code for the signal
%
% Specialized options (besides PsTricks directives):
% nmin=N,
% nmax=N range for the plotted signal
%
\newcommand{\psDTplotSignal}[2][]{%
\presetkeys[psset]{psDSP@DTfun}{nmin=\psDSPminN, nmax=\psDSPmaxN}{}%
\setkeys*[psset]{psDSP@DTfun}{#1}%
\setcounter{psDSPnumDtPts}{\maxN - \minN + 1}
\psplot[plotstyle=LineToXAxis, linestyle=solid,%
showpoints=true, dotstyle=*,%
linewidth=\psDSPlineWidth, dotsize=\psDSPdotSize,%
plotpoints=\value{psDSPnumDtPts},
#1]%
{\minN}{\maxN}{#2}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot continuous-time function over a discrete-time plot
%
% \psDTplotFunction[OPTIONS]{SIGNAL}
%
% SIGNAL PostScript code for the signal
%
% Specialized options (besides PsTricks directives):
% nmin=N,
% nmax=N range for the plotted signal
%
\newcommand{\psDTplotFunction}[2][]{%
\presetkeys[psset]{psDSP@DTfun}{nmin=\psDSPminN, nmax=\psDSPmaxN}{}%
\setkeys*[psset]{psDSP@DTfun}{#1}%
\psplot[linewidth=\psDSPlineWidth,%
plotpoints=1500,%
#1]%
{\minN}{\maxN}{#2}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot continuous-time function from a data file over a discrete-time plot
%
% \psDTplotFile[PSTRICKS_OPTIONS]{FILE}
%
\newcommand{\psDTplotFile}[2][]{%
\readdata{\data}{#2}%
\listplot[linewidth=\psDSPlineWidth,%
plotstyle=line,%
#1]{\data}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Set up DIGITAL FREQUENCY plot %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{psDFplot}[OPTIONS]{MIN_Y}{MAX_Y}
%
% MIN_Y, MAX_Y range for the signal values
%
% Specialized options:
%
% reps=N number of 2pi intervals (default 1)
%
% fmin=F,
% fmax=F frequency range (default +/- REPS * pi)
%
% pifrac=N pi/N is the frequency axis tick
%
\define@key{psDSP@DF}{reps}{\def\reps{#1}}
\define@key{psDSP@DF}{fmin}{\def\fmin{#1}}
\define@key{psDSP@DF}{fmax}{\def\fmax{#1}}
\define@key{psDSP@DF}{pifrac}{\def\pifrac{#1}}
%
%
\newenvironment{psDFplot}[3][]{%
\def\Dy{0}%
\presetkeys{psDSP}{size=large,labelx=true,labely=true}{}%
\presetkeys{psDSP@DF}{reps=1,fmin=-1000,fmax=1000,pifrac=1}{}%
\setkeys{psDSP,psDSP@DF}{#1}%
%
%% Frequency range %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\FPupn\psDSPminF{\psPi{} \reps{} * -1 *}%
\FPupn\psDSPmaxF{\psPi{} \reps{} *}%
\FPifgt\psDSPmaxF\fmax\FPset\psDSPmaxF\fmax\fi%
\FPiflt\psDSPminF\fmin\FPset\psDSPminF\fmin\fi%
\FPupn\rangeF{\psDSPminF{} \psDSPmaxF{} -}%
%
%% Vertical range %%%%%%%%%%%%%
\def\psDSPminY{#2}
\def\psDSPmaxY{#3}
%
%% Radians units for x-axis
\FPupn\ticksPerPi{\pifrac{} \psPi{} /}%
\FPupn\minFticks{\ticksPerPi{} \psDSPminF{} /}%
\FPupn\maxFticks{\ticksPerPi{} \psDSPmaxF{} /}%
%
%% Y-axis total length
\FPupn\rangeY{#2 #3 -}%
%% Y-axis tick and label increment
\FPifeq\Dy{0}%
\FPtrunc\tmpY\rangeY{0}%
\FPupn\tmpY{4 \tmpY{} /}%
\FPtrunc\Dy\tmpY{2}%
\fi%
% trick to eliminate y-axis labels
\ifthenelse{\equal{\labely}{false}}{%
\FPupn\Dy{#2 abs #3 abs max 2 *}}{}
%
%% Units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\setlength{\psDSPunitX}%
{1mm*\ratio{\psDSPwidth-\psDSPlabelSpaceY}{{\rangeF}mm}} %
\setlength{\psDSPunitY}%
{1mm*\ratio{\psDSPheight-\psDSPlabelSpaceF}{{\rangeY}mm}} %
\psset{xunit=\psDSPunitX, yunit=\psDSPunitY}%
%
%% Make room for axis labels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\u{\strip@pt\psDSPunitX}%
\def\g{\strip@pt\psDSPlabelSpaceY}%
\FPupn\leftLim{\u{} \g{} / \psDSPminF{} -}%
\def\u{\strip@pt\psDSPunitY}%
\def\g{\strip@pt\psDSPlabelSpaceF}%
\FPupn\bottomLim{\u{} \g{} / #2 -}%
%
\begin{pspicture}(\leftLim,\bottomLim)(\psDSPmaxF,#3)%
%%% Font %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\pshlabel##1{\selectPlotFont ##1}%
\def\psvlabel##1{\selectPlotFont ##1}%
%%% X-axis %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthenelse{\equal{\labelx}{false}}{%
\psline[xunit=\ticksPerPi](\minFticks,#2)(\maxFticks,#2)%
\psline[xunit=\ticksPerPi](\minFticks,#3)(\maxFticks,#3)%
}{%
\FPmul\axisSpan\psDSPminF\psDSPmaxF%
\FPifneg\axisSpan % frequency range is across zero
\psaxes[xunit=\ticksPerPi,%
trigLabels=true,trigLabelBase=\pifrac,%
ticks=x, tickstyle=full, ticksize=-3pt,%
labelsep=4pt]%
(0, #2)(\minFticks,#2)(\maxFticks,#2)%
\psaxes[xunit=\ticksPerPi,%
trigLabels=true,trigLabelBase=\pifrac,%
ticks=x, tickstyle=full, ticksize=-3pt,%
labels=y]%
(0, #3)(\minFticks,#3)(\maxFticks,#3)%
\else % frequency range is on half-axis
\psaxes[xunit=\ticksPerPi,%
trigLabels=true,trigLabelBase=\pifrac,%
ticks=x, tickstyle=full, ticksize=-3pt,%
labelsep=4pt]%
(\minFticks,#2)(\maxFticks,#2)%
\psaxes[xunit=\ticksPerPi,%
trigLabels=true,trigLabelBase=\pifrac,%
ticks=x, tickstyle=full, ticksize=-3pt,%
labels=y]%
(\minFticks,#3)(\maxFticks,#3)%
\fi%
}%
%%% Y-axes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\FPmul\axisSpan{#2}{#3}%
\FPifneg\axisSpan%
\psaxes[Dy=\Dy,ticks=y, ticksize=3pt]%
(\psDSPminF,0)(\psDSPminF,#2)(\psDSPmaxF,#3)%
\psaxes[Dy=\Dy, ticksize=-3pt, labels=x]%
(\psDSPmaxF,0)(\psDSPmaxF,#2)(\psDSPmaxF,#3)%
\else
\psaxes[Dy=\Dy,Oy=#2,ticks=y,ticksize=3pt]%
(\psDSPminF,#2)(\psDSPmaxF,#3)%
\psaxes[Dy=\Dy, ticksize=-3pt, labels=x]%
(\psDSPmaxF,#2)(\psDSPmaxF,#3)%
\fi%
}
{
\end{pspicture}
}
%
%% Plotting Keyvals %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\define@key[psset]{psDSP@DFfun}{fmin}{\def\minF{#1}}
\define@key[psset]{psDSP@DFfun}{fmax}{\def\maxF{#1}}
\pst@addfams{psDSP@DFfun}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot frequency delta
%
% \psDFplotDelta[PSTRICKS_OPTIONS]{F}{Y}
%
% F normalized frequency (1 <-> pi)
% Y value
%
\newcommand{\psDFplotDelta}[3][]{%
\psline[xunit=3.14,linewidth=1.5pt,#1]{->}(#2,0)(#2,#3)}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot frequency data
%
% \psDFplotFunction[PSTRICKS_OPTIONS]{DATA}
%
% DATA space-separated normalized_frequency-value pairs
%
\newcommand{\psDFplotData}[1][]{%
\psline[xunit=3.14,linewidth=2pt,#1]}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot frequency function
%
% \psDFplotFunction[OPTIONS]{SIGNAL}
%
% SIGNAL PostScript code for the signal
%
% Specialized options (besides PsTricks directives):
% fmin=F,
% fmax=F frequency range for the plotted function
%
% NOTE: frequency is non-normalized!
%
\newcommand{\psDFplotFunction}[2][]{%
\presetkeys[psset]{psDSP@DFfun}{fmin=\psDSPminF, fmax=\psDSPmaxF}{}%
\setkeys*[psset]{psDSP@DFfun}{#1}%
\psplot[linewidth=2pt,%
plotpoints=1500,%
#1]%
{\minF}{\maxF}{#2}}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot normalized-frequency function from a data file
%
% \psDFplotFile[PSTRICKS_OPTIONS]{FILE}
%
\newcommand{\psDFplotFile}[2][]{%
\readdata{\data}{#2}%
\listplot[xunit=3.14,%
linewidth=2pt,%
%plotstyle=curve,%
#1]{\data}}
%
%
\newcommand{\DFylabel}[1]{%
\selectPlotFont%
\FPupn\hlabpos{\psDSPminF{} 1.1 mul}%
\FPupn\vlabpos{\psDSPminY{} \psDSPmaxY{} add 0.5 mul}%
\rput[b]{90}(\hlabpos,\vlabpos){#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Set up CONTINUOUS TIME plot
%
% \begin{psDTplot}[OPTIONS]{MIN_T}{MAX_T}{MIN_Y}{MAX_Y}
%
% MIN_T, MAX_T range for the time index
% MIN_Y, MAX_Y range for the signal values
%
% Specialized options:
% sidegap=T extra space added to the left and right of the x-axis;
% set to 0.5 for small ranges
%
%
\newenvironment{psCTplot}[5][]{%
\def\psDSPminT{#2}\def\psDSPmaxT{#3}%
\def\Dx{0}\def\Dy{0}%
\presetkeys{psDSP}{size=large,labelx=true,labely=true,sidegap=0}{}%
\setkeys{psDSP}{#1}%
%
%% Axes range, increment and labels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% X-axis total length
\FPupn\minT{\sideGap{} #2 -}%
\FPupn\maxT{\sideGap{} #3 +}%
\FPupn\rangeT{#2 #3 - \sideGap{} 2 * + }%
%% X-axis tick and label increment
\FPifeq\Dx{0} % Unless set by keyval...
\FPupn\N{#2 #3 - 1 + 6 swap /}%
\FPtrunc\Dx\N{0}%
\fi
%
%% Y-axis total length
\FPupn\rangeY{#4 #5 -}%
%% Y-axis tick and label increment
\FPifeq\Dy{0}%
\FPtrunc\tmpY\rangeY{0}%
\FPupn\tmpY{4 \tmpY{} /}%
\FPtrunc\Dy\tmpY{2}%
\fi
%
% trick to eliminate axis labels
\ifthenelse{\equal{\labelx}{false}}{%
\FPupn\Dx{#2 abs #3 abs max 2 *}}{}
\ifthenelse{\equal{\labely}{false}}{%
\FPupn\Dy{#4 abs #5 abs max 2 *}}{}
%
%% Units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\setlength{\psDSPunitX}%
{1mm*\ratio{\psDSPwidth-\psDSPlabelSpaceY}{{\rangeT}mm}} %
\setlength{\psDSPunitY}%
{1mm*\ratio{\psDSPheight-\psDSPlabelSpaceX}{{\rangeY}mm}} %
\psset{xunit=\psDSPunitX, yunit=\psDSPunitY}%
%
%% Make room for axis labels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\u{\strip@pt\psDSPunitX}%
\def\g{\strip@pt\psDSPlabelSpaceY}%
\FPupn\leftLim{\u{} \g{} / \minT{} -}%
\def\u{\strip@pt\psDSPunitY}%
\def\g{\strip@pt\psDSPlabelSpaceX}%
\FPupn\bottomLim{\u{} \g{} / #4 -}%
%
% Do it! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{pspicture}(\leftLim,\bottomLim)(\maxT,#5)%
%% Font
\def\pshlabel##1{\selectPlotFont ##1}%
\def\psvlabel##1{\selectPlotFont ##1}%
%%% X-axis %
\FPmul\axisSpan\minT\maxT%
\FPifneg\axisSpan % range is across zero
\psaxes[Dx=\Dx, ticks=x, tickstyle=full, ticksize=-3pt,%
labelsep=3pt]%
(0, #4)(\minT,#4)(\maxT,#4)%
\psaxes[Dx=\Dx, ticks=x, tickstyle=full, ticksize=-3pt,%
labels=y]%
(0, #5)(\minT,#5)(\maxT,#5)%
\else % range is on half-axis
\psaxes[Dx=\Dx, ticks=x, tickstyle=full, ticksize=-3pt,%
labelsep=3pt]%
(\minT,#4)(\maxT,#4)%
\psaxes[Dx=\Dx, ticks=x, tickstyle=full, ticksize=-3pt,%
labels=y]%
(\minT,#5)(\maxT,#5)%
\fi%
%%% Y-axes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\FPmul\axisSpan{#4}{#5}%
\FPifneg\axisSpan%
\psaxes[Dy=\Dy,ticks=y, ticksize=3pt]%
(\minT,0)(\minT,#4)(\maxT,#5)%
\psaxes[Dy=\Dy, ticksize=-3pt, labels=x]%
(\maxT,0)(\maxT,#4)(\maxT,#5)%
\else
\psaxes[Dy=\Dy,Oy=#4,ticks=y,ticksize=3pt]%
(\minT,#4)(\maxT,#5)%
\psaxes[Dy=\Dy, ticksize=-3pt, labels=x]%
(\maxT,#4)(\maxT,#5)%
\fi%
}
{
\end{pspicture}
}
%
%% Keyvals for discrete-time plots
%
\define@key[psset]{psDSP@CTfun}{tmin}{\def\minT{#1}}
\define@key[psset]{psDSP@CTfun}{tmax}{\def\maxT{#1}}
\pst@addfams{psDSP@CTfun}
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot continuous-time delta
%
%
% \psDFplotDelta[PSTRICKS_OPTIONS]{F}{Y}
%
% F normalized frequency (1 <-> pi)
% Y value
%
\newcommand{\psCTplotDelta}[3][]{%
\psline[linewidth=1.5pt,#1]{->}(#2,0)(#2,#3)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot continuous-time data
%
% \psDTplotFunction[PSTRICKS_OPTIONS]{DATA}
%
% DATA space-separated index-value pairs
%
\newcommand{\psCTplotData}[1][]{%
\listplot[linewidth=\psDSPctLineWidth,#1]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot continuous-time function
%
% \psCTplotFunction[OPTIONS]{SIGNAL}
%
% SIGNAL PostScript code for the signal
%
% Specialized options (besides PsTricks directives):
% tmin=T,
% tmax=T range for the plotted signal
%
\newcommand{\psCTplotFunction}[2][]{%
\presetkeys[psset]{psDSP@CTfun}{tmin=\psDSPminT, tmax=\psDSPmaxT}{}%
\setkeys*[psset]{psDSP@CTfun}{#1}%
\psplot[linewidth=\psDSPctLineWidth,%
plotpoints=1500,%
#1]%
{\minT}{\maxT}{#2}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot continuous-time function from a data file
%
% \psCTplotFile[PSTRICKS_OPTIONS]{FILE}
%
\newcommand{\psCTplotFile}[2][]{%
\readdata{\data}{#2}%
\listplot[linewidth=\psDSPctLineWidth,%
plotstyle=line,%
#1]{\data}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Set up POLE-ZERO plot
%
% \begin{psPZplot}[OPTIONS]{MAX_X}
%
% MAX_X range for both axes
%
% Specialized options:
%
% cirlce=["true" | "false"]
% draw unit circle
%
% unit=TEXT use TEXT as the label for x=1
%
\define@key{psDSP@PZ}{circle}{\def\pzCircle{#1}}
\define@key{psDSP@PZ}{unit}{\def\pzLabel{#1}}
%
\newcommand{\psDSP@PZsetup}{%
%%% Font %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\pshlabel##1{\selectPlotFont ##1}%
\def\psvlabel##1{\selectPlotFont ##1}%
%%%% Box %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\psaxes[axesstyle=frame,%
yAxis=false,%
ticks=none]%
(-\zpSize,-\zpSize)(\zpSize,\zpSize)
\psaxes[labels=none]%
(0,0)(-\zpSize,-\zpSize)(\zpSize,\zpSize)
\ifthenelse{\equal{\pzCircle}{true}}{%
\pscircle[linewidth=1.8pt](0,0){\psDSPunitX}}{}
%
\uput[-135](\zpSize\psDSPunitX,0){\selectPlotFont Re}
\uput[-45](0,\zpSize\psDSPunitX){\selectPlotFont Im}
\uput[-45](\psDSPunitX,0){\selectPlotFont \pzLabel}%
}
%
\newenvironment{psPZplot}[2][]{%
\def\zpSize{#2}
\def\Dx{1}\def\Dy{1}%
\presetkeys{psDSP}{size=large}{}%
\presetkeys{psDSP@PZ}{circle=true,unit=1}{}%
\setkeys{psDSP,psDSP@PZ}{#1}%
%
%% Axes range, increment and labels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% axis total length
\FPupn\rangeX{\zpSize{} 2 *}%
%% axis tick and label increment
\FPifeq\Dx{0}%
\FPtrunc\tmpX\rangeX{0}%
\FPupn\tmpX{4 \tmpX{} /}%
\FPtrunc\Dx\tmpX{2}%
\fi%
\FPifeq\Dy{0}%
\FPset\Dy\Dx%
\fi
%% Units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\setlength{\psDSPunitX}%
{1mm*\ratio{\psDSPheight}{{\rangeX}mm}} %
\psset{xunit=\psDSPunitX, yunit=\psDSPunitX}%
%
\begin{pspicture}(-\zpSize,-\zpSize)(\zpSize,\zpSize)%
\psDSP@PZsetup%
}
{
\end{pspicture}
}
%
%% Keyvals for pole-zero plots
%
\define@key[psset]{psDSP@PZ}{type}{\def\pzType{#1}}
\define@key[psset]{psDSP@PZ}{label}{\def\pzLabel{#1}}
\define@key[psset]{psDSP@PZ}{labelpos}{\def\pzLabelpos{#1}}
\define@key[psset]{psDSP@PZ}{roctype}{\def\pzROCtype{#1}}
\pst@addfams{psDSP@PZ}
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot pole-zero point
%
% \psPZplotPoint[OPTIONS]{RE}{IM}
%
% RE, IM coordinates
%
% Options:
%
% type = ["pole" | "zero"] circle or cross (default: pole)
%
% label=["false" | TEXT ] the point's label (default: false)
% labelpos = ANGLE label position (default: 45)
%
\newcommand{\psPZplotPoint}[3][]{%
\presetkeys[psset]{psDSP@PZ}{type=pole,label=false}{}%
\setkeys*[psset]{psDSP@PZ}{#1}%
\ifthenelse{\equal{\pzType}{zero}}{%
\psdot[dotstyle=o, dotsize=1.4ex, #1](#2,#3)%
}{%
\psdot[dotstyle=+, dotsize=1.4ex, dotangle=45, #1](#2,#3)%
}
\ifthenelse{\equal{\pzLabel}{false}}{%
}{%
\selectPlotFont%
\ifthenelse{\equal{\pzLabel}{true}}{%
\uput[\pzLabelpos](#2,#3){(#2, #3)}%
}{%
\uput[\pzLabelpos](#2,#3){\pzLabel}%
}%
}%
}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot pole-zero ROC
%
% \psPZplotROC[OPTIONS]{RADIUS}
%
% RRADIUS ROC's radius
%
% Options:
%
% roctype = ["causal" | "anticausal"] default: causal
%
\newcommand{\psPZplotROC}[2][]{%
\presetkeys[psset]{psDSP@PZ}{roctype=causal}{}%
\setkeys*[psset]{psDSP@PZ}{#1}%
\ifthenelse{\equal{\pzROCtype}{causal}}{%
\pscustom[fillstyle=vlines,%
hatchcolor=lightgray,%
linecolor=lightgray]{%
\psarc(0,0){#2\psDSPunitX}{0}{360}%
\psline(\zpSize,0)(\zpSize,-\zpSize)%
(-\zpSize,-\zpSize)(-\zpSize,\zpSize)%
(\zpSize,\zpSize)(\zpSize,0)}
%%% redo axis (alas)
\psDSP@PZsetup %
}{% Anticausal ROC
\pscircle[fillstyle=vlines,hatchcolor=lightgray]{#2\psDSPunitX}%
}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Set up BLOCK DIAGRAM plot
%
% \begin{psdrawBDmatrix}[OPTIONS]{X_SPACING}{Y_SPACING}
%
% X_SPACING
% Y_SPACING vertical and horizontal spacing
%
% Once in Block diagram mode the following commands are available
% (they all create nodes)
%
% \BDadd adder
% \BDmul multiplier
% \BDdelay z^{-1} delay block
% \BDdelayN{N} z^{-N} delay block
% \BDfilter{text} filter box
% \BDfilterMulti{text} multiline filter box
% \BDsplit splitting point (dot)
% \BDupsmp{K} upsampler by K
% \BDdwsmp{K} downsampler by K
%
\newenvironment{psdrawBDmatrix}[2]{%
\def\BDwidth{1.2pt}
\psset{xunit=1mm,yunit=1mm,linewidth=\BDwidth}
\def\BDadd{[mnode=circle] +}%
\def\BDsub{[mnode=circle] -}%
\def\BDmul{[mnode=circle] $\times$}%
\def\BDdelay{\psframebox[framesep=.3]{$z^{-1}$}}%
\def\BDdelayN##1{\psframebox[framesep=.3]{$z^{-##1}$}}%
\def\BDfilter##1{\psframebox[framesep=.3]{##1}}%
\def\BDfilterMulti##1{\psframebox%
{\begin{tabular}{c} ##1 \end{tabular}}}%
\def\BDsplit{[mnode=dot,linewidth=2pt]}%
\def\BDupsmp##1{[mnode=circle] $##1 \uparrow$}%
\def\BDdwsmp##1{[mnode=circle] $##1 \downarrow$}%
\begin{psmatrix}[colsep=#1,rowsep=#2,emnode=R] }{%
\end{psmatrix}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Set up QAM constellation plot
%
% \begin{psQAMplot}[OPTIONS]{SIZE}
%
% SIZE number of points on the positive axis
%
% Specialized options:
% decreg=[true|FALSE] draw decision regions
% labels=[all|NONE] draw axis labels
%
%
\define@key{psDSP@QAM}{decreg}{\def\qamDecReg{#1}}
\define@key{psDSP@QAM}{labels}{\def\qamLabels{#1}}
%
\newenvironment{psQAMplot}[2][]{%
\def\qamSize{#2}
\def\Dx{1}\def\Dy{1}%
\def\qamNoiseScale{0.2 }
\def\psQAMdotSize{3pt}
\presetkeys{psDSP}{size=large}{}%
\presetkeys{psDSP@QAM}{decreg=false,labels=none}{}%
\setkeys{psDSP,psDSP@QAM}{#1}%
%
%% Axes range, increment and labels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% axis total length
\FPupn\rangeX{\qamSize{} 2 *}%
\FPclip\rangeX\rangeX
%% Units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\FPmul\extRange\rangeX{1.1}%
\setlength{\psDSPunitX}%
{0.5mm*\ratio{\psDSPheight}{{\extRange}mm}} %
\psset{xunit=\psDSPunitX, yunit=\psDSPunitX}%
%
\begin{pspicture}(-\extRange,-\extRange)(\extRange,\extRange)%
%%% Font %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\pshlabel##1{\selectPlotFont ##1}%
\def\psvlabel##1{\selectPlotFont ##1}%
%%%% Box %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\psaxes[ticks=\qamLabels,linewidth=1.2pt]{->}%
(0,0)(-\extRange,-\extRange)(\extRange,\extRange)
\uput[-90](\extRange,0){\selectPlotFont Re}
\uput[0](0,\extRange){\selectPlotFont Im}
\ifthenelse{\equal{\qamDecReg}{true}}{%
\FPsub\numRep\qamSize{1}%
\FPclip\numRep\numRep%
\multips(2,-\rangeX)(2,0){\numRep}{%
\psline[linewidth=0.5pt](0,0)(! 0 2 \rangeX.0 mul)}%
\multips(-2,-\rangeX)(-2,0){\numRep}{%
\psline[linewidth=0.5pt](0,0)(! 0 2 \rangeX.0 mul)}%
\multips(-\rangeX,2)(0,2){\numRep}{%
\psline[linewidth=0.5pt](0,0)(! 2 \rangeX.0 mul 0)}%
\multips(-\rangeX,-2)(0,-2){\numRep}{%
\psline[linewidth=0.5pt](0,0)(! 2 \rangeX.0 mul 0)}%
}{}
}
{
\end{pspicture}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot QAM dot at given coordinates
%
\newcommand{\psQAMdot}[3][]{%
\qdisk(#2,#3){0.5\psDSPdotSize}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot QAM point at given coordinates (Specify the type of point)
%
\newcommand{\psQAMpoint}[3][asterisk]{%
\psdot[dotstyle=#1,dotsize=\psDSPdotSize](#2,#3)
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot NOISY QAM dot at given coordinates
%
% Specify point type. To change amount of noise deviation change the
% value of \qamNoiseScale
%
\newcommand{\psQAMnoisyPoint}[3][asterisk]{%
\psdot[dotstyle=#1,dotsize=\psDSPdotSize](! #2 rand 100 mod 50 div 1 sub \qamNoiseScale mul add #3 rand 100 mod 50 div 1 sub \qamNoiseScale mul add)
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Plot entire QAM constellation
%
% Specify point drawing function and point type.
%
\newcommand{\psQAMconstellation}[2][asterisk]{%
\FPupn\st{1 \qamSize{} 2 * - clip}%
\multido{\ix=-\st+2}{\rangeX}{%
\multido{\iy=-\st+2}{\rangeX}{%
#2[#1]{\ix}{\iy}}}
}
\newcommand{\pstick}[2][0]{%
\psline[linewidth=0.5pt,origin={#2,#1}](0,-4pt)}
\newcommand{\psticklab}[3][0]{%
\psline[linewidth=0.5pt,origin={#2,#1}](0,-4pt)
\uput{8pt}[-90](#2,#1){\selectPlotFont #3}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% PsTricks overrides
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Lollipop line style %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\let\beginplot@LineToXAxis\beginplot@line
\def\endplot@LineToXAxis{\psLineToXAxis@ii}
\let\beginqp@LineToXAxis\beginqp@line
\let\doqp@LineToXAxis\doqp@line
\let\endqp@LineToXAxis\endqp@line
\let\testqp@LineToXAxis\testqp@line
%
\def\psLineToXAxis@ii{%
\addto@pscode{\pst@cp \psline@iii \tx@LineToXAxis}%
\end@OpenObj}
%
\def\tx@LineToXAxis{LineToXAxis }
%
% Adapted from Line
\pst@def{LineToXAxis}<{%
NArray
n 0 eq not
{ n 1 eq { 0 0 /n 2 def } if
ArrowA
/n n 2 sub def
CP 2 copy moveto pop 0 Lineto
n { 2 copy moveto pop 0 Lineto } repeat
CP
4 2 roll
ArrowB
2 copy moveto pop 0
L
pop pop } if}>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% triglabels font modification %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\define@key[psset]{pstricks-add}{trigLabelBase}%
{\pst@getint{#1}{\psk@trigLabelBase}}
\psset{trigLabelBase=0}
\define@boolkey[psset]{pstricks-add}[Pst@]{trigLabels}[true]{%
\selectPlotFont
\ifPst@trigLabels
\def\pst@@@hlabel##1{\pshlabel{##1}}
\def\pshlabel##1{%
\ifnum\psk@trigLabelBase<2
\def\de@nominator{\@ne}\else\def\de@nominator{\psk@trigLabelBase}\fi
\def\pst@tempA{##1}
\pst@abs{\pst@tempA}\pst@cntm
\pst@mod{\pst@cntm}{\de@nominator}\pst@cntp % cntb=##1 modulo trigLabelBase
\ifnum\@ne>\pst@cntp % 1 > modulo -> then we have pi/x
\pst@cnto=\pst@cntm \divide\pst@cnto by \de@nominator
%\psk@labelFontSize
\ifnum\pst@tempA<0 -\fi%
\ifnum\pst@cnto=\@ne % #1 = trigLabelBase
$\pi$ % print pi
\else\ifnum\pst@cnto=0 0
\else
\the\pst@cnto$\pi$ % print \pst@cnto/\de@nominator pi
\fi
\fi
\else
%\psk@labelFontSize
\ifnum\pst@cntp=\@ne % < 1 pi?
\if\pst@cntm=\@ne
$\pi / \de@nominator$ % pi/x
\else\ifnum\pst@tempA=-1 -$\pi / \de@nominator$
\else \ifnum\pst@tempA=1 $\pi / \de@nominator$
\else{\pst@tempA$\pi / \de@nominator$} % (x pi)/y
\fi\fi\fi
\else
\ifnum\pst@tempA=1 $\pi / \de@nominator$
\else\ifnum\pst@tempA=\de@nominator $\pi$
\else{\pst@tempA$\pi/\de@nominator$}
\fi\fi\fi\fi%
}%
\else
\def\pst@@@hlabel##1{%
\edef\@xyDecimals{\psk@xDecimals}%
\ifnum\psk@ticks<\tw@ % ticks=all|x
\ifx\psk@xlogBase\@empty
\pshlabel{\psk@labelFontSize\expandafter\@LabelComma##1..\@nil\psk@xlabelFactor}%
\else%
\pshlabel{\psk@labelFontSize\psk@xlogBase\textsuperscript{\expandafter\@stripDecimals##1..\@nil }}
\fi%
\fi%
}
\def\pshlabel##1{\psk@labelFontSize$##1$}%
\fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\psxpoint}[3][black]{%
\psline[linewidth=.5pt]{-}(#2,\pst@xticksizeB)(#2,\pst@xticksizeA)
\rput[t](! #2 \pst@number\pslabelsep \pst@number\pst@xticksizeB add
\pst@number\psyunit div neg ){\color{#1}#3}}
\makeatother