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');