将从键盘输入的任何数据,通过dec2bin函数将其转换为二进制流之后通过2ASK调制,再通过sound函数将其通过pc自带的蜂鸣器发声,最后保存为声音文件。
clear all
clc
%***************由键盘输入文本文件并转化为bit信号********
% 获取字符进行二进制编码
user_input = input('>', 's');
x = user_input;
% 将字符转换为二进制编码
mess = dec2bin(user_input, 7);
bitstream = [];
% 将字符二进制编码转换为比特流
for i = 1:length(user_input())
for k = 1:7
bitstream = [bitstream double(mess(i, k))-48];
end
end
a = bitstream;
len = length(bitstream);
t = 0:0.01:(len-0.01);
m = a(ceil(t+0.01));
%**************2ASK调制(OOK-通断键控)***************
%2ASK调制:S2ASK = m(t)*cos(wc*t)=m(t)*cos(2*pi*f*t)
%m(t)为数字信号,后者为载波
% 调制基带信号
fc=4000; %载波频率
fs=80000; %采样频率
ts=0:1/fs:(100*len-1)/fs;
tzxh1=cos(2*pi*fc*ts);%载波
ask = m.*tzxh1;%得到2ASK调制后的信号,采用点乘是因为矩阵元素相乘
startbit = [1 1 1 1];%开始标志码
stopbit = [0 1 1 0];%结束标志码
ask = [startbit ask stopbit];
for i = 1:1:100
sound(ask, fs); %发声
end
audiowrite('ask.wav',ask,fs); %保存为声音文件
也可以读取声音文件:
[sig,fs]=audioread('ask.wav');
将声音文件读取出来,并通过相关解调,抽样判决,还原原本的文本输入:
sig1=sig';
sig2=sig1(1,5:(len*100+4));
% 2ASK相干解调
[b11,a11]=ellip(5,0.5,60,[2000,6000]*2/80000);%带通椭圆滤波器设计
e_ask1=filter(b11,a11,sig2);
e_ask2=2*e_ask1.*tzxh1*2;%相乘器
[b12,a12]=ellip(5,0.5,60,1000*2/80000); %低通滤波器设计
ask_xgjt=filter(b12,a12,e_ask2); %相干解调后,抽样判决前的结果
% 2ASK的相干解调法的抽样判决结果与原数据比较
for i=0:(len-1)
if ask_xgjt(1,(i+1)*100)>0.5
ask_hyjt(i*100+1:i*100+100)=ones(1,100);
else
ask_hyjt(i*100+1:i*100+100)=zeros(1,100);
end
end
ask_hyjt=[ask_hyjt ask_hyjt(1,length(ask_hyjt)-1)];
output=[];
for q=0:1:((length(ask_hyjt)-1)/7/100-1)
row = [];
for k = 0:6
% 将7位比特转化为一个字符串
row = [row int2str(ask_hyjt(1,q*700+100*k+1))];
% 转化为ascii编码
incoming = bin2dec(row);
% 转为字符
received_message = char(incoming);
end
output=[output received_message];
end
PS:这是参考后理解的代码,并非全部原创编写代码。