数字通信 - ASK调制、解调技术(Matlab仿真实现)

准备电赛通信题的过程中会遇到如何传递数字信号的问题,下面就在Matlab上利用ASK(Amplitude Shift Keying)技术对二进制信号进行调制、解调,最终效果还是可以的😁。

总体的思路就是

  • 利用载波信号的幅度键控实现调制 - 整流+低通滤波(非相干解调)实现解调

本次在Matlab上仿真的是2ASK调制也就是传输的是二进制数字信号,即载波的幅度只有两种变化状态 0 or 1

ASK调制

千言万语我觉得不如先上张图,后续再添加部分语言进行解释

  • ASK技术本质上就是利用载波信号的幅度来表示前级输入的二进制信号,所谓键控就是形象地利用数字信号 0 or 1 的基带信号去键控一个连续的载波,有载波输出表示发送1,无载波表示发送0
  • 2ASK信号表示式:

$$
s(t)=m(t)·cos(w_ct+φ_c)
$$

  • 成形滤波器使用后可以降低信号带宽,在频带资源紧张时有一定用处,且不怎么会影响最终解调后的信号还原度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
% ASK_signal process_0 or 1 modulation
Len=1000;%码元长度
Fs=8*10^6;%采样频率
Rs=1*10^6;%码元速率
LenData=8000;%数据长度
Fc=0.5*10^6;%载波频率 - 不能过高-将影响采集后的信号

%产生随机的二进制数据 - 基带信号
code_2ask = randi(2,1,Len)-1;
%产生载波信号
t=0:1/Fs:Len/Rs;
carrier=cos(2*pi*Fc*t);
carrier=carrier(1:LenData);
%采样
code_2ask_upsamp = rectpulse(code_2ask, Fs/Rs);
code_2ask_filter = rcosflt(code_2ask, 1, Fs/Rs);
%产生未成形滤波的ASK信号
ASK2 = carrier .* code_2ask_upsamp;
%成形滤波后的信号
ASK2_filter = carrier.*code_2ask_filter(1:LenData)';

%频谱
ASK2_fft=20*log10(abs(fft(ASK2,1024)));
ASK2_fft=ASK2_fft-max(ASK2_fft);
ASK2_filter_fft=20*log10(abs(fft(ASK2_filter,1024)));
ASK2_filter_fft=ASK2_filter_fft-max(ASK2_filter_fft);

上述就是产生ASK调制信号的代码 - 构图的代码由于篇幅原因这边就不放,可以在我 github主页上找到

当然你不能就调制,还得给它解调回来,不然本来的信号不就算是丢失了😎


ASK解调

解调可以分为相干解调和非相干解调,由于相干解调需要在接收端提供一个与ASK调制信号保持同频同向的相干载波,实现相对复杂,所以这边直接利用与当时电子实训(shit☢️)课做的AM收音机相似的包络检波法,即利用整流加一个低通就可以得到原来的信号,当然不可能性能和简易性,两方面都占,所以非相干解调相对于相干解调性能会稍微逊色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
% ASK_signal process_0 or 1 demodulation
Rs=1*10^6; %码元速率
Fs=8*Rs; %采样频率

%整流 - 做绝对值
ASK2_rect=abs(ASK2);
ASK2_filter_rect=abs(ASK2_filter);

%低通滤波 - 输入整流后的信号
b=fir1(32,Rs*2/Fs);
d_ASK2=filter(b,1,ASK2_rect);
d_ASK2_filter=filter(b,1,ASK2_filter_rect);

%构图
figure(2);
x=0:500;x=x/Fs*(10^6);
subplot(311);
plot(x,code_2ask_upsamp(100:600));
axis([0 60 -0.2 1.5]);
xlabel('时间(us)');ylabel('幅度(v)');
title('2ASK 基波信号');grid on;
subplot(312);plot(x,d_ASK2(100:600));
axis([0 60 -0.2 0.8]);
xlabel('时间(us)');ylabel('幅度(v)');
title('解调2ASK(原)');grid on;
subplot(313);plot(x,d_ASK2_filter(100:600));
axis([0 60 0 0.8]);
xlabel('时间(us)');ylabel('幅度(v)');
title('解调2ASK(成形滤波)');grid on;
  • 这边调了好久的对比图就直接不吝啬地贴了嘿嘿😁
  • 因为有滤波器所以会产生一定的相移,可以看出解调出来的信号基波还原度还是比较高的

  • 取一定比例的峰值信号作为判决门限,可以很容易地恢复出原始的传输数据,也就是进行最后的复现流程

当然ASK不止能传输简易的二进制信号,也有4ASK调制、解调(00、01、11、10),通过合理的判决门限可以很好地还原基带信号

ASK也不是唯一选择,可以使用OOK、FSK等进行数字信号处理

今天本来是也有附上 Vivado 实现的流程,不过很遗憾,simulation 不出来,后面 Debug 出来再来👻

今天辉转了个帖子哈哈哈😂😂属实道出了开发者的苦衷了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
测试工程师的故事

一个测试工程师走进一家酒吧,要了一杯啤酒
一个测试工程师走进一家酒吧,要了一杯咖啡
一个测试工程师走进一家酒吧,要了0.7杯啤酒
一个测试工程师走进一家酒吧,要了-1杯啤酒
一个测试工程师走进一家酒吧,要了2^32杯啤酒
一个测试工程师走进一家酒吧,要了一杯洗脚水
一个测试工程师走进一家酒吧,要了一杯蜥蜴
一个测试工程师走进一家酒吧,要了一份asdfQwer@24dg!&*(@
一个测试工程师走进一家酒吧,什么也没要
一个测试工程师走进家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来
一个测试工程师走进家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿
一个测试工程师走进一
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷
一个测试工程师走进一家酒吧,要了NaN杯Null
1T测试工程师冲进一家酒吧,要了500T啤酒咖啡洗脚水野猫狼牙棒奶茶
1T测试工程师把酒吧拆了
一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒,并且不付钱
一万个测试工程师在酒吧外呼啸而过
一个测试工程师走进一家酒吧,要了一杯啤酒‘;DROPTABLE酒吧
测试工程师们满意地离开了酒吧

然后一名顾客点了一份炒饭,酒吧炸了