gusucode.com > 信号处理工具箱 - signal源码程序 > signal\signal\signal\demod.m

    function [x,x2] = demod(y,Fc,Fs,method,P1,P2)
%DEMOD Signal demodulation for communications simulations.
%   X = DEMOD(Y,Fc,Fs,METHOD,OPT) demodulates the carrier signal Y with a 
%   carrier frequency Fc and sampling frequency Fs, using the demodulation
%   scheme in METHOD.  OPT is an extra, sometimes optional, parameter whose
%   purpose depends on the demodulation scheme you choose.
%
%        METHOD            DEMODULATION SCHEME
%    'am',      Amplitude demodulation, double side-band, suppressed carrier
%    'amdsb-sc' OPT not used.
%    'amdsb-tc' Amplitude demodulation, double side-band,transmitted carrier
%               OPT is a scalar which is subtracted from the decoded message
%               signal.  It defaults to zero.
%    'amssb'    Amplitude demodulation, single side-band
%               OPT not used.
%    'fm'       Frequency demodulation
%               OPT is a scalar which specifies the constant of frequency 
%               modulation kf, which defaults to 1.
%    'pm'       Phase demodulation
%               OPT is a scalar which specifies the constant of phase 
%               modulation kp, which defaults to 1.
%    'pwm'      Pulse width demodulation
%               By setting OPT = 'centered' you tell DEMOD that the pulses 
%               are centered on the carrier period rather than being 
%               "left justified".
%    'ptm'      Pulse time demodulation
%               OPT is not used.
%    'qam'      Quadrature amplitude demodulation
%               For QAM signals, use [X1,X2] = DEMOD(Y,Fc,Fs,'qam')
%
%   If Y is a matrix, its columns are demodulated.
%
%   See also MODULATE.

% 	Author(s): T. Krauss, 1993 
%   Copyright (c) 1988-98 by The MathWorks, Inc.
%   $Revision: 1.1 $  $Date: 1998/06/03 14:42:25 $

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

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

if strcmp(method,'am')|strcmp(method,'amdsb-sc')|strcmp(method,'amdsb-tc')|...
   strcmp(method,'amssb'),
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(y,2)));
    x = y.*cos(2*pi*Fc*t);
    [b,a]=butter(5,Fc*2/Fs);
    for i = 1:size(y,2),
        x(:,i) = filtfilt(b,a,x(:,i));
    end
    if strcmp(method,'amdsb-tc'),
        if nargin<5,
            P1 = 0;
        end
        x = x - P1;
    end
%    if strcmp(method,'amdsb-sc')|strcmp(method,'am'),
%        x = x/2;
%    end
elseif strcmp(method,'fm'),
    if nargin < 5, P1 = 1; end
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(y,2)));
    yq = hilbert(y).*exp(-j*2*pi*Fc*t);
    x = (1/P1)*[zeros(1,size(yq,2)); diff(unwrap(angle(yq)))];
elseif strcmp(method,'pm'),
    if nargin < 5, P1 = 1; end
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(y,2)));
    yq = hilbert(y).*exp(-j*2*pi*Fc*t);
    x = (1/P1)*angle(yq);
elseif strcmp(method,'pwm'),
    % precondition input by thresholding:
    y = y>.5;
    t = (0:1/Fs:((len-1)/Fs))';
    len = ceil( len * Fc / Fs);   % length of message signal
    x = zeros(len,size(y,2));
    if nargin < 5
        P1 = 'left';
    end
    if strcmp('centered',P1)
        for i = 1:len,
            t_temp = t-(i-1)/Fc;
            ind = find( (t_temp >= -1/2/Fc) & (t_temp < 1/2/Fc) );
            for j = 1:size(y,2)   % for each column ...
                x(i,j) = sum(y(ind,j))*Fc/Fs;
            end
        end
        x(1,:) = x(1,:)*2;
    elseif strcmp('left',P1)
        for i = 1:len,
            t_temp = t-(i-1)/Fc;
            ind = find( (t_temp >= 0) & (t_temp < 1/Fc) );
            for j = 1:size(y,2)   % for each column ...
                x(i,j) = sum(y(ind,j))*Fc/Fs;
            end
        end
    else
        error(' 5th input parameter not recognized')
    end
%    w=diff([1; find(diff(y))]);   % <-- a MUCH faster way, but not robust
%    x=w(1:2:length(w))/Fs;
elseif strcmp(method,'ptm'),
    % precondition input by thresholding:
    y = y>.5;
    t = (0:1/Fs:((len-1)/Fs))'*Fc;
    len = ceil( len * Fc / Fs);   % length of message signal
    x = zeros(len,size(y,2));
    for i = 1:len
        t_temp = t-(i-1);
        ind = find( (t_temp >= 0) & (t_temp<1) );
        for j = 1:size(y,2)    % for each column ...
            ind2 = find(y(ind,j)==1);
            x(i,j) = t_temp(min(ind(ind2)));
        end
    end
elseif strcmp(method,'qam'),
    t = (0:1/Fs:((len-1)/Fs))';
    t = t(:,ones(1,size(y,2)));
    x = 2*y.*cos(2*pi*Fc*t);
    x2 = 2*y.*sin(2*pi*Fc*t);
    [b,a]=butter(5,Fc*2/Fs);
    for i = 1:size(y,2),
        x(:,i) = filtfilt(b,a,x(:,i));
        x2(:,i) = filtfilt(b,a,x2(:,i));
    end
    if (r==1),   % convert x2 from a column to a row if necessary
        x2 = x2.';
    end
end
if (r==1),   % convert x from a column to a row
    x = x.';
end