X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=octave_packages%2Fcommunications-1.1.1%2Fapkconst.m;fp=octave_packages%2Fcommunications-1.1.1%2Fapkconst.m;h=b6f2d0954f0ababe0c7b94ee16aa7c2777f6b6e8;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hp=0000000000000000000000000000000000000000;hpb=1705066eceaaea976f010f669ce8e972f3734b05;p=CreaPhase.git diff --git a/octave_packages/communications-1.1.1/apkconst.m b/octave_packages/communications-1.1.1/apkconst.m new file mode 100644 index 0000000..b6f2d09 --- /dev/null +++ b/octave_packages/communications-1.1.1/apkconst.m @@ -0,0 +1,149 @@ +## Copyright (C) 2003 David Bateman +## +## This program is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free Software +## Foundation; either version 3 of the License, or (at your option) any later +## version. +## +## This program is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +## details. +## +## You should have received a copy of the GNU General Public License along with +## this program; if not, see . + +## -*- texinfo -*- +## @deftypefn {Function File} {} apkconst (@var{nsig}) +## @deftypefnx {Function File} {} apkconst (@var{nsig},@var{amp}) +## @deftypefnx {Function File} {} apkconst (@var{nsig},@var{amp},@var{phs}) +## @deftypefnx {Function File} {} apkconst (@var{...},"n") +## @deftypefnx {Function File} {} apkconst (@var{...},@var{str}) +## @deftypefnx {Function File} {@var{y} = } apkconst (@var{...}) +## +## Plots a ASK/PSK signal constellation. Argument @var{nsig} is a real vector +## whose length determines the number of ASK radii in the constellation. +## The values of vector @var{nsig} determine the number of points in each +## ASK radii. +## +## By default the radii of each ASK modulated level is given by the index of +## @var{nsig}. The amplitudes can be defined explictly in the variable +## @var{amp}, which is a vector of the same length as @var{nsig}. +## +## By default the first point in each ASK radii has zero phase, and following +## points are coding in an anti-clockwise manner. If @var{phs} is defined then +## it is a vector of the same length as @var{nsig} defining the initial phase +## in each ASK radii. +## +## In addition @dfn{apkconst} takes two string arguments 'n' and and @var{str}. +## If the string 'n' is included in the arguments, then a number is printed +## next to each constellation point giving the symbol value that would be +## mapped to this point by the @dfn{modmap} function. The argument @var{str} +## is a plot style string (example 'r+') and determines the default gnuplot +## point style to use for plot points in the constellation. +## +## If @dfn{apskconst} is called with a return argument, then no plot is +## created. However the return value is a vector giving the in-phase and +## quadrature values of the symbols in the constellation. +## @end deftypefn +## @seealso{dmod,ddemod,modmap,demodmap} + + +## 2005-04-23 Dmitri A. Sergatskov +## * modified for new gnuplot interface (octave > 2.9.0) + + + +function yout = apkconst(varargin) + + if ((nargin < 1) || (nargin > 5)) + error ("apkconst: incorrect number of arguments"); + endif + + numargs = 0; + printnums = 0; + fmt = "+r"; + amp = []; + phs = []; + + for i=1:length(varargin) + arg = varargin{i}; + if (ischar(arg)) + if (strcmp(arg,"n")) + try + text(); + printnums = 1; + catch + printnums = 0; + end + else + fmt = arg; + endif + else + numargs++; + switch (numargs) + case 1, + nsig = arg; + case 2, + amp = arg; + case 3, + phs = arg; + otherwise + error ("apkconst: too many numerical arguments"); + endswitch + endif + end + + if (numargs < 1) + error ("apkconst: must have at least one vector argument"); + endif + + if (isempty(amp)) + amp = 1:length(nsig); + endif + + if (isempty(phs)) + phs = zeros(size(amp)); + endif + + if (!isvector(nsig) || !isvector(amp) || !isvector(phs) || ... + (length(nsig) != length(amp)) || (length(nsig) != length(phs))) + error ("apkconst: numerical arguments must be vectors of the same length"); + endif + + if (length(nsig) == 0) + error ("apkconst: first numerical argument must have non-zero length"); + endif + + y = []; + for i=1:length(nsig) + if (nsig(i) < 1) + error ("apkconst: must have at least one point in ASK radii"); + endif + y = [y; amp(i) * [cos(2*pi*[0:nsig(i)-1]'/nsig(i) + phs(i)) + ... + 1i*sin(2*pi*[0:nsig(i)-1]'/nsig(i) + phs(i))]]; + end + + if (nargout == 0) + r = [0:0.02:2]'*pi; + x0 = cos(r) * amp; + y0 = sin(r) * amp; + plot(x0, y0, "b"); + yy = [real(y), imag(y)]; + hold on; + if (printnums) + xd = 0.05 * max(real(y)); + for i=1:length(y) + text(real(y(i))+xd,imag(y(i)),num2str(i-1)); + end + endif + plot (real(y), imag(y), fmt); + + title("ASK/PSK Constellation"); + xlabel("In-phase"); + ylabel("Quadrature"); + else + yout = y; + endif + +endfunction