www.pudn.com > aec_回音消除.rar > corr2292.m
% 噪声系列1
%%%%%x = [3,11,7,0,-1,4,2];
%%%%%nx =[-3:3];
load r.txt;
load r1.txt;
load echo.txt;
%pro(1:length(echo)) = round(1000*echo(1:length(echo)));
pro(1:length(echo)) = 1*echo(1:length(echo));
framelength = 160; %%%%%每帧(20ms)共160点
number1 = 123; %%%%%总帧数
number2 = 10; %%%%%时延帧数,或搜索帧数范围(number2,number3-k);number2:最大时延帧数
number3 = 6; %%%%%number3:最小时延帧数
k = 2; %%%%%求相关系数的帧数
per1 = 1; %%%%%从echo中取初始帧的移动的最小单位= 1/per1帧
per2 = 4; %%%%%从r中搜索最大相关系数的最小单位= 1/per2帧
a = 0.8;
b = 0.5;%%%%%b = 0.22;
c = 0.3;%%%%%c = 0.18;
attenuation_powerfactor = (27/17); %%%%%((number2-(number2-k))/k) --> 1/{[(2/3)^2+1+(2/3)^2)]/3]}=27/17;(9/10.5)^2 = 0.74
attenuation_absfactor = 0.5; %(9/7); %%%%% 1/[(2/3+1+2/3)/3] = 9/7
xgxs_1 = zeros(2,2);
xgxs = zeros(number1*per1,number2*per2);
opt = zeros(2,number1*per2);
opt(1,1) = 0;
opt(1,2) = 0;
aver_power_x2 = zeros(1,number2*per2);
aver_power_y2 = zeros(1,number1*per1-number2*per1);
x_pre2f = zeros(1,(number2-number3+k)*framelength);
effectcount = 0;
count = 0;
far_power_1 = 2;
far_power_2 = 4;
percent_factor = 1/2;
ratio_factor = 0.1;
for i=((number2)*per1):(number1*per1)
y = echo((i)*framelength/per1+1:(i)*framelength/per1+k*framelength);
ny = [1:k*framelength];
y1 = abs(y);
aver_power_y1(i) = mean(y1);
y2 = (y.^2);
aver_power_y2(i) = mean(y2);
x_pre2f = r((i)*framelength/per1+1-number2*framelength:(i)*framelength/per1+k*framelength-number3*framelength);
x1_pre2f = abs(x_pre2f);
aver_power_x1(i) = mean(x1_pre2f);
%for (ii=1:(number2-number3+k))
% count(ii) =
% (max(size(find(r((i)*framelength/per1+1-number2*framelength+(ii-1)*framelength:(i)*framelength/per1+1-number2*framelength+ii*framelength) > far_power))));
%end
%effectcount = max(size(find(x1_pre2f > far_power_1)));
x1_pre2f_2 = x1_pre2f(x1_pre2f > far_power_1);
%count = max(size(find((x_pre2f > percent_factor * max(x_pre2f))&(x_pre2f > far_power_1))));
%count = max(size(find(x_pre2f > far_power_2)));
x2_pre2f = (x_pre2f.^2);
aver_power_x2(i) = mean(x2_pre2f);
%if ((aver_power_x1(i) < max(aver_power_x1(i)))&(aver_power_y2(i) < (aver_power_x2(i) * attenuation_powerfactor)))
%if ((max(count) > 0.08 * framelength )&(aver_power_y2(i) < (aver_power_x2(i) * attenuation_powerfactor)))
%if ((aver_power_y2(i) < (aver_power_x2(i) * attenuation_powerfactor)))
%if (count > ratio_factor * effectcount)
%if ((count > ratio_factor * effectcount)&(aver_power_y2(i) < (aver_power_x2(i) * attenuation_powerfactor)))
if (((sum(x1_pre2f_2)/max(size(x1_pre2f_2))) > ratio_factor * max(x1_pre2f_2) )&(aver_power_y2(i) < (aver_power_x2(i) * attenuation_powerfactor)))
pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+k*framelength) = zeros(1,k*framelength);
else
%y_max(i) = max(y);
for j= 1 :number2*per2
x = r((i)*framelength/per1+1-number2*framelength+j*framelength/per2:(i)*framelength/per1-number2*framelength+j*framelength/per2+k*framelength);
nx = [1:k*framelength];
%%%%%if (max(y)>0.3)
%x1 = (x.^2);
%aver_power_x(j-(i - number2)*per2) = mean(x1);
%x_max(j-(i - number2)*per2) = max(x);
if (max(y)>0.3)
if ((max(x)==0)|(max(y)==0))
xgxs(i,j) = 0;
else
xgxs_1 = corrcoef(x,y);
xgxs(i,j) = xgxs_1(2,1);
end
else
xgxs(i,j) = 0;
end
end
opt(1,i) = max(xgxs(i,:));
opt(2,i) = i - rem(min(find(xgxs(i,:)==max(xgxs(i,:)))),number1*per2);
%x1 = (x.^2)';
%y1 = (y.^2)';
%if ((opt(1,i) > 0.08) & (cumsum(y1) < cumsum(x1)))
%if ((opt(1,i) > a)|(aver_power_y(i) < (max(aver_power_x) * attenuation_factor)))
%if ((opt(1,i) > a))
%if ((opt(1,i) > a)|(y_max(i) < (max(x_max) * attenuation_factor)))
if ((opt(1,i) > a))
%pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+k*framelength) = zeros(1,k*framelength);
%pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength) = (pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength)).^(0.3);
%for k =1:framelength
% if (pro((i-1)*framelength/per1+k) > mean(pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength)))
% pro((i-1)*framelength/per1+k) = mean(pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength));
% end
%end
%pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength) = (1000*(pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength))).^(0.3)/100;
%pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength) = zeros(1,framelength);
%%%%%else if ((opt(1,i) > b) & (opt(1,i-1) > b) & (opt(1,i-2) > b) & (i > 3))
else if ((opt(1,i) > b) & (opt(1,i-1) > b))
%pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength) = pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength)/10;
pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+k*framelength) = zeros(1,k*framelength);
else if ((opt(1,i) > c) & (opt(1,i-1) > c) & (opt(1,i-2) > c))
%pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength) = pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+framelength)/10;
%pro((i-1)*framelength/per1+1:(i-1)*framelength/per1+k*framelength) = zeros(1,k*framelength);
end
end
end
end
end
figure(3);
%subplot(411),plot(r),title('r');axis([0, 40000, -10, 10]);
%subplot(412),plot(r1),title('r1');axis([0, 40000, -10, 10]);
%subplot(413),plot(echo),title('echo');axis([0, 40000, -10, 10]);
%subplot(414),plot(pro),title('filter');axis([0, 40000,-10, 10]);
subplot(411),plot(r),title('r');
subplot(412),plot(r1),title('r1');
subplot(413),plot(echo),title('echo');
subplot(414),plot(pro),title('filter');
filter = 1000*pro';
auwrite(filter,8000,16,'linear','filter');
%auwrite(echo,8000,16,'linear','echo');
%format long;
save filter.txt filter -ascii -double;
save pro.txt pro -ascii -double;
%save filter.txt filter -ascii;
%save filter.txt filter;
%for i=1:length(pro)
% filter(2*i-1) = rem(pro(i),256);
% filter(2*i) = fix(pro(i)/256);
%end
%save filter.dat filter -ascii;
%opt(2,i) = fix(find(xgxs(i,:)==opt(1,i)),number1*per);
%opt(2,i) = fix(find(xgxs(i,:)==opt(1,i))/(number1*per))-i;
%i -rem(find(xgxs(i,:)==max(xgxs(i,:))),number1*per);
%opt(2,8) = 8 - rem(find(xgxs(8,:)==opt(1,8)),number1*per);
%opt(1,8) = max(xgxs(8,:));
% opt(2,8) = rem(find(xgxs(8,:)==opt(1,8)),number1*per);
% opt(1,16) = max(xgxs(16,:));
% opt(2,16) = rem(find(xgxs(16,:)==opt(1,16)),number1*per);
% opt(1,25) = max(xgxs(25,:));
% opt(2,25) = rem(find(xgxs(25,:)==opt(1,25)),number1*per);
%%%%%[y,ny] = sigshift(x, nx, 2);
%%%%%w = randn(1, length(y));
%%%%%nw = ny;
%%%%%[y, ny] = sigadd(y, ny, w, nw);