function [noise, targ, filter, SNR, delay, filters] = find_in_mix(dmix, ... dclean, srmix, Tfilt) % [noise, targ, filter, SNR, delay] = find_in_mix(dmix, dclean, srmix) % dmix consists of a filtered version of dclean with added % noise. Use best linear fit to return the noise without the % clean signal, the filtered (and slightly time-warped) version of clean % that best fits it, and the filter that can be applied to the clean % signal to make it match what was in the mix, and the overall % SNR this implies for the mixture. % 2011-02-10 Dan Ellis dpwe@ee.columbia.edu % find best skew (up to half a second) skewmaxsec = 2.5; %skewmaxsec = 0.5; mixdelay = find_skew(dclean, dmix, round(skewmaxsec*srmix)); delay = mixdelay/srmix; if nargin < 4 %Tfilt = 0.020; % duration of FIR filter Tfilt = 0.040; % duration of FIR filter end Lfilt = round(Tfilt*srmix); Tpre = 0.005; % how much to allow before peak Lpre = round(Tpre*srmix); %disp(['skewmaxsec=',num2str(skewmaxsec),' Tfilt=',num2str(Tfilt)]); skew = -mixdelay - Lpre; % align signals if skew > 0 % mix is delayed relative to clean, so chop off its start dmix = dmix((skew+1):end); else % clean is actually delayed relative to mix, so chop off its start dclean = dclean((1-skew):end); end % % make files same length % dlen = min(length(dmix),length(dclean)); % dmax = dmax(1:dlen); % dclean = dclean(1:dlen); %Twin = 1.0; % match on 2 sec blocks Twin = 0.5; % match on 2 sec blocks Lwin = round(Twin*srmix); [targ, noise, filters, Es] = decomp_lin_win(dmix, dclean, Lfilt, Lwin); %% Choose just one filter to return; the "median" %fnorms = sum(filters.^2); %% sort the norms and take the middle one %[vv,xx] = sort(fnorms); %bestf = xx(round(length(xx)/2)); % No, take the filter from the frame where the excitation had the % most energy [biggestE, bestf] = max(Es); filter = filters(:,bestf); % figure the SNR by finding the "active level" of signal and noise siglevel = activlev(targ, srmix); noiselevel = activlev(noise, srmix); SNR = 10 * log10(siglevel/noiselevel);