function plot_complex_sig(x,samples_per_symbol,Nmax,plot_style)
% plot_complex_sig(x) plots a one-dimensional complex signal as points
% in 3-D space : x-axis is the sample (time) axis, y-axis is the real part,
% and z-axis the imaginary part
%
% plot_complex_sig(x,samples_per_symbol) plots all samples in blue and
%  one sample per symbol in red.
%
% plot_complex_sig(x,samples_per_symbol,Nmax) only plots the first Nmax
% samples.
%
% plot_complex_sig(x,samples_per_symbol,Nmax,'arrows') use arrows from
% (i_sample,0,0) instead of points to represent samples.
%
% version compatible with Simulink Version 7.3 (R2009a)

%% process function arguments and perform various tests on function

nargchk(1,3,nargin);

if nargin<2
    samples_per_symbol = 1;
end

if (isstruct(x))
    if(~isfield(x,'signals'))
        error('unsupported data type')
    else
        if (x.signals.dimensions ~= 1)
            error('does not support multidimensional signals')
        else
            vals = x.signals.values;
        end
    end
else % should be array
    vals = x;
end

if nargin<3
    Nmax=length(vals);
end

if nargin<4
    plot_style = 'points';
end

if (~isnumeric(vals))
    error('unsupported data type')
elseif (isreal(vals))
    error('numbers are not complex')
end

if ((samples_per_symbol < 1) || ~(round(samples_per_symbol)==samples_per_symbol))
    error('samples_per_symbol must be a strictly positive integer')
end

if ~strcmp(plot_style,'points') && ~strcmp(plot_style,'arrows')
    error('possible values for plot plot_style are : "points" and "arrows"')
end
%% function implementation

sel=(1:Nmax)';
abs_max = max(abs(x(sel)));
if (samples_per_symbol==1)
    if strcmp(plot_style,'points')
        plot3(sel,real(vals(sel)),imag(vals(sel)),'.');
    elseif strcmp(plot_style,'arrows')
        quiver3(sel,zeros(size(sel)),zeros(size(sel)),zeros(size(sel)),real(vals(sel)),imag(vals(sel)),0);
    end
else
    plot3(sel,real(vals(sel)),imag(vals(sel)),'.');
    hold on
    sel= (1:samples_per_symbol:Nmax)';
    if strcmp(plot_style,'points')
        plot3(sel,real(vals(sel)),imag(vals(sel)),'.r');
    elseif strcmp(plot_style,'arrows')
        quiver3(sel,zeros(size(sel)),zeros(size(sel)),zeros(size(sel)),real(vals(sel)),imag(vals(sel)),0);
    end
    hold off
end
ylim([-abs_max,abs_max])
zlim([-abs_max,abs_max])
axis vis3d
grid on
xlabel('samples');
ylabel('real');
zlabel('imag');