⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fconv.m

📁 A MATLAB tool for analysis of Transient Otoacoustic Emission signals
💻 M
字号:
function c = fconv(a, b)

%	c = fconv(a, b)
%
%	fconv	calculates the convolution of vectors a and b.
%
%   in:	a,b	vectors, polynomial coefficients, impulse responses etc.
%
%  out:	c	convolution of a and b

% (c) Heimo Ihalainen 25.7.1988 (14.2.1989 HI) (3.6.1989 HI) (23.8.1989 HI)
% (1.10.1989 HI new stb)
% (c) Timo Pyy 1.6.1989 (overlap-add)

% fconv uses FFT to achieve greater speed.

[na,n1] = size(a); ta = 0; if n1>na; a = a.'; na = n1; ta = 1; end
[nb,n1] = size(b); tb = 0; if n1>nb; b = b.'; nb = n1; tb = 1; end
t = ta; if nb>na; t = tb; end; nc = na+nb-1;
if t==0; c = zeros(nc,1); else c = zeros(1,nc); end; nm = min(na,nb);
%
if nm<100;					% direct without FFT
  if na>nb; c(:) = filter(b,1,[a;zeros(nc-na,1)]);
  else      c(:) = filter(a,1,[b;zeros(nc-nb,1)]);
  end
else; nf = 2^ceil(log(nc)/log(2)-10*eps);	% use FFT
  if (nm/nc>0.4)|(nc/nf>0.8)&(nf<4097)		% straight method
    cc = conj(fft(conj(fft([a;zeros(nf-na,1)]).*fft([b;zeros(nf-nb,1)]))));
  else						% overlap-add
    if na>=nb; nf = 2^ceil(log(nb)/log(2)+1-10*eps);
      B = fft([b;zeros(nf-nb,1)]); a(na+nf) = 0; cc = zeros(na+nf,1);
      inc = nf-nb; ina = 1:inc; ind = 1:nf; wc =zeros(nf,1); z = zeros(nb,1); 
      for i=1:ceil(na/inc);
	wc(:) = conj(fft(conj(fft([a(ina);z]).*B))); cc(ind) = cc(ind)+wc;
	ind(:) = ind+inc; ina(:) = ina+inc;
      end
    elseif nb>na; nf = 2^ceil(log(na)/log(2)+1-10*eps);
      A = fft([a;zeros(nf-na,1)]); b(nb+nf) = 0; cc = zeros(nb+nf,1);
      inc = nf-na; inb = 1:inc; ind = 1:nf; wc =zeros(nf,1); z = zeros(na,1);
      for i=1:ceil(nb/inc);
	wc(:) = conj(fft(conj(fft([b(inb);z]).*A))); cc(ind) = cc(ind)+wc;
	ind(:) = ind+inc; inb(:) = inb+inc;
      end
    end
  end
  if any(imag(a))|any(imag(b)); c(:) = cc(1:nc)/nf;
  else c(:) = real(cc(1:nc))/nf;
  end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -