单边带调制(SSB调制)的理论基础和MATLAB仿真


前言

《通信原理》这门课程的第一次研讨中,老师提供了一个关于SSB调制的研讨方向。本文汇总了我们小组准备的资料,分成SSB的理论实现部分基于MATLAB的仿真部分两部分,带领大家详细探讨SSB调制过程,希望大家有所收获。(如果各位看官发现问题,还请不吝指出,谢谢~)


一、SSB调制的起源

1. 信号的幅度调制:

 《通信原理》(第2版)的定义:用消息信号去控制载波的瞬时幅度,使载波的幅度随调制信号而变化。

  听着很抽象是不是?以下是通俗易懂版本:
    无线通信的发射端需要把信号加在一个功率很大的载波信号上,才能够确保在很远的地方接收到信号,这个过程可
  以参考射频传输加以了解。

2. AM和DSB-SC:

常规调幅(AM)
     时域表达式:在这里插入图片描述
  优点:接收端的制造成本低(只需要使用包络检波电路就可以实现);
     在需要大量接收机的时候有优势;
  缺点:调制效率不高(发送的过程中发送了大量纯载波,也就是“1”);
抑制载波双边带调制(DSB-SC):
  时域表达式:在这里插入图片描述
   优点:没有了载波“1”,传输效率可以达到100%
   缺点:提高了接收端的成本(需要使用锁相环进行相干解调);

3. SSB调制:

改进:DSB-SC使用的双边带调制,在频带资源很紧张的情况下,传输双边带显然会造成资源浪费,因为根据傅里叶变换的性质,实函数(真实传输的信号)的正负频率部分是共轭对称的。

实现方式一:滤波法
  用滤波法产生SSB信号的原理框图如下:

    由上图可知,边带滤波器有两种,其中,Husb(w)用于剔除下边带,Hlsb(w)用于剔除上边带。

实现方式二:相移法(MATLAB仿真)
    用相移法产生SSB信号的原理框图如下:

二、MATLAB仿真

1.Hilbert变换的仿真:

 理论基础部分:

  • HIlbert变换只改变信号的相位,但是不改变信号的幅度谱。

 关键代码展示:

%%
%原信号和经过Hilbert变换之后的信号(时域图)
ts = 0.0025;
fs = 1/ts;
N = 200;
f = 50;
k = 0:N-1;
t = k*ts;
% 信号变换
% 结论:sin信号Hilbert变换后为cos信号
y =  sin (2* pi *f*t);
yh = hilbert(y);     % matlab函数得到信号是合成的复信号
y_h = imag (yh);     % 虚部为相移之后的原信号

%%
%原信号和经过Hilbert变换之后的信号(频域图)
y_length=length(y);
y_h_length=length(y_h);
NFFT_y = 2^nextpow2(y_length);
NFFT_y_h = 2^nextpow2(y_h_length);
F_Y_domain = (fs/2)*linspace(0,1,NFFT_y/2);  
F_Y_H_domain = (fs/2)*linspace(0,1,NFFT_y_h/2); 
Y = fft(y,NFFT_y)/y_length;     
Y_H = fft(y_h,NFFT_y_h)/y_h_length;     
Amp_Y = 2*abs(Y(1:NFFT_y/2));         
Amp_Y_H= 2*abs(Y_H(1:NFFT_y_h/2)); 

 仿真结果展示:

2.“sin(t)”+"cos(t)"的仿真:(以正弦信号为例验证Hilbert变换)

 理论基础部分:

  • 解析信号 = 原(实)信号 + j * 经过Hilbert变换之后的原信号,即:z(t) = x(t) + j * hilbert(x(t))

  • MATLAB中的hilbert()函数得到的是复信号,原因为:hilbert()的作用是将原信号中正频率的部分相移 -π/2,负频率部分相移π/2,因此需要通过实部和虚部一起表示信号(可以浏览附录一的图片加以理解);

  • 正弦函数的FT变换如下:

    我们不妨做以下尝试来验证Hilbert变换:
     a. 对经过hilbert变换之后的正弦信号翻转π/2(即*j),然后看这个处理之后的信号在实轴的投影,如果这个信号的投影为0,并且它的相位谱和原信号的相位谱不同,则说明Hilbert变换确实改变了信号的相位;

 关键代码展示:

%%
%信号翻转
y =  sin (2* pi *f*t);
yh = hilbert(y);     % matlab函数得到信号是合成的复信号
y_h = j * imag (yh);     % 虚部为相移之后的原信号

%%
%信号叠加
y_y_h = y + y_h;
y_y_h_length=length(y_y_h);
NFFT_y_y_h = 2^nextpow2(y_y_h_length);
F_Y_Y_H_domain = (fs/2)*linspace(0,1,NFFT_y_y_h/2);  
Y_Y_H = fft(y_y_h,NFFT_y_y_h)/y_y_h_length;     
Amp_Y_Y_H = 2*abs(Y_Y_H(1:NFFT_y_y_h/2));    

 仿真结果展示:


3.SSB的仿真:(以理想的“u(t)-u(t-1) ”信号作为原信号)

 理论基础部分:

  • 本仿真过程中采用的是剔除下边带SSB调幅法,即:在这里插入图片描述
  • 由于MATLAB中的Hilbert()变换阶数有限,所以对一个理想的窗函数进行Hilbert变换之后,得不到理想的冲击函数,而是有一定的高度
  • 由于Hilbert变换在频率为零的附近没有定义,为了保证幅度谱的连续性,MATLAB会强制在零频率附近赋值,所以一个理想的窗函数经过Hilbert变换之后,在频域上得不到理想的sinc函数;(在附录二有解决的方案)
  • 载波的频率为5000hz,所以原信号和经过了Hilbert变换之后的信号相加得到的叠加信号的幅度谱,在5000hz的右边(上边带)为两个信号的幅度谱直接相加,在5000hz的左边(下边带)为两个信号的幅度谱直接相减
  • 由于MATLAB都是使用DFT进行信号的处理,所以仿真出来的结果不会出现理想的情况。

 关键代码展示:

变量表示的意思:
y:cos载波信号;					y_h:sin载波信号;
m:原信号; 						m_h:经过Hilbert变换之后的原信号;
y_m:原信号加载在cos载波信号;	y_h_m_h:经过Hilbert变换之后的原信号加载在sin载波信号;
y_m_y_h_m_h:y_m + y_h_m_h
%%
%定义相移法中用到的载波
ts = 0.000025;
fs = 1/ts;
N_zai = 200;
f_zai = 5000;
k = 0:N_zai;
t_zai = k*ts;
%得到cos载波信号
y =  cos (2* pi *f_zai*t_zai);
yh = hilbert(y); 
%得到sin载波信号
y_h = imag (yh);      

%%
%原函数:使用理想的u(t)-u(t-1) (时域)
f_yuan = 50;
t = -2:1/f_yuan:2;
ut1 = stepfun(t,0);
ut2 = stepfun(t,1);
m = ut1 - ut2;
mh = hilbert(m);
m_h = imag (mh);
%原函数:使用理想的u(t)-u(t-1) (频域)
m_length=length(m);
NFFT_m = 2^nextpow2(m_length);
F_M_domain = (fs/2)*linspace(0,1,NFFT_m/2);  
M = fft(m,NFFT_m)/m_length;  
Amp_M = 2*abs(M(1:NFFT_m/2));   
M_H = fft(m_h,NFFT_m)/m_length;  
Amp_M_H = 2*abs(M_H(1:NFFT_m/2));  

%%
%SSB的相移过程:(默认Ac=1)
y_m = m.*y;
y_h_m_h = (j*m_h).*(j*y_h);
y_m_y_h_m_h = y_m + y_h_m_h;
y_m_length=length(y_m);
y_h_m_h_length=length(y_h_m_h);
y_m_y_h_m_h_length=length(y_m_y_h_m_h);
NFFT_y_m = 2^nextpow2(y_m_length);
NFFT_y_h_m_h = 2^nextpow2(y_h_m_h_length);
NFFT_y_m_y_h_m_h = 2^nextpow2(y_m_y_h_m_h_length);
F_Y_M_domain = (fs/2)*linspace(0,1,NFFT_y_m/2);  
F_Y_H_M_H_domain = (fs/2)*linspace(0,1,NFFT_y_h_m_h/2);  
F_Y_M_Y_H_M_H_domain = (fs/2)*linspace(0,1,NFFT_y_m_y_h_m_h/2);  
Y_M = fft(y_m,NFFT_y_m)/y_m_length;  
Y_H_M_H = fft(y_h_m_h,NFFT_y_h_m_h)/y_h_m_h_length; 
Y_M_Y_H_M_H = fft(y_m_y_h_m_h,NFFT_y_m_y_h_m_h)/y_m_y_h_m_h_length; 
Amp_Y_M = 2*abs(Y_M(1:NFFT_y_m/2));   
Amp_Y_H_M_H = 2*abs(Y_H_M_H(1:NFFT_y_h_m_h/2));   
Amp_Y_M_Y_H_M_H= 2*abs(Y_M_Y_H_M_H(1:NFFT_y_m_y_h_m_h/2));  

 仿真结果展示:



总结

  原信号经过Hilbert变换器得到与原信号相位不同、幅值相同的新信号,然后通过一个简单的加法器就可以进行叠加,最后实现SSB调制。这种调制方式既能够解决AM调制效率不高的问题,又能够解决DSB-SC浪费频带的问题,是现在实现幅度调制比较好并且可以调制性能比较高的调幅方式。
  最后,特别感谢通信原理第一小组的所有组员们(由于网络隐私问题,这里就不写大家的名字了)。能够得到最后仿真的成果,是因为大家一起准备的材料,尤其是大家汇总的PPT,可以说,这篇文章,只是把大家汇总的PPT进行了书面的表达。所以,再次感谢大家~

引用(感谢以下作者)

文章名字文章作者
通信原理第一小组(研讨题:31)通信原理第一小组全体组员
《通信原理 第二版》李晓峰老师
常用傅里叶变换对杨老师
【 MATLAB 】sinc 函数简介李锐博恩
深入浅出傅里叶变换(目前看到的讲得最好的一篇文章)聪聪那年_
希尔伯特变换(Hilbert Transform)简介及其物理意义江户川柯壮

附录:

附录一:四次Hilbert变换

附录二:借助AM得到原信号(去除Hilbert()函数的零频影响)

  问题描述:
    当输入的信号是一个简单的窗函数时,可以在频域的零频率附近发现,经过Hilbert变换之后的信号的幅度谱和原信
  号的幅度谱发生了变化(现象可以参考上图中的SSB仿真结果),而按照HIlbert变换的定义,Hilbert变换并不改变信号
  的幅度谱特征。

  理论分析:
    又Hilbert变换的定义可知,Hilbert变换在零频率附近是没有做定义的,但是在Matlab中,hilbert()函数为了保证函
  数图像的连贯性,就在零频率附近进行了强行赋值,于是就出现了Hilbert变换改变幅度谱的错误现象。

  第二次SSB仿真思路:
    第一次SSB仿真采用的原信号是一个简单的窗函数,它在频域上会出现在零频率附近幅值不为零的情况,这样会出
  现Hilbert变换改变幅度谱的错误现象。为了避免出现这样的错误现象,李晓峰老师提供了一个解决问题的方案:利用AM
  调幅的方法,把窗函数进行频谱的搬移,这样在零频率附近就基本不存在幅度值非零的影响了。

  第二次SSB仿真关键代码展示:

%原函数:使用理想的u(t)-u(t-1) (时域)/仿真效果不太好
%原函数:借用DSB-SC调制的方式 (时域)/仿真效果比较好
f_yuan = 50;
t = -2:1/f_yuan:2;
%ut1 = stepfun(t,0);
%ut2 = stepfun(t,1);
%m = ut1 - ut2;
ut1 = stepfun(t,0);
ut2 = stepfun(t,100);
ut = ut2 - ut1;
m = (1+ut).*cos(2*pi*500*t_zai);
mh = hilbert(m);
m_h = imag (mh);

  第二次SSB仿真效果展示:

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页