\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 