准备电赛通信题的过程中会遇到如何传递数字信号的问题,下面就在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酒吧 测试工程师们满意地离开了酒吧
然后一名顾客点了一份炒饭,酒吧炸了
|