📄 digitalmod.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 + -