MATLAB实现键盘输入转换为声音文件,读取之后解调还原

将从键盘输入的任何数据,通过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:这是参考后理解的代码,并非全部原创编写代码。

原创文章 37 获赞 5 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yolandalt7777777/article/details/88170643
今日推荐