資源簡介
webrtc中的AEC算法的matlab解釋和轉碼,我在別人的基礎上完善了一下。注意附帶的兩個pcm數據是浮點+大端
代碼片段和文件信息
%?Partitioned?block?frequency?domain?adaptive?filtering?NLMS?and
%?standard?time-domain?sample-based?NLMS
%near?is?micphone?captured?signal
fid=fopen(‘near.pcm‘?‘rb‘);?%?Load?far?end
ssin=fread(fidinf‘float32‘);
fclose(fid);
%far?is?speaker?played?music
fid=fopen(‘far.pcm‘?‘rb‘);?%?Load?fnear?end
rrin=fread(fidinf‘float32‘);
fclose(fid);
rand(‘state‘13);
fs=16000;
mult=fs/8000;
if?fs?==?8000
cohRange?=?2:3;
elseif?fs==16000
cohRange?=?2;
end
%?Flags
NLPon=1;?%?NLP?on
CNon=0;?%?Comfort?noise?on
PLTon=0;?%?Plotting?on
M?=?16;?%?Number?of?partitions
N?=?64;?%?Partition?length
L?=?M*N;?%?Filter?length
if?fs?==?8000
????mufb?=?0.6;
else
????mufb?=?0.8;
end
VADtd=48;
alp?=?0.15;?%?Power?estimation?factor
alc?=?0.1;?%?Coherence?estimation?factor
beta?=?0.9;?%?Plotting?factor
%%?Changed?a?little?%%
step?=?0.1875;%0.1875;?%?Downward?step?size
%%
if?fs?==?8000
????threshold=2e-6;?%?DTrob?threshold
else
????%threshold=0.7e-6;
????threshold=1.5e-6;
end
if?fs?==?8000
????echoBandRange?=?ceil(300*2/fs*N):floor(1800*2/fs*N);
else
????echoBandRange?=?ceil(60*2/fs*N):floor(1500*2/fs*N);
end
suppState?=?1;
transCtr?=?0;
Nt=1;
vt=1;
ramp?=?1.0003;?%?Upward?ramp
rampd?=?0.999;?%?Downward?ramp
cvt?=?20;?%?Subband?VAD?threshold;
nnthres?=?20;?%?Noise?threshold
shh=logspace(-1.3-2.2N+1)‘;
sh=[shh;flipud(shh(2:end-1))];?%?Suppression?profile
len=length(ssin);
w=zeros(L1);?%?Sample-based?TD(time?domain)?NLMS
WFb=zeros(N+1M);?%?Block-based?FD(frequency?domain)?NLMS
WFbOld=zeros(N+1M);?%?Block-based?FD?NLMS
YFb=zeros(N+1M);
erfb=zeros(len1);
erfb3=zeros(len1);
ercn=zeros(len1);
zm=zeros(N1);
XFm=zeros(N+1M);
YFm=zeros(N+1M);
pn0=10*ones(N+11);
pn=zeros(N+11);
NN=len;
Nb=floor(NN/N)-M;
erifb=zeros(Nb+11)+0.1;
erifb3=zeros(Nb+11)+0.1;
ericn=zeros(Nb+11)+0.1;
dri=zeros(Nb+11)+0.1;
start=1;
xo=zeros(N1);
do=xo;
eo=xo;
echoBands=zeros(Nb+11);
cohxdAvg=zeros(Nb+11);
cohxdSlow=zeros(Nb+1N+1);
cohedSlow=zeros(Nb+1N+1);
%overdriveM=zeros(Nb+1N+1);
cohxdFastAvg=zeros(Nb+11);
cohxdAvgBad=zeros(Nb+11);
cohedAvg=zeros(Nb+11);
cohedFastAvg=zeros(Nb+11);
hnledAvg=zeros(Nb+11);
hnlxdAvg=zeros(Nb+11);
ovrdV=zeros(Nb+11);
dIdxV=zeros(Nb+11);
SLxV=zeros(Nb+11);
hnlSortQV=zeros(Nb+11);
hnlPrefAvgV=zeros(Nb+11);
mutInfAvg=zeros(Nb+11);
%overdrive=zeros(Nb+11);
hnled?=?zeros(N+1?1);
weight=zeros(N+11);
hnlMax?=?zeros(N+1?1);
hnl?=?zeros(N+1?1);
overdrive?=?ones(1?N+1);
xfwm=zeros(N+1M);
dfm=zeros(N+1M);
WFbD=ones(N+11);
fbSupp?=?0;
hnlLocalMin?=?1;
cohxdLocalMin?=?1;
hnlLocalMinV=zeros(Nb+11);
cohxdLocalMinV=zeros(Nb+11);
hnlMinV=zeros(Nb+11);
dkEnV=zeros(Nb+11);
ekEnV=zeros(Nb+11);
ovrd?=?2;
ovrdPos?=?floor((N+1)/4);
ovrdSm?=?2;
hnlMin?=?1;
minCtr?=?0;
SeMin?=?0;
SdMin?=?0;
SeLocalAvg?=?0;
SeMinSm?=?0;
divergeFact?=?1;
dIdx?=?1;
hnlMinCtr?=?0;
hnlNewMin?=?0;
divergeState?=?0;
Sy=ones(N+11);
Sym=1e7*ones(N+11);
wins=[0;sqrt(hanning(2*N-1))];
ubufn=zeros(2*N1);
ebuf=zeros(2*N1);
ebuf2=zeros(2*N1);
ebuf4=zeros(2*N1);
mbuf
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????9632000??2018-04-10?01:57??webrtc_aec\far.pcm
?????文件????9632000??2018-04-10?01:57??webrtc_aec\near.pcm
?????文件??????26468??2018-04-10?01:57??webrtc_aec\webrtc_aec.m
?????目錄??????????0??2018-10-12?16:27??webrtc_aec
-----------?---------??----------?-----??----
?????????????19290468????????????????????4
評論
共有 條評論