Program

:
function y = modmap(x, Fd, Fs, method, M, opt2, opt3) %MODMAP Map a digital signal to an analog signal. % Plotting syntaxes: % MODMAP(METHOD...) plots the signal constellation associated with % the specified mapping method. % % Mapping syntaxes: % Y = MODMAP(X, Fd, Fs, METHOD...) maps the digital signal X to % an analog signal Y. This syntax only maps; it does not modulate. % modmap ask % M-ary amplitude shift keying % modmap psk % M-ary phase shift keying % modmap qask % M-ary quadrature amplitude shift keying % modmap fsk % M-ary frequency shift keying % modmap msk % Minimum shift keying opt_pos = 5; plot_const = 0; % position of 1st optional parameter

if nargin 1 feval('help','modmap') return; elseif isstr(x) if exist('method', 'var') tmp_sto = method; end method = lower(deblank(x)); if findstr(method, 'samp') method = 'samp'; end if nargin == 1 % help lines for individual modulation method. if strcmp(method, '') method = 'ask'; end hand = fopen('modmap.hlp'); if hand=0 error('The Communications Toolbox on your computer is not completely installed.') else x = fscanf(hand, '%c', Inf); index_begin = findstr(x, [method,'_help_begin']); index_end = findstr(x, [method,'_help_end']); if index_end > index_begin x = x(index_begin+12+length(method):index_end-1); fprintf('%s', x); disp(' ') disp(' See also DEMODMAP, DMOD, DMODCE, AMOD, AMODCE, APKCONST.') else disp(['No help for ', method]); end end fclose(hand); return;

else

plot_const = 1; opt_pos = opt_pos - 3; M = Fd; if nargin > opt_pos opt2 = Fs; end if nargin > opt_pos+1 opt3 = tmp_sto; end

else

end

if nargin 3 error('Usage: Y=MODMAP(X, Fd, Fs, METHOD, OPT1, OPT2, OPT3) for modulation mapping'); elseif nargin opt_pos-1 method = 'sample'; end if length(Fs)~=1 | ~isfinite(Fs) | ~isreal(Fs) | Fs=0 error('Fs must be a positive number.'); elseif length(Fd)~=1 | ~isfinite(Fd) | ~isreal(Fd) | Fd=0 error('Fd must be a positive number.'); else FsDFd = Fs / Fd; if ceil(FsDFd) ~= FsDFd error('Fs/Fd must be a positive integer.'); end end % determine M if isempty(findstr(method, '/arb')) & isempty(findstr(method, '/cir')) if nargin opt_pos M = max(max(x)) + 1; M = 2^(ceil(log(M)/log(2))); M = max(2, M); elseif length(M) ~= 1 | ~isfinite(M) | ~isreal(M) | M = 0 | ceil(M) ~= M error('Alphabet size M must be a positive integer.'); end end if isempty(x) y = []; return; end [r, c] = size(x); if r == 1 x = x(:); len_x = c; else len_x = r; end if ~(strncmpi(method, 'qask', 4) | strncmpi(method, 'qam', 3) |... strncmpi(method, 'qsk', 3)) & ... (~isreal(x) | all(ceil(x)~=x) | any(any(x<0)) | any(any(x>M-1)))

end

error('Elements of input X must be integers in [0, M-1].'); end yy = []; for i = 1 : size(x, 2) tmp = x(:, ones(1, FsDFd)*i)'; yy = [yy tmp(:)]; end x = yy; clear yy tmp;

method = lower(method); if strncmpi(method, 'ask', 3) if plot_const plot([0 0], [-1.1 1.1], 'w-', [-1.1, 1.1], [0 0], 'w-', ([0:M1] - (M - 1) / 2 ) * 2 / (M - 1), zeros(1, M), '*'); axis([-1.1 1.1 -1.1 1.1]) xlabel('In-phase component'); title('ASK constellation') else y = (x - (M - 1) / 2 ) * 2 / (M - 1); if r==1 & ~isempty(y) y = y.'; end end elseif strncmpi(method, 'fsk', 3) if nargin opt_pos + 1 Tone = Fd; else Tone = opt2; end if plot_const maxTone = Tone*(M-1); x = [0 : Tone : maxTone]; tmp = ones(1, M); tmp(1) = 2; stem(x, tmp); axis([-1, maxTone+1, 0, 2]); xlabel('Frequency (Hz)'); title('FSK constellation'); else y = x * Tone; if r==1 & ~isempty(y) y = y.'; end end elseif strncmpi(method, 'psk', 3) if plot_const apkconst(M); else y = modmap(x, Fs, Fs, 'qask/cir', M); end elseif strncmpi(method, 'msk', 3) % This is a special case of fsk. if plot_const stem([0 Fd], [2 1]); axis([-1, Fd+1, 0, 2]);

xlabel('Frequency (Hz)'); title('MSK constellation'); else M = 2; Tone = Fd/2; y = x * Tone; if r==1 & ~isempty(y) y = y.'; end

end elseif ( strncmpi(method, 'qask', 4) | strncmpi(method, 'qam', 3) |... strncmpi(method, 'qsk', 3) ) if findstr(method, '/ar') % arbitrary constellation if nargin opt_pos + 1 error('Incorrect format for METHOD=''qask/arbitrary''.'); end I = M; Q = opt2; M = length(I); if plot_const axx = max(max(abs(I))) * [-1 1] + [-.1 .1]; axy = max(max(abs(Q))) * [-1 1] + [-.1 .1]; plot(I, Q, 'r*', axx, [0 0], 'w-', [0 0], axy, 'w-'); axis('equal'); axis('off'); text(axx(1) + (axx(2) - axx(1))/4, axy(1) - (axy(2) axy(1))/30, 'QASK Constellation'); return; else % leave to the end for processing end elseif findstr(method, '/ci') % circular constellation if nargin opt_pos error('Incorrect format for METHOD=''qask/circle''.'); end NIC = M; M = length(NIC); if nargin opt_pos+1 AIC = [1 : M]; else AIC = opt2; end if nargin opt_pos + 2 PIC = NIC * 0; else PIC = opt3; end if plot_const apkconst(NIC, AIC, PIC); return; else inx = apkconst(NIC, AIC, PIC); I = real(inx); Q = imag(inx); M = sum(NIC); end else % square constellation

if plot_const qaskenco(M); return; else [I, Q] = qaskenco(M); end end y = []; x = x + 1; if (min(min(x)) 1) | (max(max(x)) > M) error('An element in input X is outside the permitted range.'); end for i = 1 : size(x, 2) tmp = I(x(:, i)); y = [y tmp(:)]; tmp = Q(x(:, i)); y = [y tmp(:)]; end elseif strncmpi(method, 'samp', 4) %This is made possible to convert an input signal from sampling frequency Fd %to sampling frequency Fs. y = x; if r==1 & ~isempty(y) y = y.'; end else % invalid method error(sprintf(['You have used an invalid method.\n',... 'The method should be one of the following strings:\n',... '\t''ask'' Amplitude shift keying modulation;\n',... '\t''psk'' Phase shift keying modulation;\n',... '\t''qask'' Quadrature amplitude shift-keying modulation, square constellation;\n',... '\t''qask/cir'' Quadrature amplitude shift-keying modulation, circle constellation;\n',... '\t''qask/arb'' Quadrature amplitude shift-keying modulation, user defined constellation;\n',... '\t''fsk'' Frequency shift keying modulation;\n',... '\t''msk'' Minimum shift keying modulation.'])); end

Sign up to vote on this title
UsefulNot useful