主程序如下:
clear all
clc
%原波形x
%预处理x1
%二进制语音信号x2
%加密语音信号x3
%加密语音信号转置x4
%解密语音信号x5
%解密语音信号转置x6
%%
fs=8000;%语音信号采样频率为8000
x=audioread('s.wav');
t=(0:length(x)-1)/8000;
Y=fft(x,2048);%对信号做2048点FFT变换
f=fs*(0:1023)/2048;
figure(1)
subplot(2,1,1);
plot(t,x)%做原始语音信号的时域图形
grid on;
axis tight;
title('原始语音信号');
xlabel('time(s)');
ylabel('幅度');
subplot(2,1,2);
plot(f,abs(Y(1:1024)))%做原始语音信号的FFT频谱图
grid on;
axis tight;
title('原始语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');
%sound(x)
%预处理语音信号(原始信号扩大10000倍)
x1=ceil(1000*x(:,2));
Y1=fft(x1,2048);
figure(2)
subplot(2,1,1);
plot(t,x1)%预处理语音信号的时域图形
grid on;
axis tight;
title('预处理语音信号');
xlabel('time(s)');
ylabel('幅度');
subplot(2,1,2);
plot(f,abs(Y1(1:1024)))%预处理语音信号的FFT频谱图
grid on;
axis tight;
title('预处理语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');
%%
x2=dec_to_bin(x1);%将语音信号由10进制转化为2进制
%利用Logistic混沌映射,对语音信号进行加密
k1=0.3;u1=3.7;k2=0.6;u2=3.9;%设置初始值,即密匙
z1=k1;z2=k2;
for m=1:80%迭代80次,达到充分混沌状态
z1=u1*z1*(1-z1);
end
for n=1:90%迭代90次,达到充分混沌状态
z2=u2*z2*(1-z2);
end
a(1)=z1;
b(1)=z2;
%产生一维混沌加密序列
for i=1:length(x)-1
a(i+1)=u1*a(i)*(1-a(i));
b(i+1)=u2*b(i)*(1-b(i));
end
A=zeros(length(x),1);
for j=1:length(x)
if(a(j)>b(j))
k=1;
else
k=0;
end
A(j)=k;
end
B=dec_to_bin(A);
x3=bitxor(bin2dec(x2),bin2dec(B));%异或操作加密,得到密文
x4=bin_to_dec(dec2bin(x3));
Y4=fft(x4,2048);
figure(3)
subplot(2,1,1);
plot(t,x4)%加密语音信号的时域图形
grid on;
axis tight;
title('加密语音信号');
xlabel('time(s)');
ylabel('幅度');
subplot(2,1,2);
plot(f,abs(Y4(1:1024)))%加密语音信号的FFT频谱图
grid on;
axis tight;
title('加密语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');
%%
%输入密码,与密文做异或解出明文
k1=0.3;u1=3.7;k2=0.6;u2=3.9;
k11=0.3;k22=0.6;u11=3.7;u22=3.9;
z11=k11;z22=k22;
for m=1:80%迭代80次,达到充分混沌状态
z11=u11*z11*(1-z11);
end
for n=1:90%迭代90次,达到充分混沌状态
z22=u22*z22*(1-z22);
end
aa(1)=z11;
bb(1)=z22;
%产生一维混沌加密序列
for i=1:length(x)-1
aa(i+1)=u1*aa(i)*(1-aa(i));
bb(i+1)=u2*bb(i)*(1-bb(i));
end
AA=zeros(length(x),1);
for j=1:length(x)
if(aa(j)>bb(j))
k=1;
else
k=0;
end
AA(j)=k;
end
BB=dec_to_bin(AA);
x5=bitxor(x3,bin2dec(BB));
x6=bin_to_dec(dec2bin(x5));
Y6=fft(x6,2048);
figure(4)
subplot(2,1,1);
plot(t,x6)%解码语音信号的时域图形
grid on;
axis tight;
title('解码语音信号');
xlabel('time(s)');
ylabel('幅度');
subplot(2,1,2);
plot(f,abs(Y6(1:1024)))%解码语音信号的FFT频谱图
grid on;
axis tight;
title('解码语音信号FFT频谱')
xlabel('Hz');
ylabel('幅度');
%sound(x)%原始语音信号试听
%sound(x1)%预处理语音信号试听
%sound(x4)%加密语音信号试听
%sound(x6)%解密语音信号试听
有两个函数:
function wavB=dec_to_bin(wavA)
wavB=num2bin(quantizer([8 0]),wavA);
end
function wavB=bin_to_dec(wavA)
wavB=bin2num(quantizer([8 0]),wavA);
end
得到解码数组和加密数组相同是怎么回事?