www.pudn.com > qpsk_mod_ZiBian.rar > qpsk_mod_ZiBian.m


% 这个函数返回调制以后的qpsk信号; 
% 这里的调制考虑了载波发送的问题; 
% 编程原则是先写出基本功能,在逐步完善; 
 
 
 
function [y_mod]=... 
          qpsk_mod_ZiBian(x,fc,fs,symbol_t,theta,plot_flag) 
 
% 注意把握好fc,fs,之间的关系,是一个四进制码元内的载波信号点 
% symbol_t表示的是一个调制符号的持续时间, 
% 对于使用者来说,我知道的只是:载波频率,抽样频率,调制以后的 
% 符号持续时间; 
% x表示的是输入的二进制序列码,是列向量, 
% fc是载波频率,fs是采样频率, 
% n是每一个四进制码元下拥有的载波信号采样点数; 
% qpsk调制的原理很简单,第一步:完成星座图对应, 
% 第二步:用这些星座图上的点乘以载波; 
% 画图标志:plot_flag=1,就画图,否则不画图; 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
if nargin<6 
    error('the input arguments are not complete'); 
end; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
if size(x,1)<=size(x,2) 
    x=x'; 
else 
    x=x; 
end;   % 把x变换成列向量; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% 时间的设置要注意两点:采样点数和采样间隔; 
n=ceil(symbol_t*fs); 
t=(0:n-1)/fs; 
% 一个四进制码元下的载波: 
signal_i=cos(2*pi*fc*t); 
signal_q=sin(2*pi*fc*t); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
% 注意信号的发送方向:------------------x(i+1)--x(i)----> 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% 下面是调制部分: 
signal_mod=[];     temp=[]; 
for i=1:2:(size(x,1)-1) 
    % 首先是完成2,4进制的转换; 
    if (x(i)==0) & (x(i+1)==0) 
        signal_symbol=0; 
    elseif (x(i)==1) & (x(i+1)==0) 
        signal_symbol=1; 
    elseif (x(i)==0) & (x(i+1)==1) 
        signal_symbol=2; 
    elseif (x(i)==1) & (x(i+1)==1) 
        signal_symbol=3; 
    else 
        error('The input x are not apt to the function need'); 
    end; 
    % 二进制码元转化为四进制符号; 
    temp=[temp,signal_symbol]; 
    % 星座图对应; 
    signal_constellation=pskmod(signal_symbol,4,theta); 
    % 调制载波; 
    signal_mod_i=real(signal_constellation).*signal_i; 
    signal_mod_q=imag(signal_constellation).*signal_q; 
    signal_mod_temp=signal_mod_i+signal_mod_q; 
    signal_mod=[signal_mod,signal_mod_temp]; 
end; 
 
symbol_base=temp; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
    if size(signal_mod,1)<=size(signal_mod,2) 
       signal_mod=signal_mod'; 
    else 
        signal_mod=signal_mod; 
    end;   % 把signal_mod变换成列向量; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
% 在本函数的返回端得到调制好的信号; 
y_mod=signal_mod;     
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
     
     
 if plot_flag==1 
     
fft_signal_mod=abs(fftshift(fft(signal_mod))); 
 
% 画图; 
 
figure; 
subplot(221); 
plot((0:size(x)-1)/fs,x); title('基带二进制信号');  
xlabel('时间(s)'); ylabel('信号幅度'); 
 
subplot(222); 
plot((0:size(signal_mod,1)-1)/fs,signal_mod); 
title('调制后的信号'); xlabel('时间(s)'); ylabel('信号幅度'); 
 
subplot(223); 
f_n=size(fft_signal_mod,1); 
plot(fs*(-f_n/2:f_n/2-1)/f_n,fft_signal_mod); 
title('qpsk调制信号的频谱');  
xlabel('频率(Hz)'); ylabel('幅度'); axis tight; grid on; 
 
subplot(224); 
plot(fs*(-f_n/2:f_n/2-1)/f_n,20*log10(fft_signal_mod)); 
title('qpsk调制信号的频谱(单位(dB))');  
xlabel('频率(Hz)'); ylabel('幅度(dB)');  grid on;  
% 这里对dB图的axis 不作限制; 
 elseif plot_flag==0 
 end;