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

📄 qpsk_demod_zibian.m

📁 考虑载波的qpsk信号在瑞利信道上的仿真
💻 M
字号:
% 这个函数对qpsk信号进行解调;
% y是解调出的比特信息;
% 对于调制和解调来说,其载波频率,采样频率,时间点n都应该是一致的
% 注意在将二进制信号转化为4进制时有一个顺序关系,比如0101序列
% 可以从左至右,也可以从右至左,
% 由于调制是按符号来调制的,解调时也要按相反的方向,先解调出符号
% 再转化为比特流;

% function [y_demod_bit,y_demod_symbol]=...
%                              qpsk_demod_ZiBian(x,fc,fs,n)
function [y_demod_bit]=...
            qpsk_demod_ZiBian(x,fc,fs,symbol_t,theta)
% 注意把握好fc,fs,n之间的关系,是一个四进制码元内的载波信号点
% 是整数个周期;
% x表示的是输入的调制信号,是列向量,
% fc是载波频率,fs是采样频率,
% n是每一个四进制码元下拥有的载波信号采样点数;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if nargin<5
    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_q=sin(2*pi*fc*t);
signal_i=cos(2*pi*fc*t);
signal_mod=x;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 下面是解调部分:
symbol_demod=[];
base_4=[0 1 2 3]';
mod_4=pskmod(base_4, 4 , theta);


for i=1:n:(size(signal_mod,1)-n+1)
    demod_i=signal_i*signal_mod(i:i+n-1)/(n/2);
    demod_q=signal_q*signal_mod(i:i+n-1)/(n/2);
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 注意进行相关检测,
    % 进行相关检测,选出最大的;
%     base_4=[0 1 2 3]';
%     mod_4=pskmod(base_4, 4 , theta);
    position=1; % 初始默认值;
    aa=0;
    for ii=1:size(mod_4,1)
        ww=[demod_i,demod_q]*[real(mod_4(ii)),imag(mod_4(ii))]';
        if ww>=aa
           position=ii;
           aa=ww;
        end;
    end;
    symbol_demod_temp=base_4(position);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 下面的是硬判决,根本不能用;      
%     if (demod_i>=0) & (demod_q>=0)
%         symbol_demod_temp=0;
%     elseif (demod_i<0) & (demod_q>=0)
%         symbol_demod_temp=1;
%     elseif (demod_i<0) & (demod_q<0)
%         symbol_demod_temp=2;
%     elseif (demod_i>=0) & (demod_q<0)
%         symbol_demod_temp=3;
%     end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   % 先解调出符号;
    symbol_demod=[symbol_demod,symbol_demod_temp]; 
end;

y_demod_symbol=symbol_demod;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if size(symbol_demod,1)<=size(symbol_demod,2)
    symbol_demod=symbol_demod';
else
    symbol_demod=symbol_demod;
end;   % 把symbol_demod变换成列向量;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 再由符号恢复出比特流;
    % symbol_demod是解调出的符号信息;
    bit_demod=zeros(2*size(symbol_demod,1),1);
    for ii=1:size(symbol_demod,1)
        if (symbol_demod(ii)==0)
           bit_demod(2*ii-1)=0;
           bit_demod(2*ii)=0;
        elseif (symbol_demod(ii)==1)
           bit_demod(2*ii-1)=1;
           bit_demod(2*ii)=0;
        elseif (symbol_demod(ii)==2)
           bit_demod(2*ii-1)=0;
           bit_demod(2*ii)=1; 
        elseif (symbol_demod(ii)==3)
           bit_demod(2*ii-1)=1;
           bit_demod(2*ii)=1;
        end;
    end;
    % y是解调出的比特信息;
    y_demod_bit=bit_demod;

⌨️ 快捷键说明

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