各小组负责短距离无线计算器的开发,所要求的产品是一系列实现无线计算器服务MATLAB函数组成。最终的产品应提供一批m文件,这些m文件可以在一台标准电脑上作为发射机或接收机运行。
一.实验环境:
2台标准个人电脑;
2副耳麦,每副耳麦各连接一台电脑;
软件平台:MATLAB
二.实验原理:
1. 算式编码:

因为考量到算式中数字与运算符的总数小于16,因此考虑编码成自然BCD码。运算符使用自然BCD码中未涉及的二进制码编码。对于算式,我们假设两个运算数都小于等于4位,这样可以分别将其补齐至4位,将所有满足条件的算式化成9位算式。这个编码方式便可以将9位的算式按位编码成36位二进制数。解码同理,按四位进行分组,分别解码即可解出算式。
2. 信道编码:

信道编码采用七四线性分组码。线性分组码中信息位和监督位是由一些线性代数方程联系着的,或者说线性码使按照一组线性方程构成的。一般来说,若码字长度为n,信息位位数为k,则监督位数r=n-k。

因此对四位二进制数进行编码,需要三位监督位。按设定好的监督关系进行编码即可。

3. 帧同步方案:

巴克码序列是相位编码信号的一种,具有理想的自相关特性。巴克码的自相关函数的主峰和旁瓣均为底边宽度为2T的等腰三角形,主瓣峰值是 旁瓣峰值 的13倍。能够找到的巴克码只有7种,子脉冲长度分别为:2,3,4,5,7,11,13。已经证明巴克码的最大长度为 13 位。为与信道编码后序列保持一致,本传输方案选择7位巴克码进行帧同步。在接收序列进行帧同步时遍历接受序列,找到与巴克码相干结果为7(或5)的情况进行匹配,匹配成功后进行信道解码与信源解码。
4. 调制与解调:

调制解调方案采用2FSK。2FSK(Frequency Shift Keying)为二进制数字频率调制(二进制频移键控),用载波的频率来传送数字信息,即用所传送的数字信息控制载波的频率。2FSK信号便是符号“0”对应于载频 f1,而符号“1”对应于载频 f2(与 f1 不同的另一载频)的已调波形,而且 f1 与 f2 之间的改变是瞬间的。传“0”信号时,发送频率为 f1 的载波; 传“1”信号时,发送频率为 f2的载波。2FSK 是用不同频率的载波来传递数字消息的。选用2FSK的原因一方面是在查阅相关文献后发现前人的方案大多使用2FSK,摒弃了2ASK与2PSK等调制解调方案,另一方面是因为2FSK适用于比特率较低的情况,估计本实验结果比特率在30b/s上下,其次经过实测发现2FSK信号在实验环境下抗噪性能好于更简单的2ASK方法,因此采用2FSK。2FSK的解调采用相干解调法。二号机接收到的信号为已调信号,该信号通过解调器再次与一个载波信号相乘,解调后的信号包含一个低频信号和一个高频成分,用一个低通滤波器把高频成分滤掉,就得到了要传递的基带信号。以上这个解调过程就是相干解调。若将接收到信号与自己直接相乘,就可以省去产生载波的过程。2FSK需要将接收到信号通过两个不同的带通滤波器将两个频率成分滤出来再分别进行相干解调,然后通过低通滤波器将滤波结果的基带信号取出。

三.实验过程及部分代码:

以下步骤为完成一个算式的发送与接收的流程。

P.s.   为便于说明,将产生算式显示结果的电脑称为‘一号机’,接收算式并发回结果的电脑称为‘二号机’。

一号机随机生成操作数在四位以下的算式,并对算式进行编码:

随机算式的产生分为在0-9999中随机生成两个操作数,再随机生成运算符,将它们转换为字符串数组拼接在一起得到一个9位字符串型算式。之后对算式进行BCD编码。

编写BCD码的过程代码如下:

BCD=zeros(1,36);                   Bak=[1 1 1 0 0 1 0];              for i=1:9j=4*(i-1)+1;if Ex(i)=='0'elseif Ex(i)=='1'                % 编码 转为BCD码 0~9分别对应二进制0000~1001 +-*/分别对应二进制1010~1011BCD(j+3)=1;elseif Ex(i)=='2'BCD(j+2)=1;elseif Ex(i)=='3'BCD(j+2)=1;BCD(j+3)=1;elseif Ex(i)=='4'BCD(j+1)=1;elseif Ex(i)=='5'BCD(j+1)=1;BCD(j+3)=1;elseif Ex(i)=='6'BCD(j+1)=1;BCD(j+2)=1;elseif Ex(i)=='7'BCD(j+1)=1;BCD(j+2)=1;BCD(j+3)=1;elseif Ex(i)=='8'BCD(j)=1;elseif Ex(i)=='9'BCD(j)=1;BCD(j+3)=1;elseif Ex(i)=='+'BCD(j)=1;BCD(j+2)=1;elseif Ex(i)=='-'BCD(j)=1;BCD(j+2)=1;BCD(j+3)=1;elseif Ex(i)=='*'BCD(j)=1;BCD(j+1)=1;elseif Ex(i)=='/'BCD(j)=1;BCD(j+1)=1;BCD(j+3)=1;endend
  • 一号机对产生的36位二进制数进行信道编码,并加上巴克码:

信道编码方法为(7,4)线性分组码。先定义了生成矩阵,易得到编码结果矩阵。同样二号机的信道解码部分使用同样的生成矩阵。

信道编码核心代码:

function C = hanming(M)G = [1 0 0 0 1 1 0;0 1 0 0 1 0 1;0 0 1 0 0 1 1;0 0 0 1 1 1 1];[k,n] = size(G);N = size(M,2);r = mod(-rem(N,k),k);M_add0 = [M,zeros(1,r)];groups = ceil(length(M_add0)/k);M_dis = reshape(M_add0,[k,groups]).';C = mod(M_dis*G,2);end

本段代码在给定输入序列时可以将其按四位进行分组,最后不足四位则补零,然后按给定生成矩阵进行编码。函数输出编码结果。

将BCD码进行分组信道编码后,在BCD码前加入巴克码,以便进行帧同步,核心代码:

BCD=hanming(BCD);BCD=BCD';BCD = reshape(BCD,1,63);BCD=[Bak BCD];

一号机对产生的72位二进制数进行2FSK调制。2FSK调制分别使用20Hz与100Hz的载波进行调制。先生成方波,对基带信号进行扩展,之后与余弦振荡相乘加在一起,即可调制完成。之后用sound函数发出去。

核心代码:

fs=800;   %抽样频率dt=1/fs;f1=20;     %定义两列载波的频率f2=100;a=BCD;g1=a;g2=~a;g11=(ones(1,800))'*g1;  %产生方波信号g1a=g11(:)';  g21=(ones(1,800))'*g2;g2a=g21(:)';t=0:dt:72-dt;t1=length(t);tuf1=cos(2*pi*f1.*t);tuf2=cos(2*pi*f2.*t);fsk1=g1a.*tuf1;fsk2=g2a.*tuf2;fsk=fsk1+fsk2;pause(0.3);%0.2sound(fsk,80000);  
  • 二号机进行录音,并解调:

使用audiorecorder对发出的信号进行录音,采样率80000,与1号机保持一致。计时发现发送信号的时间大概在1.3s,因此选择录音2s以便于识别。构建FIR滤波器将两个不同的频段滤出来进行相干解调,将自己与自己相乘得到相干结果,再通过滤波器将它们中我们所需的频段滤出来。之后对它每隔800个点抽一次样,与一号机保持一致。最后对于两路信号进行组合抽样判决,考虑到有背景噪声的问题,通过观察解调后曲线,通过多次测试设定阈值为0.75时可以得到正确的解调结果。

核心代码:

Receive=audiorecorder(80000,8,1);recordblocking(Receive,2);%1.6Receive = getaudiodata(Receive);Receive=abs(Receive);                          % 求绝对值方便以后识别1fsk=Receive;figure(1);subplot(221);stem(fsk);fs=800;   %抽样频率N=length(Receive)/fs;dt=1/fs;t=0:dt:N-dt;b1=fir1(101,[10/800 20/800]);b2=fir1(101,[90/800 110/800]);      %设置带宽参数H1=filter(b1,1,4*fsk);       %b1为分子1为分母sn为滤波器输入序列H2=filter(b2,1,4*fsk);       %噪声信号同时通过两个滤波器sw1=H1.*H1;                        %相干解调乘以同频同相的载波sw2=H2.*H2;%经过相乘器bn=fir1(101,[2/800 10/800]);             %经过低通滤波器st1=filter(bn,1,sw1);st2=filter(bn,1,sw2);for i=1:length(t)if(st1(i)>=st2(i))st(i)=0;else st(i)=st2(i);end  endst=st1+st2;st(size(st)+1)=st(size(st));subplot(222);stem(st);bfsk=zeros(1,N);for i=801:800:800*N+1j=fix(i/800);bfsk(j)=st(i);endfor i=1:length(bfsk)if(bfsk(i)>=0.75)bfsk(i)=1;else bfsk(i)=0;endend

经过解调后信号会变成0,1序列,对0,1序列进行后续处理与操作。

  • 二号机对解调后信息进行采样,并进行巴克码的检测:

检测巴克码可以靠遍历序列求相关来进行。但是因为设定门限值为7,也可以靠按位比对来进行,从而降低算法的复杂程度。

核心代码:

BCD2=zeros(1,80);for i=1:length(bfsk)-6if bfsk(i)==1if bfsk(i+1)==1if bfsk(i+2)==1if bfsk(i+3)==0if bfsk(i+4)==0if bfsk(i+5)==1if bfsk(i+6)==0break;endendendendendend   endendk=1;for j=i:i+71if i>length(bfsk)-72break;endBCD2(k)=bfsk(j);k=k+1;End

这里将帧同步后得到的带巴克码的72位二进制数存进数组。若发现巴克码的位置后面已经没有72个数字,这时直接中断写入数组,认为发送与接收同步失败。通过合理的同步策略,可以尽可能的降低出现这种问题的概率。

  • 二号机对检测到巴克码之后所找到的算式序列进行信道解码与信源解码,得到最终算式:

信道解码方法:

同样在已知生成矩阵的情况下,输入n*7的矩阵,输出结果为解码结果。同时,通过对于已知错误图样的定义,可以发现一位错码位置并进行纠正。

信道解码函数核心代码:

function C_result = decode1(R)G = [1 0 0 0 1 1 0;...0 1 0 0 1 0 1;...0 0 1 0 0 1 1;...0 0 0 1 1 1 1];[groups,lines] = size(R);[kk,n] = size(G);H = [G(:,kk+1:n).',eye(3)];S = mod(R*(H.'),2);[S_row,S_column] = size(S);SE = {[0 0 0],[0 0 0 0 0 0 0];...[0 0 1],[0 0 0 0 0 0 1];...[0 1 0],[0 0 0 0 0 1 0];...[1 0 0],[0 0 0 0 1 0 0];...[1 1 1],[0 0 0 1 0 0 0];...[0 1 1],[0 0 1 0 0 0 0];...[1 0 1],[0 1 0 0 0 0 0];...[1 1 0],[1 0 0 0 0 0 0]};C_result = zeros(S_row,n);[SE_row,SE_column] = size(SE);for m=1:S_rowfor n=1:SE_rowif all(S(m,:) == cell2mat(SE(n,1)))C_result(m,:) = R(m,:)+cell2mat(SE(n,2));C_result(m,:) = mod(C_result(m,:),2);endendendC_result = C_result(:,1:kk);end
  1. 之后对于输出36位二进制数进行信源解码即可,过程类似编码过程。核心代码较长,在此不进行展示,解码之后得到9位字符串组成的算式。
  2. 二号机将算出结果进行信源编码与信道编码,加帧同步码,之后用2FSK调制发送。这部分实现的方法同一号机信源编码,信道编码,2FSK发送过程。不同之处为二号机发送的信号为数字,没有符号位的信息。
  3. 一号机将收到信号解调,将运算结果解出来。

这个过程与二号机的接收过程类似,采用同样的方法进行接收,解调,信道解码,信源解码。区别在于因为硬件设备不同,导致解调过程中判决门限值不同。

  • 问题及解决方案:

关于硬件设备:

我们选择的耳机设备在收到连续的同频波时,强度会不断增高,在频率不停变化的时候,声波的强度是正常的。因此在实测阶段我们发现应该尽量避免发8位中连0数量超过5位的数字。为做到这一点,我们考虑过改变0的BCD码,但由于涉及整个信源编码较为复杂故改变方法,最终解决方案为将所有发送信号取反后发送即将‘0’信号和‘1’信号互换后发送。这样就可以避免0过多导致判断阈值难以设定的问题。

关于同步问题:

实验时发现两台电脑在用MATLAB控制录音机开始录音时,会有大约0.2秒的延迟。使用程序内tic toc计时,设定录音机录音时间为2秒,在循环的第一轮,会出现近0.7秒的延迟;后9轮中会出现0.2秒左右的延迟,另外发出声音的sound函数所占的时间不会被tic toc计入。因此最后的解决方案是对录音与发出信号的时间都取一个多次测试后证实不可超过的值,即发出信号控制在2.2秒,接收信号控制在2.8秒。控制方法代码为:

tic;toc;t=toc;pause(2.2-t);

通过这个方法把每一个来回的时间控制在5s,且录音录到含有信息的部分在整段的中央,易于解调与帧同步。

  • 实验结果:

一号机程序运行展示:

在最终测试中,完成10个算式的发送与接收共花费50s,平均一个算式5s,符合预期。比特率为28.8b/s,算式错误率约为2%,基本上出现在巴克码同步失败的情况。在背景随机噪声较大的情况下,错误率会提高,会出现数字与算式中某些位出错的问题。在确定高斯白噪声下,精准度可以由解调程序控制,较难被影响。

以下的部分介绍这个程序的用法。bcd2fsk.m作为1号机,产生算式并进行发送,接收结果并解调显示;fsk2bcd.m作为2号机,接收算式并解调计算,得到结果调制发送。程序在解调函数的地方要针对硬件进行调参,具体在:

for i=1:length(bfsk)if(bfsk(i)>=0.75)bfsk(i)=1;else bfsk(i)=0;endend

这个地方要根据耳机接收声音的强度来决定(1,2号机中均有这个部分),0.75为阈值,在接收端解调后做出的图上可以看出,0与1需要给定一个阈值进行判别。这个值因硬件不同有很大差别,需要反复调试才能得到最佳效果。程序使用时,1号机与2号机需同时开启,用于发声的耳机紧贴用于接收的耳机孔,两端同理。一般第一次使用这个程序会运行的很慢,所以第一次运行可以在发出声音/麦克风开始录制时直接切断程序。调试成功后上限大概在5s传输一个来回,正确率极高。这个框架也可以更高效的传输程序,目前的状态下发送与接收的净时间大概2.92秒,在同步上浪费时间较多;如果多个算式一起编码,可以省去同步时间得到更高的效率,当然也可以在编解码以及调制解调的地方继续优化以实现更高的速度。

资源指路:通信原理-基于声波传输的无线计算器的MATLAB实现-编解码文档类资源-CSDN下载

MATLAB无线计算器相关推荐

  1. matlab做计算器纯代码,**matlab GUI-纯编程实现简单计算器**

    作者:ERIC_崔浩 clear,clc,close all chang=65; str={'1' '2' '3' '+'; '4' '5' '6' '-'; '7' '8' '9' '*'; '0' ...

  2. MATLAB图形计算器去广告,多功能科学图形计算器(Mathlab)

    多功能科学图形计算器(Mathlab)是一款非常科学的集成代数图形计算器,是中小学生和大学生研究生,以及任何有复杂计算需求者必不可少的计算工具.设计这款软件的目的是取代笨重而昂贵的手持式计算器,并适用 ...

  3. MATLAB图形计算器去广告,Mathlab Pro安卓去谷歌版下载-Mathlab计算器安卓去广告版下载v4.11.114 手机版-西西软件下载...

    Mathlab计算器安卓精简版是一款强大的科学计算器应用,小到中小学,大到研究生,生活工作中,这款科学计算器都可以帮助你解决计算问题,而且还具有图形显示功能,有需求的朋友自然会了解并能用的上,本版本为 ...

  4. 无线传感网络定向扩散路由仿真matlab,无线传感网络(习题)精选.doc

    无线传感网络(习题)精选 无线传感网络习题 选择题:(20题) 下列不属于传感器网络三个基本要素的是 用户 B.使用者 C.感知对象 D.传感器 传感器网络的基本功能是 A.主动式感知 B.数据删减 ...

  5. MATLAB中计算器的设立,怎样用MATLAB中的GUI做一个简单计算器

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function varargout = jisuanqi(varargin) gui_Singleton = 1; gui_State = struct ...

  6. matlab 分数计算器,Matlab节点导纳矩阵计算.doc

    第一章 导纳矩阵的计算简介 1.1变压器的∏型等值电路 在电力系统潮流计算中,往往要计算节点导纳矩阵,而我们计算节点导纳矩阵采用节点电压法来实现,如在变压统 图1双绕组变压电 如果采用标计参数应归时标 ...

  7. 基于MATLAB的GUI设计简易计算器

    MATLAB语言基于GUI设计简易计算器 GUI界面的设置 主页----新建----应用程序----GUIDE 进入下图所示界面 点击确定,即可生成GUI设计界面. 设计计算器界面,放置按键和显示屏, ...

  8. matlab有意思程序,matlab有意思的小程序

    10个C++趣味小程序,很有意思的.VIP专享文档 VIP专享文档是百度文库认... 现在很多人使用微信的时间已经非常长了,他们注册的微信号往上可能已经是5年前的事情了,正是由于不少使用者在这个过程当 ...

  9. 【Machine Learning 四】设置机器学习可用的Matlab编程分配环境

    访问MATLAB在线并上传编程练习文件 在课程期间,MathWorks将为机器学习学生提供对MATLAB Online的访问.MATLAB Online是MATLAB桌面程序的在线版本.它在基于Web ...

最新文章

  1. 深度学习模型轻量化(下)
  2. 干货丨机器学习指南(学习笔记哦,值得一看)
  3. DataTable的Compute方法和Expression语法
  4. Rk3288运行linux,查看“Firefly-rk3288 build linux”的源代码
  5. python将学号与成绩匹配_用Python运维网络(1):基础知识
  6. dll修改和EXCOPE
  7. Caffe环境搭建指北
  8. 三菱mode bus tcp通讯_邢台三菱MR-J4-200B4
  9. CodeForces914 D.Bash and a Tough Math Puzzle(线段树)
  10. deepin V20.2版本安装MySQL
  11. 昂达 v891 v1 终于 删除 windows 分区 并且恢复了容量。
  12. mob做php短信接口,【PHP】短信接口(正则匹配)
  13. PS如何使用自定义画笔
  14. mysql3306端口被占用无法终止_Mysql3306端口被占用无法启动解决办法.doc
  15. mapbox-gl中的web墨卡托转换
  16. iOS6和iOS7代码的适配(2)——status bar
  17. RichEdit的用法总结
  18. python爬虫破解百度文库_用Python爬取百度文库0下载券的免费文档详细步骤,附可执行软件...
  19. 保护眼睛的颜色#CCE8CF
  20. 中国联通和中国电信措手不及,中国移动主动发起5G流量价格战

热门文章

  1. javabean/Listjavabean与map/Listmap互相转换
  2. 怎样一次性删掉word或wps文档里的空格行
  3. 操作系统 - Lightdm
  4. 【012】SylixOS嵌入式实时操作系统助力中国航天事业
  5. WhatsApp API介绍
  6. Ashen的成长,从CSDN博客开始!
  7. php程序root权限,root权限是什么
  8. 二值化及伽马调整的函数
  9. NLP 中文同义词 反义词 否定词表
  10. 「DLP-KDD 2021征文」及上届论文全集,包含深度学习推荐/广告系统、多目标、模型服务等