简单16-QAM传输系统(Matlab实现)

这是一个简单的16-QAM传输系统设计,包含发射机,信道和接收机。此项目的目标是学习在数字传输系统中一些基本模块的功能。通过仿真,我们需要掌握发送滤波器、接受滤波器以及均衡器等模块是如何被使用、为什么被使用以及使用了这些模块之后对通信系统产生了怎么样的影响。通信系统仿真的设计框图如图所示。

代码缺陷

(1)眼图不对,可能是错误使用了eyediagram()函数
(2)信道均衡时,训练测试使用同一个数据集,考虑使用另一个随机样本集合会更好
(3)误码率曲线有问题,(代码为误符号率)最后结果没有转换为误码率,需要添加一个符号-比特映射模块

注意:
实验平台:MatlabR2018a,若使用低版本的Matlab,可能会使某些函数出错,例如:sprintf(),equalize()等
可改进之处:
(1)16QAM直接生成星座图点,可能经过IQ映射生成QAM信号会更好。
(2)信道均衡训练测试使用同一个数据集,考虑使用另一个随机样本会更好
(3)可以尝试更多的信道模型模拟不同的场景
equalize的使用: 均衡时使用了信号前2000个对均衡器权系数进行训练,模仿训练集和测试集的划分。当使用较少信号对权系数训练时,最后结果明显不如较多信号训练结果。

完整代码

clc
clear%% 发送机 要求滚降0.25,FS=4M,FS*T=4,1/T=1M,M = 16;aqam = [-3, -1, 1, 3];A = repmat(aqam, 4, 1);B = flipud(A');konst_qam = A+i*B;konst_qam = konst_qam(:); % 产生所有星座点qam = konst_qam(randi([0,15], 10000, 1)+1);figure()plot(qam, 'o');title('Ordinary Signal Contellation');axis([-4 4 -4 4]);xlabel('Re');ylabel('Im')FS = 3000000;   %采样频率N = length(qam);T = 1/1000000;RS = 1/T;FS_T = 3;t = -5*T:1/FS:5*T;t = t+1e-10;alfa = 0.35;%发送滤波器的时域表达式以及过采样因子缩放cositem = cos((1+alfa)*pi*t/T);sinitem = sin((1-alfa)*pi*t/T);extra = 4*alfa*t/T;below = (1-(4*alfa*t/T).^2).*(pi*t/T);p = (extra.*cositem+sinitem)./below; %发送滤波器的时域表达p = p./(sqrt(FS*T)); %过采样% 下面是加零和滤波qams = zeros(size(1:FS_T*N));qams(1:FS_T:FS_T*N) = qam;symbols = filter(p, 1, qams);%下面是滤波器和实际传输信号的幅度谱Nfft = 2048;P = fftshift(fft(p,Nfft));X0 = fftshift(fft(symbols,Nfft));f = -FS/2:FS/Nfft:FS/2-FS/Nfft;figure()subplot(211);plot(f, 20*log10(abs(P)));grid;title('Pulse Spectrum in dB');xlabel('Freq');subplot(212);plot(f, 20*log10(abs(X0)));grid;title('Signal Spectrum in dB')xlabel('Freq');figure();plot(symbols,'.');  % 信号星座图title('Trans Signal Contellation')eyediagram(symbols, 2); % 实际发送信号的眼图
%% 通过信道传输% 通过线性滤波器Fcut = 500000;wn_lpf = Fcut*2/FS;b_lpf = fir1(4, wn_lpf);lpf_symbols = filter(b_lpf, 1, symbols);figure()X1 = fftshift(fft(lpf_symbols, Nfft));plot(f, 20*log10(abs(X1)));grid;title('After Channel Filter Signal Spectrum in dB')xlabel('Freq');% SNR加噪noise = randn(size(lpf_symbols))+i*randn(size(lpf_symbols)); % 产生复数噪声svsymbol = std(lpf_symbols)^2; nv = std(noise)^2;figure()Ps = [];for SNR = 5:5:20p1 = std(lpf_symbols)/(std(noise)*10^(SNR/20));sign_withnoise(SNR/5,:) = lpf_symbols+noise*p1;Ps(SNR/5,:) = fftshift(fft(sign_withnoise(SNR/5,:),Nfft));subplot(2,2,SNR/5)plot(f, 20*log10(abs(Ps(SNR/5,:))));grid;title(sprintf("Signal Spectrum in dB in SNR %d",SNR))xlabel('Freq');end
%% 接收机for i = 1:4rvfilter(i,:) = filter(p,1,sign_withnoise(i,:));end% 下面是接受信号的星座图for i = 1:4eyediagram(rvfilter(i,:),2)end% 找到相位差,并且重采样impulse = [1,zeros(1,100)];TxImpOut = filter(p,1,impulse);ChannelImpOut = filter(b_lpf, 1, TxImpOut);RxImpOut = filter(p,1,ChannelImpOut);[Trash, Pos] = max(abs(RxImpOut));%RXSAMPOUT能恢复出qamfigure()for i = 1:4temp = rvfilter(i,:);subplot(4,3,3*i-2)plot(rvfilter(i,:), '.')title(sprintf("Recieved signal Contellation in SNR %d", i*5))subplot(4,3,3*i-1)RxSampOut(i,:) = temp(Pos:FS*T:end);plot(RxSampOut(i,:),'.')title(sprintf("Resampled Signal Contellation in SNR %d", i*5))end
%% 信道均衡%使用均衡函数进行均衡操作sigconst = step(comm.RectangularQAMModulator(M),(0:M-1)');eqlms = lineareq(6, lms(0.0008)); % Create an LMS equalizer object.eqlms.SigConst = sigconst'; % Set signal constellation.eqlms.ResetBeforeFiltering = 0; % Maintain continuity between iterations.eq_current = eqlms;msglen = length(RxSampOut(1,:));modmsg = qam(1:msglen);itr = 2000;trainsig = modmsg(1:itr);%取其中1/5训练均衡器抽头系数for i = 1:4msg = RxSampOut(i,:).';y = equalize(eq_current, msg, trainsig);subplot(4,3,3*i)plot(y(itr+1:end),'.')z(i,:) = y;title(sprintf("Equalized Signal Contellation in SNR %d", i*5))end%% 误码率曲线
for i = 1:4sn_block = repmat(z(i,:),16,1);konst_block = repmat(konst_qam,1,msglen);distance = abs(sn_block-konst_block);[dmin,ind_2] = min(distance);qam_det = konst_qam(ind_2);qamlen = length(qam_det);d = 2;SNR =5*i;p2 = std(qam)/(std(noise)*10^(SNR/20));sigma = std(real(noise*p2));Q = 0.5*erfc(d/(sqrt(2)*2*sigma));sep_theo(i) = 3.5*Q - 3.0625*Q^2;number_of_errors = sum(qam(1:qamlen) ~= qam_det);sep_simu(i) = number_of_errors/qamlen;
endfigure()A2_over_sigma2_dB=5:5:20;%仿真信噪比范围(dB)A2_over_sigma2=10.^(A2_over_sigma2_dB./10);%仿真信号信噪比(倍数)hold on; semilogy(A2_over_sigma2_dB,sep_theo,'b');semilogy(A2_over_sigma2_dB,sep_simu,'r');legend('理论误码率','实际仿真结果')title('Bit Error Rate (BER) in SNR')xlabel('SNR');ylabel('Bit Error Rate (BER)');grid on;hold off;

简单16-QAM传输系统(Matlab实现)相关推荐

  1. 16位计算机cpu电路图,简单16位CPU设计.doc

    简单16位CPU设计 简单16位CPU设计 一.实验内容 完成从指令系统到CPU的设计,编写测试程序,通过运行测试程序对CPU设计进行正确性评定.具体内容包括:典型指令系统(包括运算类.转移类.访存类 ...

  2. matlab 简单算例,(简单算例)基于Matlab的电力系统潮流编程计算.pdf

    (简单算例)基于Matlab的电力系统潮流编程计算 基于Matlab的电力系统潮流编程计算 口黄扬威吴喜春郭志峰张斯翔 (三峡大学电气与新能源学院湖北·宜昌443002) 摘要:通过介绍电力系统的实际 ...

  3. Ubuntu 16.04安装Matlab R2016b

    https://www.linuxidc.com/Linux/2017-03/142298.htm Ubuntu 16.04安装Matlab R2016b [日期:2017-03-28] 来源:Lin ...

  4. 内部矩阵维度必须一致simulink_简单五步实现 MATLAB/Simulink 锂电池建模

    锂电池是目前在各个能源密集型行业中用途广泛,例如新能源汽车.电力微网.航空航天等.电池模型的建立对研究电池的特性.SOC(state-of-charge)估计.SOH(state-of-health) ...

  5. matlab简单程序实例视频,matlab编程实例100例.docx

    matlab编程实例100例 1-32是:图形应用篇33-66是:界面设计篇67-84是:图形处理篇85-100是:数值分析篇实例1:三角函数曲线(1)function shili01h0=figur ...

  6. matlab simulink_简单五步实现 MATLAB/Simulink 锂电池建模

    锂电池是目前在各个能源密集型行业中用途广泛,例如新能源汽车.电力微网.航空航天等.电池模型的建立对研究电池的特性.SOC(state-of-charge)估计.SOH(state-of-health) ...

  7. 简单16进制转字符串

    PYTHON 以字符串形式存在的16进制数,转为该16进制对应的ascii字符串比较麻烦. 如: hex_str = '7468616e6b20796f752076657279206d75636821 ...

  8. CT成像——等距扇束正反投影的简单介绍以及在matlab上的实现

    相信会点进来看这篇文章的朋友应该也是在学习断层成像方面的吧? 我接触CT成像和matlab不久,大概也就一个月,写出这些感觉还是充满了困难,在csdn上找,CT成像的相关且不用下载的代码也不多,想到学 ...

  9. 【车间调度】基于matlab混合蛙跳算法 (SFLA) 求解简单调度问题【含Matlab源码 2247期】

    ⛄一.车间调度简介 在传统的SFLA中,每一个青蛙的位置代表一个解,若干个青蛙组成的种群代表一个解的集合,种群被划分为不同的组,即模因组,对每个模因组执行搜索过程,当达到终止条件后,重新将模因组合并成 ...

  10. simple算法matlab程序,metropolis算法的简单c++实现以及matlab实现

    标签:算法metropolis是一种采样方法,一般用于获取某些拥有某些比较复杂的概率分布的样本. 1.采样最基本的是随机数的生成,一般是生成具有均匀分布的随机数,比如C++里面的rand函数,可以直接 ...

最新文章

  1. linux 分析磁盘性能,03.分析性能瓶颈 - 3.4.磁盘瓶颈 - 《Linux性能调优指南》 - 书栈网 · BookStack...
  2. 构建之法——软件工程概论、团队组织管理及开发流程
  3. 实验10:创建带有生命周期方法的bean ||实验11:测试bean的后置处理器
  4. ALinq 入门学习(八)--ALinq 对Vs2010 的支持
  5. 分布式文件系统研究-fastDSF架构介绍
  6. 2015年百度之星初赛(1) --- A 超级赛亚ACMer
  7. idea添加jboss_如何将云持久存储添加到JBoss Cool Store
  8. http://www.a.cn/?a.b=1 取a.b的值
  9. *【POJ - 3659】Cell Phone Network (树形dp,最小支配集)
  10. 微信第三方平台-授权流程经验分享
  11. Add_List2Dictionay
  12. 20200705每日一句
  13. jQuery,JS实现自定义鼠标右键菜单
  14. matlab2016 wavread,DSP MATLAB软件平台下,利用函数wavread对语音信号进行采样,记住 频率和 点数; 2 238万源代码下载- www.pudn.com...
  15. 「米聊」突然复活,雷布斯真的是出其不意
  16. java内部错误2203,win7系统安装Java出现"内部错误2203"问题的解决方法
  17. openwrt 使用ebtables限制设备访问外网或内网
  18. 计算机管理上移动硬盘显示其他设备,移动硬盘坏了插上之后电脑会显示有新设备接入而且设备运转正常,但我 爱问知识人...
  19. 【数据库】聊一下数据库的锁机制
  20. Prometheus -Grafana部署及部署告警

热门文章

  1. linux文件备份脚本
  2. 面试 | 接口和抽象类的区别
  3. 你得知道这3个最基础的APP技术框架
  4. 标准员报考建筑八大员报考建筑标准员施工质量标准化的建议
  5. Salesforce Admin管理员中文学习教程_如何高效筛选出具有Admin权限的用户!
  6. google地图学习笔记(1)
  7. 文件上传漏洞、编辑器漏洞和条件竞争漏洞介绍(笔记)
  8. 数据增强增广方法及实现
  9. 神经网络——Python实现BP神经网络算法(理论+例子+程序)
  10. js 获取当前日期(年月日时分秒周)