原创 Matlab实现模拟调制与解调

2018-8-30 11:52 6660 19 9 分类: 通信

本文会介绍简单的模拟调制解调方法,涉及AM、DSB、SSB,但没有VSB,VSB相关的资料会在后文附上。


幅度调制幅度调制原理

幅度调制是由调制信号去控制高频载波的幅度,使之随调制信号作线性变化的过程

简单的说,幅度调制的作用就是使得载波的幅度承载信息。

设正弦型载波为:

式中:A为载波幅度,ω为载波角频率,φ为载波初始相位

幅度已调信号一般可表示为:

式中:m(t)为基带调制信号

设m(t)的频谱为M(ω),则s(t)的频谱为:

从频域表达式可以看出,幅度调制信号为调制信号在频域上的线性搬移。不过实际上,任何一种调制都是非线性的。


调幅(AM)

调幅的时域表达式为:

式中:A0为外加直流分量,Ac为载波信号的最大幅值,Ka为调制度

matlab实现过程如下:

生成调制信号

A0 = 0.1;
Ka = 0.5;
Fs = 300;

% Modulating signal
Am = 1;
fa = 10;
Ts = 1/Fs;
t = 0:Ts:1-Ts;
ym = Am*sin(2*pi*fa*t);
figure(1);
subplot(3,2,1);
plot(t,ym);
title('Modulating signal');

[YfreqDomain,frequencyRange] = centeredFFT(ym,Fs);
subplot(3,2,2)
stem(frequencyRange,abs(YfreqDomain));

生成载波信号

%Carrier signal
Ac = 1;
fc = fa*10;
Tc = 1/fc;
yc = Ac*sin(2*pi*fc*t);
subplot(3,2,3);
plot(t,yc);
title('Carrier signal');

[YfreqDomain,frequencyRange] = centeredFFT(yc,Fs);
subplot(3,2,4)
stem(frequencyRange,abs(YfreqDomain));

生成已调信号

%AM Modulation
y = Ac*(A0 + Ka*ym).*yc;
subplot(3,2,5);
plot(t,y);
title ( 'Amplitude Modulated signal');

[YfreqDomain,frequencyRange] = centeredFFT(y,Fs);
subplot(3,2,6)
stem(frequencyRange,abs(YfreqDomain));

满调制的效果如下:

通过调节Ka的值,可以控制调制深度

Ka<1时为欠调制,效果如下:


Ka>1时为过调制,效果如下:


双边带调制(DSB)

在幅度调制中,载波分量并不携带信息。为了提高效率,将AM调制的A0去掉,同时也可以减小功率,从而得到双边带调制。

其时域表达式为:

matlab实现过程如下:

调制信号和载波信号用前面给出的,以下是已调信号:

y = ym.*yc;
subplot(3,2,5);
plot(t,y);
title ( 'Double-sideband Modulated signal');

[YfreqDomain,frequencyRange] = centeredFFT(y,Fs);
subplot(3,2,6)
stem(frequencyRange,abs(YfreqDomain));
axis([-(fc+fa+5) +(fc+fa+5) 0 0.3]);
title ( 'Frequency of double-sideband Modulated signal');

效果如下:


单边带调制(SSB)

注意看就会发现,DSB的频谱上边带和下边带是一样的,完全可以去掉其中一个边带,这样可以节省一半的带宽,这种调制方式就是单边带调制。

一想到要去掉一个边带,自然就会想到使用滤波的方法。

频域表达式为:

matlab实现为:

y = ym.*yc;
Hd = getHighPassFilter;
y = filter(Hd,y);
subplot(3,2,5);
plot(t,y);
title ( 'Single-sideband Modulated signal');

[YfreqDomain,frequencyRange] = centeredFFT(y,Fs);
subplot(3,2,6)
stem(frequencyRange,abs(YfreqDomain));
axis([-(fc+fa+5) +(fc+fa+5) 0 0.3]);
title ( 'Frequency of single-sideband Modulated signal');

滤波器的实现如下:

function Hd = getHighPassFilter
%GETFILTER Returns a discrete-time filter object.

% MATLAB Code
% Generated by MATLAB(R) 9.4 and DSP System Toolbox 9.6.
% Generated on: 27-Aug-2018 17:17:35

Fstop = 100;   % Stopband Frequency
Fpass = 108;  % Passband Frequency
Astop = 60;   % Stopband Attenuation (dB)
Apass = 1;    % Passband Ripple (dB)
Fs    = 300;  % Sampling Frequency

h = fdesign.highpass('fst,fp,ast,ap', Fstop, Fpass, Astop, Apass, Fs);

Hd = design(h, 'kaiserwin', ...
    'MinOrder', 'any');

效果如下:


残留边带调制(VSB)

VSB调制有点复杂,实现的过程我还是不太清楚,只知道大致的作用。

虽然SSB在一般情况下是没有问题的,但是当调制信号频率较低(比如模拟电视信号),上边带和下边带频率会在载波频率重合,这种情况下设计一个直接隔离这两条边带的滤波器是基本不可能的(滤波器的归一化值不能小于0.01,假设目标频率为6MHz,那么过渡带最少就需要600Hz),从而会导致信号丢失一些信息。

在参考资料中有提供VSB的详细文档介绍


幅度解调

解调有两种方法:相干解调和非相干解调(包络检波)

相干解调

相干解调原理很简单,就是将搬移后的已调波频谱再搬移回去。

这就需要一个与发送已调波载波信号同频同向的本地载波,它与接收的已调信号相乘后,经过低通滤波后就得到原始基带信号。

已调信号一般时域表达式为:

与本地载波相乘后得到:

经过一个低通滤波器滤除ω载波分量后,就可以得到原始基带信号。

AM解调

matlab实现如下:

% AM Demodulation
figure;

sd = y.*yc*2 - A0;
H_am = demod_filter;
sd = filter(H_am,sd);
plot(t,sd);
title('Demodulated and true message signals for AM');

滤波器实现如下:

function Hd = demod_filter
%GETFILTER Returns a discrete-time filter object.

% MATLAB Code
% Generated by MATLAB(R) 9.4 and DSP System Toolbox 9.6.
% Generated on: 29-Aug-2018 20:44:14

Fpass = 10;   % Passband Frequency
Fstop = 90;   % Stopband Frequency
Apass = 1;    % Passband Ripple (dB)
Astop = 60;   % Stopband Attenuation (dB)
Fs    = 300;  % Sampling Frequency

h = fdesign.lowpass('fp,fst,ap,ast', Fpass, Fstop, Apass, Astop, Fs);

Hd = design(h, 'kaiserwin', ...
    'MinOrder', 'any');

效果如下:

DSB解调

DSB解调方法和AM解调一样,就不贴代码了

效果如下:

SSB解调

SSB的解调需要注意的是,由于削去了一半的信号,所以解调出来的信号不再是原始基带信号的一半幅度,而是四分之一,从时域表达式也可以看得出。

SSB的时域表达式为:

因此matlab实现需要稍作修改:

% SSB Demodulation
figure;

sd = y.*yc*4;
H_am = demod_filter;
sd = filter(H_am,sd);
plot(t,sd);
title('Demodulated and true message signals for SSB');

效果如下:

所有代码已上传Github
https://github.com/greedyhao/Wireless/blob/master/ana_mod_demod/ana_mod_demod.m

复制链接到浏览器可以下载代码


网上某位大神给的模拟调制解调的实现

https://www.colorado.edu/ECE/ecen4242/linmod2.m

他做了GUI,而且他的滤波器是用模拟滤波器,比我对模拟调制解调友好一些(毕竟是模拟的嘛),我用数字滤波器做完后才反应过来,我是对信号采样后用数字滤波器处理的。


参考资料
  1. tutorialspoint 

  2. 《通信原理》樊昌信 第七版

  3. Vestigial Side Band (VSB) Modulation Formats for Ultra-highCapacity 40 Gb/s Optical Communications Systems 

  4. Vestigial Sideband Modulation (VSB)  


个人博客





广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
greedyhao 2019-03-17 09:03
uboot链接脚本分析
上一篇uboot主编译脚本分析的编译选项参数中提到了链接脚本这么个东西我也是写到这里才开始了解链接脚本(Linker command scripts),之前只是大概知道有这么一个东西先从参考资料中的内...
greedyhao 2018-11-28 08:49
51总线方式获取adc0809数值
最近单片机有一个实验挺有意思的,使用51单片机以总线的方式读取adc0809的数据先补充点关于单片机总线的预备知识,我一开始不了解总线的时候做这个实验也是很懵逼的。单片机的三总线结构​51单片机有三条...
greedyhao 2018-09-29 21:18
对Xil_Out32未定义的引用
第一次在HLS中遇见一个官方库函数未定义问题,这就把解决方法记录下来。在创建好工程,写完工程代码后,发现报错如下./src/led_controller_test_tut_4A.o:在函数‘main’...
greedyhao 2018-09-29 21:12
Vivado生成Bitstream失败的解决方法
跟着实验指导书,难得的又遇到问题了,在最后生成Bitstream的时候出错了,无法生成Bitstream。报错信息如下[DRC NSTD-1] Unspecified I/O Standard: 4 ...
greedyhao 2018-09-17 22:26
zybo初体验
前段时间过生日,亲戚给了些钱让我自己买生日礼物,早就想搞一块zynq的板了,但是淘宝一看太贵,于是去咸鱼上淘了一块二手的ZYBO(谁知道是不是二手,反正看着挺新)来玩玩。学习肯定是从官方资料开始的,T...
greedyhao 2018-09-13 10:53
运行c代码前发生了什么
众所周知,c代码也是一种比较高级的语言了,机器是没有办法直接运行的,机器所能理解的只有机器码--那一串0和1而已。虽然早就知道c代码是先经过编译链接最后才放在机器上执行,但是在这么一个过程中究竟发生了...
广告
我要评论
0
19
广告
关闭 热点推荐上一条 /2 下一条