function time_decryption(audio) %audio读取图片所在的目录
l=123;y1=0.5;d=0.324;d2=0.312;q=0.43; %l表示选取的点的位置应小于等于m,y1从0-1取值,d从0-0.5取值,q从0-0.5
[P,Fs]=audioread(audio);%读取音频数据
if Fs==44100
P=P(1:2:length(P));%下采样,采样率下降一半
Fs=Fs/2;
end
nbits=16;%精度为16bits
[m,n]=size(P);%获得时域音频大小
a=zeros(1,201);%预先分配a空间
a(1)=((l+1)*y1/256);%获取初始值
for i=1:200
a(i+1)=F(a(i),d);%调用函数进行迭代,防止瞬过现象
end
x=zeros(1,m*n);%预先分配x空间
x(1)=F(a(201),d); %针对1的情况获取之前迭代后的值
clear a; %清除a值
for i=1:(m*n-1)
x(i+1)=F(x(i),d); %其余情况进行迭代处理
end
x=[x(1:l-1) x(l+1:end)]; %固定l处值的位置,暂时不进行复制处理,其余值转换到x1中
[~,I]=sort(x); %对x1进行排序,并获得I
clear x;
for i=1:m*n-1
if(I(i)<l)
I(i)=I(i);
else
I(i)=I(i)+1;
end
end %由于l位有加入数据,则对应索引位大于l的都需要+1
I1=[I(1:l-1) l I(l:end)]; %将排序索引中第l位加入进去
w=length(I1); %获取I1行向量长度
for i=1:w
I2(I1(i))=i;
end
P1=P;
% P1=digiterr(P1,nbits,0.1);%模拟误码
a(1)=d2;%设定z的初始值
for i=1:200
a(i+1)=GG(a(i),q);%调用函数进行迭代,防止瞬过现象
end
z(1)=a(201);
for i=1:m*n-1
z(i+1)=GG(z(i),q);
end
z=adjust(z); %取得三位有效数字作为一三位数
P1=P1./z'; %除以z以恢复
P1=P1(I2); %此处部分可以获得解密时的索引I2,之后转化P2显示即可
%
audiowrite('echo_de_decryption.wav',P1,Fs); %保存解密后数据
% audiowrite('voice1.wav',P1,Fs);
function Y=T(z,d) %这部分为分段函数,具体参照论文,d的取值由用户输入
if(z>=0&&z<d)
Y=double(z/d);
end
if(z>=d&&z<=0.5)
Y=double((z-d)/0.5-d);
end
if(z>0.5&&z<(1.0-d))
Y=double((1.0-z-d)/(0.5-d));
end
if(z>(1-d)&&z<=1)
Y=double((1.0-z)/d);
end
function y1=q(x) %函数q(x)
y1=4.0*x^3-6.0*x^2+3.0*x;
function y2 = p(x) %q(x)的反函数
y2=0.5+0.5*nthroot(2.0*x-1,3);
function A = F(x,d) %F(x)函数
A=p(T(q(x),d));
if(A<0)
A=-A;
end
function y=GG(x,q) %对应论文中G(z)的部分
if(x>=0&&x<=q)
y=x/q;
else
y=(1-x)/(1-q);
end
function y=adjust(x)
y=zeros(1,length(x));
for i=1:length(x)
for j=3:30
if x(i)*10^j>100
y(i)=round(x(i)*10^j)/1000;
break;
end
end
end