995dcb610c
Took the opportunity to undo the Godot changed made to the
opus source. The opus module should eventually be built in its
own environment to avoid polluting others with too many include
dirs and defines.
TODO: Fix the platform/ stuff for opus.
(cherry picked from commit d9a291f641
)
speex module was only added while cherry-picking, as speex is removed
in the master branch but we don't want to break compatibility in 2.1.x.
Unbundling wasn't done as the module uses the internal speex_free,
so it would require some more work.
72 lines
2 KiB
Matlab
72 lines
2 KiB
Matlab
% Attempts to diagnose AEC problems from recorded samples
|
|
%
|
|
% out = echo_diagnostic(rec_file, play_file, out_file, tail_length)
|
|
%
|
|
% Computes the full matrix inversion to cancel echo from the
|
|
% recording 'rec_file' using the far end signal 'play_file' using
|
|
% a filter length of 'tail_length'. The output is saved to 'out_file'.
|
|
function out = echo_diagnostic(rec_file, play_file, out_file, tail_length)
|
|
|
|
F=fopen(rec_file,'rb');
|
|
rec=fread(F,Inf,'short');
|
|
fclose (F);
|
|
F=fopen(play_file,'rb');
|
|
play=fread(F,Inf,'short');
|
|
fclose (F);
|
|
|
|
rec = [rec; zeros(1024,1)];
|
|
play = [play; zeros(1024,1)];
|
|
|
|
N = length(rec);
|
|
corr = real(ifft(fft(rec).*conj(fft(play))));
|
|
acorr = real(ifft(fft(play).*conj(fft(play))));
|
|
|
|
[a,b] = max(corr);
|
|
|
|
if b > N/2
|
|
b = b-N;
|
|
end
|
|
printf ("Far end to near end delay is %d samples\n", b);
|
|
if (b > .3*tail_length)
|
|
printf ('This is too much delay, try delaying the far-end signal a bit\n');
|
|
else if (b < 0)
|
|
printf ('You have a negative delay, the echo canceller has no chance to cancel anything!\n');
|
|
else
|
|
printf ('Delay looks OK.\n');
|
|
end
|
|
end
|
|
end
|
|
N2 = round(N/2);
|
|
corr1 = real(ifft(fft(rec(1:N2)).*conj(fft(play(1:N2)))));
|
|
corr2 = real(ifft(fft(rec(N2+1:end)).*conj(fft(play(N2+1:end)))));
|
|
|
|
[a,b1] = max(corr1);
|
|
if b1 > N2/2
|
|
b1 = b1-N2;
|
|
end
|
|
[a,b2] = max(corr2);
|
|
if b2 > N2/2
|
|
b2 = b2-N2;
|
|
end
|
|
drift = (b1-b2)/N2;
|
|
printf ('Drift estimate is %f%% (%d samples)\n', 100*drift, b1-b2);
|
|
if abs(b1-b2) < 10
|
|
printf ('A drift of a few (+-10) samples is normal.\n');
|
|
else
|
|
if abs(b1-b2) < 30
|
|
printf ('There may be (not sure) excessive clock drift. Is the capture and playback done on the same soundcard?\n');
|
|
else
|
|
printf ('Your clock is drifting! No way the AEC will be able to do anything with that. Most likely, you''re doing capture and playback from two different cards.\n');
|
|
end
|
|
end
|
|
end
|
|
acorr(1) = .001+1.00001*acorr(1);
|
|
AtA = toeplitz(acorr(1:tail_length));
|
|
bb = corr(1:tail_length);
|
|
h = AtA\bb;
|
|
|
|
out = (rec - filter(h, 1, play));
|
|
|
|
F=fopen(out_file,'w');
|
|
fwrite(F,out,'short');
|
|
fclose (F);
|