Advertisement
neo01124

f0detection

Nov 14th, 2011
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.52 KB | None | 0 0
  1. function y = sinemodel(x, w, N, t, fs)
  2. % Authors: J. Bonada, X. Serra, X. Amatriain, A. Loscos
  3. % Analysis/synthesis of a sound using the sinusoidal model
  4. % x: input sound, w: analysis window (odd size), N: FFT size,  
  5. % t: threshold in negative dB, y: output sound
  6. %
  7. %--------------------------------------------------------------------------
  8. % This source code is provided without any warranties as published in
  9. % DAFX book 2nd edition, copyright Wiley & Sons 2011, available at
  10. % http://www.dafx.de. It may be used for educational purposes and not
  11. % for commercial applications without further permission.
  12. %--------------------------------------------------------------------------
  13.  
  14. M = length(w);                                % analysis window size
  15. Ns= 1024;                                     % FFT size for synthesis (even)
  16. H = 256;                                      % analysis/synthesishop size
  17. N2= N/2+1;                                    % size of positive spectrum
  18. soundlength = length(x);                      % length of input sound array
  19. hNs = Ns/2;                                   % half synthesis window size
  20. hM = (M-1)/2;                                 % half analysis window size
  21. pin = max(H+1,1+hM); % initialize sound pointer to middle of analysis window
  22. pend = soundlength-max(H,hM);                 % last sample to start a frame
  23. fftbuffer = zeros(N,1);                       % initialize buffer for FFT
  24. y = zeros(soundlength,1);                       % initialize output array
  25. w = w/sum(w);                                 % normalize analysis window
  26. sw = zeros(Ns,1);
  27. ow = triang(2*H-1);                           % overlapping window
  28. ovidx = Ns/2+1-H+1:Ns/2+H;                    % overlap indexes
  29. sw(ovidx) = ow(1:2*H-1);
  30. bh = blackmanharris(Ns);                      % synthesis window
  31. bh = bh ./ sum(bh);                           % normalize synthesis window
  32. sw(ovidx) = sw(ovidx) ./ bh(ovidx);
  33. k = [0:1:N];
  34. freq = fs*k/N;
  35. minf0 = 100;
  36. maxf0 = 1200;
  37. ef0max = 100;
  38. % while pin<pend
  39.   %-----analysis-----%
  40.   xw = x(pin-hM:pin+hM).*w(1:M);              % window the input sound
  41.   fftbuffer(:) = 0;                           % reset buffer
  42.   fftbuffer(1:(M+1)/2) = xw((M+1)/2:M);       % zero-phase window in fftbuffer
  43.   fftbuffer(N-(M-1)/2+1:N) = xw(1:(M-1)/2);
  44.   X = fft(fftbuffer);                              % compute the FFT
  45.   mX = 20*log10(abs(X(1:N2)));    % magnitude spectrum of positive frequencies
  46.   pX = unwrap(angle(X(1:N/2+1)));                  % unwrapped phase spectrum
  47.   ploc = 1 + find((mX(2:N2-1)>t) .* (mX(2:N2-1)>mX(3:N2)) ...
  48.                   .* (mX(2:N2-1)>mX(1:N2-2)));     % find peaks
  49.   [ploc,pmag,pphase] = peakinterp(mX,pX,ploc);     % refine peak values
  50.   f0 = f0detection(mX, fs, ploc, pmag, ef0max, minf0, maxf0);
  51.   f0yin = f0detectionyin(x, fs, 1000, minf0, maxf0) ;
  52.   f0
  53.   f0yin
  54.   subplot(2,1,1);
  55.   plot(freq(1:N2),mX);
  56.   hold on;
  57.   plot(fs*ploc/N,pmag,'rX');
  58.   plot(f0,mX(round(f0*N/fs)),'b*');
  59.   plot(f0yin,mX(round(f0yin*N/fs)),'g*');
  60.   hold off;
  61. %   subplot(2,1,2);
  62. %   plot(f0,mX(round(f0*N/fs)),'X');
  63. %   %-----synthesis-----%
  64. %   plocs = (ploc-1)*Ns/N;             % adapt peak locations to synthesis FFT
  65. %   Y = genspecsines(plocs,pmag,pphase,Ns);          % generate spec sines
  66. %   yw = fftshift(real(ifft(Y)));                    % time domain of sinusoids
  67. %   %(pin-hNs:pin+hNs-1)
  68. %   y(pin-hNs:pin+hNs-1) = y(pin-hNs:pin+hNs-1) + sw.*yw(1:Ns);    % overlap-add
  69. %   pin  = pin+H;                                    % advance the sound pointer    
  70. end
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement