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

📄 digitalmod.m

📁 能够产生多种信号
💻 M
字号:
function out = DigitalMod(Ns, type, varargin)

% DigitalMod: Performs digital modulation in passband. The string variable 'type' 
%             specifies the type of modulation used. The table below lists the types 
%             of analog modulation available.
%
% USAGE: DigitalMod(Ns, type)
%        DigitalMod(Ns, type, Fd, Fc, Fs)
%        DigitalMod(Ns, type, Fd, Fc, Fs, R)
%        DigitalMod(Ns, type, Fd, Fc, Fs, R, ph0)
% Input: Ns <generation signal data size>;
%        type <digital modulation types>;
%        Fd <symbol frequency (default 7kHz)>;
%        Fc <carrier frequency (default 70kHz)>;
%        Fs <sample frequency (default 700kHz)>;
%        R:(0,1] <the rolloff factor of raised cosine filter (default 0.5) >;
%        ph0 <Carrier wave initial phase (default 0)>;
% Output: out <output signal data>;
%
%   Method      |  Modulation Scheme
%  -------------------------------------------------------------------------------
%   'FSK'       |  2-ary frequency shift keying modulation
%   'MSK'       |  Minimum frequency shift keying modulation
%   'BPSK'      |  2-ary phase shift keying modulation
%   'QPSK'      |  4-ary phase shift keying modulation
%   '8PSK'      |  8-ary phase shift keying modulation
%   'OQPSK'     |  Offset 4-ary phase shift keying modulation
%   'Pi/4QPSK'  |  Pi/4 4-ary phase shift keying modulation
%   '16QAM'     |  16-ary quadrature amplitude shift keying modulation
%   '64QAM'     |  64-ary quadrature amplitude shift keying modulation

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright (c) 2002,  Y.G. Wang                       %
% All rights reserved.                                 %
%                                                      %
% File name  : DigitalMod.m                            %
% Environment: MatLab6.1                               %
% Description: Generate signal of analog modulation    %
%                                                      %
% Version: 1.0                                         %
% Author : Y.G. Wang                                   %
% Date   : 4/16/2002                                   %
%------------------ Replace ---------------------------%
% Version:                                             %
% Author :                                             %
% Date   :                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

switch  nargin
    case  2
        Fd=7000; Fc=70000; Fs=700000; R=0.5; ph0=0;
    case  5
        Fd=varargin{1}; Fc=varargin{2};
        Fs=varargin{3}; R=0.5; ph0=0;
    case  6
        Fd=varargin{1}; Fc=varargin{2};
        Fs=varargin{3}; R=varargin{4}; ph0=0;
    case  7
        Fd=varargin{1}; Fc=varargin{2};
        Fs=varargin{3}; R=varargin{4}; ph0=varargin{5};
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %     DigitalMod(Ns, type)
        %     DigitalMod(Ns, type, Fd, Fc, Fs)
        %     DigitalMod(Ns, type, Fd, Fc, Fs, R)
        %     DigitalMod(Ns, type, Fd, Fc, Fs, R, ph0)
        %     在调用函数时候已经默认参数的位置,什么还要在指定?
        %     varargin{1}  应该是Ns把?                                  %
        %                                                %
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    otherwise
        error('Incorrect number of input arguments!');
end

if Fd<0 | Fc<0 | Fs<0 
    error('Frequency argument can not being negative');
end
if Fd>Fc | (Fc+Fd)*2.5>Fs
    error('Frequency argument not match');
end

Num=fix(Ns/(Fs/Fd))+1; type=upper(type);                                                   %Num 的计算有点费解
switch  type
    case    'FSK'
        M=2; method='fsk'; x1=randint(1, Num, M); 
        x=dmod(x1, Fc, Fd, Fs, method, M);
    case    'MSK'
        M=2; method='msk'; x1=randint(1, Num, M);
        x=dmod(x1, Fc, Fd, Fs, 'msk');
    case    'BPSK'
        M=2; method='psk'; 
        x = dmodpskqam(M, method, Fd, Fc, Fs, Num, R);
   case    'QPSK'
        M=4; method='psk';
        x = dmodpskqam(M, method, Fd, Fc, Fs, Num, R);
    case    '8PSK'
        M=8; method='psk';
        x = dmodpskqam(M, method, Fd, Fc, Fs, Num, R);
    case    'OQPSK'
        m = Fs/Fd; mk = 1:m;
        I = randint(1, Num, 2).*2-1; Q = randint(1, Num, 2).*2-1;
        for k=1:Num
            I1(m*k+mk)=I(k); Q1(m*k+mk)=Q(k);
        end
        I2 = rcosflt(I1, Fd, Fs, 'Fs', R);
        Q2 = rcosflt(Q1, Fd, Fs, 'Fs', R);
        m1 = (Fs/Fd)/2; m2 = fix(m1); N1 = size(Q2, 1); k1=0:(N1-1);
        Q3(1:m2) = 0; Q3(m2+1:N1) = Q2(1:N1-m2); I3 = I2';
        x = I3.*sin(2*pi*Fc*k1/Fs+ph0)+Q3.*cos(2*pi*Fc*k1/Fs+ph0);
    case    'PI/4QPSK'
        m = Fs/Fd; mk = 1:m; fai=[-3*pi/4, 3*pi/4; -pi/4, pi/4];
        I = randint(1, Num, 2)+1; Q = randint(1, Num, 2)+1;
        sita=1:Num; sita(1)=-3*pi/4;
        for k=2:Num
            sita(k)=sita(k-1)+fai(I(k), Q(k));
        end
        Ik = cos(sita); Qk = sin(sita);
        for k=1:Num
            I1(m*k+mk)=Ik(k); Q1(m*k+mk)=Qk(k);
        end
        I2 = rcosflt(I1, Fd, Fs, 'Fs', R);
        Q2 = rcosflt(Q1, Fd, Fs, 'Fs', R);
        N1 = size(Q2, 1); k1=0:(N1-1);
        x = I2'.*sin(2*pi*Fc*k1/Fs+ph0)+Q2'.*cos(2*pi*Fc*k1/Fs+ph0);
    case    '16QAM'
        M=16; method='qask';
        x = dmodpskqam(M, method, Fd, Fc, Fs, Num, R);
    case    '64QAM'
        M=64; method='qask';
        x = dmodpskqam(M, method, Fd, Fc, Fs, Num, R);
end

len = size(x, 1);
if len == 1
    out = x(1:Ns);
else
    out = (x(1:Ns))';
end

%-------------------------------------------------------------------------------
function y = dmodpskqam(M, method, Fd, Fc, Fs, Num, R)

x1 = randint(1, Num, M);
x2 = modmap(x1, Fd, Fs, method, M);
x3 = rcosflt(x2, Fd, Fs, 'Fs', R);
y  = dmod(x3, Fc, Fd, Fs, [method, '/nomap'], M);

⌨️ 快捷键说明

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