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