⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modulate.m

📁 有关matlab的电子书籍有一定的帮助希望有用
💻 M
字号:
function [y,t_out] = modulate(x,Fc,Fs,method,P1,P2)
%MODULATE  Signal modulation for communications simulations.
%   Y = MODULATE(X,Fc,Fs,METHOD,OPT) modulates the message signal X with a 
%   carrier frequency Fc and sampling frequency Fs, using the modulation
%   scheme in METHOD.  OPT is an extra sometimes optional parameter whose
%   purpose depends on the modulation scheme you choose.
%
%        METHOD              MODULATION SCHEME
%    'am',      Amplitude modulation, double side-band, suppressed carrier
%    'amdsb-sc' OPT not used.
%    'amdsb-tc' Amplitude modulation, double side-band, transmitted carrier
%               OPT is a scalar which is subtracted from X prior to 
%               multiplication by the carrier cosine.  It defaults to
%               min(min(X)) so the offset message signal is positive and
%               has a minimum value of zero.
%    'amssb'    Amplitude modulation, single side-band
%               OPT not used.
%    'fm'       Frequency modulation
%               OPT is a scalar which specifies the constant of frequency 
%               modulation kf.  kf = (Fc/Fs)*2*pi/max(max(abs(X))) by 
%               default for a maximum frequency excursion of Fc Hertz.
%    'pm'       Phase modulation
%               OPT is a scalar which specifies the constant of phase 
%               modulation kp.  kp = pi/max(max(abs(x))) by default for a 
%               maximum phase excursion of +/-pi radians.
%    'pwm'      Pulse width modulation
%               If you let OPT = 'centered', the pulses are centered on the
%               carrier period rather than being "left justified".
%    'ptm'      Pulse time modulation
%               OPT is a scalar between 0 and 1 which specifies the pulse 
%               width in fractions of the carrier period. It defaults to .1.
%    'qam'      Quadrature amplitude modulation
%               OPT is a matrix the same size as X which is modulated in 
%               quadrature with X.
%
%   If X is a matrix, its columns are modulated.
%
%   [Y,T] = MODULATE(...) returns a time vector the same length as Y.
%
%   See also DEMOD, VCO.

% 	Author(s): T. Krauss, 1993
%   Copyright (c) 1988-98 by The MathWorks, Inc.
%   $Revision: 1.15 $  $Date: 1997/12/02 18:36:30 $

error(nargchk(3,5,nargin))
if nargin<4,
    method = 'am';
end

[r,c]=size(x);
if r*c == 0,
    y = []; return
end
if (r==1),   % convert row vector to column
    x = x(:);  len = c;
else
    len = r;
end

if strcmp(method,'am')|strcmp(method,'amdsb-sc'),
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(x,2)));
    y = x.*cos(2*pi*Fc*t);
elseif strcmp(method,'amdsb-tc'),
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(x,2)));
    if nargin == 5,
        offset = P1;
    else
        offset = min(min(x));
    end
    y = ( x - offset ).*cos(2*pi*Fc*t);
elseif strcmp(method,'amssb'),
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(x,2)));
    y = x.*cos(2*pi*Fc*t) + imag(hilbert(x)).*sin(2*pi*Fc*t);
elseif strcmp(method,'fm'),
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(x,2)));
    if nargin == 5,
        kf = P1;
    else
        x_max = max(max(abs(x)));
        if x_max > 0
            kf = (Fc/Fs)*2*pi/x_max;
             % default- maximum excursion of Fc Hertz
        else
            kf = 0;
        end
    end
    y = cos(2*pi*Fc*t + kf*cumsum(x));   % rectangular integral approx
elseif strcmp(method,'pm'),
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(x,2)));
    if nargin == 5,
        kp = P1;
    else
        kp = pi/max(max(abs(x)));   % default- maximum excursion of +/-pi rads
    end
    y = cos(2*pi*Fc*t + kp*x);
elseif strcmp(method,'pwm')
    x_max = max(max(x));
    x_min = min(min(x));
    if (x_max > 1)|(x_min < 0), error('  X out of range [0,1] '), end
    t = (0:(Fs/Fc*len)-1)';
    if nargin < 5
        P1 = 'left';
    end
    if strcmp('centered',P1)
        x(len+1,:) = zeros(1,size(x,2));  % catenate a zero at end of input
        y = zeros(length(t),size(x,2));
        mod_t =  rem(t,(Fs/Fc))/(Fs/Fc);
        ind = floor(t*Fc/Fs+1);
        for i = 1:size(x,2)   % for each column ...
            y(:,i) = (mod_t < x(ind,i)/2)  +  ((1-mod_t) <= x(ind+1,i)/2);
        end
    elseif strcmp('left',P1)
        y = zeros(length(t),size(x,2));
        for i = 1:size(x,2)   % for each column ...
            y(:,i) = rem(t,(Fs/Fc))/(Fs/Fc) < x(floor(t*Fc/Fs+1),i);
        end
    else
        error(' 5th input parameter not recognized')
    end
    t = t/Fs;
elseif strcmp(method,'ptm')
    x_max = max(max(x));
    x_min = min(min(x));
    if (x_max > 1)|(x_min < 0), error('  X out of range [0,1] '), end
    if nargin<5, P1 = .1; end   % default width
    if (P1 >= 1)|(P1 <= 0), error('  Pulse duration out of range (0,1) '), end
    if (x_max > 1-P1), disp('Warning: some pulses may overlap!'), end
    t = (0:(len*Fs/Fc)-1)'/Fs;
    y = zeros(length(t)+ceil(P1*Fs/Fc),size(x,2));
    temp = 0:(P1*Fs/Fc - 1);
    for i=1:size(x,2)    % for each column ...
        ind = ceil( (x(:,i)+(0:len-1)')*Fs/Fc )+1;
        ind = ind(:,ones(1,floor(P1*Fs/Fc) )) + temp(ones(1,length(ind)),:);
        y(ind(:),i) = ones(size(ind(:)));
    end
    y(length(t)+1:length(y),:) = []; % truncate over-long vector
elseif strcmp(method,'qam')
    if nargin < 5
        error('  For ''qam'', a 5th input parameter is required.')
    end
    x2 = P1;
    [r2,c2] = size(x2);
    if r2 == 1
        x2 = x2.';
    end
    if any(size(x2)~=size(x)),
            error('  For ''qam'', input signals must be the same size')
    end

    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(x,2)));
    y = x.*cos(2*pi*Fc*t) + x2.*sin(2*pi*Fc*t);
end

t = t(:,1);   % only want first column
if (r==1)   % convert y from a column to a row
    y = y.';
    t = t.';
end
if nargout == 2
    t_out = t;
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -