%yong 12 9
re=1;
while re
Receive=wavrecord(40000,20000); % 接收信号 接收时间尽量长 防止失步 采样频率20kHz
bp=fir1(48,[0.4,0.6]);
Receive=filter(bp,1,Receive); % 带通滤波
% plot(Receive);
Receive=abs(Receive); % 求绝对值方便以后识别1
counter=0;
Positive=zeros(1,20000);
% plot(Receive);
for i=1:40000
if Receive(i)>0.15 % 门限判定
Receive(i)=1;
else
Receive(i)=0;
end
end
% plot(Receive);
BCD2=zeros(1,50);
i=1;
while Receive(i)<0.5 && i<30000 % 寻找码的第一位 因为加了巴克码 第一位必为1
i=i+1;
end
m=1;
disp(i);
for j=i:100:39901 % 找到第一位后 开始解出二进制码
Sum=0;
for l=j:j+99
Sum=Sum+Receive(l);
end
disp(Sum);
if Sum>35 % 根据100个扩展点求和判定是否为1
BCD2(m)=1;
else
BCD2(m)=0;
end
m=m+1;
end
% plot(BCD2);
% disp(BCD2);
Bak=[1 1 1 -1 -1 1 -1];
Head=2*BCD2(1:7)-1; % 0转-1
if sum(Head.*Bak)==7 % 判定巴克码
re=0;
else
disp('未找到巴克码');
% return;
end
end
Begin=7;
NumberA=0;
NumberB=0;
for j=1:4 % 将BCD码译为十进制数 解出两个操作数
i=(j-1)*4+1;
if BCD2(Begin+i)==0
if BCD2(Begin+i+1)==0
if BCD2(Begin+i+2)==0
if BCD2(Begin+i+3)==0
NumberA=NumberA+0;
elseif BCD2(Begin+i+3)==1
NumberA=NumberA+1*10^(4-j);
end
elseif BCD2(Begin+i+2)==1
if BCD2(Begin+i+3)==0
NumberA=NumberA+2*10^(4-j);
elseif BCD2(Begin+i+3)==1
NumberA=NumberA+3*10^(4-j);
end
end
elseif BCD2(Begin+i+1)==1
if BCD2(Begin+i+2)==0
if BCD2(Begin+i+3)==0
NumberA=NumberA+4*10^(4-j);
elseif BCD2(Begin+i+3)==1
NumberA=NumberA+5*10^(4-j);
end
elseif BCD2(Begin+i+2)==1
if BCD2(Begin+i+3)==0
NumberA=NumberA+6*10^(4-j);
elseif BCD2(Begin+i+3)==1
NumberA=NumberA+7*10^(4-j);
end
end
end
elseif BCD2(Begin+i)==1
if BCD2(Begin+i+1)==0
if BCD2(Begin+i+2)==0
if BCD2(Begin+i+3)==0
NumberA=NumberA+8*10^(4-j);
elseif BCD2(Begin+i+3)==1
NumberA=NumberA+9*10^(4-j);
end
end
end
end
end
for j=6:9
i=(j-1)*4+1;
if BCD2(Begin+i)==0
if BCD2(Begin+i+1)==0
if BCD2(Begin+i+2)==0
if BCD2(Begin+i+3)==0
NumberB=NumberB+0;
elseif BCD2(Begin+i+3)==1
NumberB=NumberB+1*10^(9-j);
end
elseif BCD2(Begin+i+2)==1
if BCD2(Begin+i+3)==0
NumberB=NumberB+2*10^(9-j);
elseif BCD2(Begin+i+3)==1
NumberB=NumberB+3*10^(9-j);
end
end
elseif BCD2(Begin+i+1)==1
if BCD2(Begin+i+2)==0
if BCD2(Begin+i+3)==0
NumberB=NumberB+4*10^(9-j);
elseif BCD2(Begin+i+3)==1
NumberB=NumberB+5*10^(9-j);
end
elseif BCD2(Begin+i+2)==1
if BCD2(Begin+i+3)==0
NumberB=NumberB+6*10^(9-j);
elseif BCD2(Begin+i+3)==1
NumberB=NumberB+7*10^(9-j);
end
end
end
elseif BCD2(Begin+i)==1
if BCD2(Begin+i+1)==0
if BCD2(Begin+i+2)==0
if BCD2(Begin+i+3)==0
NumberB=NumberB+8*10^(9-j);
elseif BCD2(Begin+i+3)==1
NumberB=NumberB+9*10^(9-j);
end
end
end
end
end
disp(NumberA);
Result=0;
if BCD2(Begin+17)==1 && BCD2(Begin+18)==0 && BCD2(Begin+19)==1 && BCD2(Begin+20)==0 % 根据符号位情况判定何种运算
Result=NumberA+NumberB;
disp('+');
elseif BCD2(Begin+17)==1 && BCD2(Begin+18)==0 && BCD2(Begin+19)==1 && BCD2(Begin+20)==1
Result=NumberA-NumberB;
disp('-');
elseif BCD2(Begin+17)==1 && BCD2(Begin+18)==1 && BCD2(Begin+19)==0 && BCD2(Begin+20)==0
Result=NumberA*NumberB;
disp('*');
elseif BCD2(Begin+17)==1 && BCD2(Begin+18)==1 && BCD2(Begin+19)==0 && BCD2(Begin+20)==1
Result=fix(NumberA/NumberB);
disp('/');
else
Result=NumberA+NumberB;
disp('+');
end
disp(NumberB);
disp('=');
disp(Result);
Ex=zeros(1,8);
for i=1:8 % 将十进制数的每一位取出 以便之后转为BCD码
Ex(9-i)=mod(Result,10);
% disp(Ex(9-i));
Result=fix(Result/10);
end
BCD=zeros(1,32); % BCD是将八位字符串转成32位(每个字符4位)二进制码的矩阵
Bak=[1 1 1 0 0 1 0]; % 加巴克码
BCD=[Bak BCD];
for i=1:8
j=4*(i-1)+8;
if Ex(i)==0
elseif Ex(i)==1 % 转BCD码 0~9分别对应二进制0000~1001
BCD(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;
end
end
% disp(BCD);
BCD=[BCD 1 1];
disp(BCD);
Send=zeros(1,4100);
Carry=zeros(1,4100);
Mdlt=zeros(1,4100);
for i=1:41
for j=(i-1)*100+1:i*100
Send(j)=BCD(i);
end
end
for i=1:4100
Carry(i)=sin(i*pi/2);
Mdlt(i)=Send(i)*Carry(i);
end
%plot(Mdlt);
while 1
tic
Z0=zeros(1,3900);
wavplay(Z0,20000);
wavplay(Mdlt,20000);
toc
end