Mercurial > hg > pmhd
view extra/stft_peak.m @ 13:844d341cf643 tip
Back up before ISMIR
author | Yading Song <yading.song@eecs.qmul.ac.uk> |
---|---|
date | Thu, 31 Oct 2013 13:17:06 +0000 |
parents | 6840f77b83aa |
children |
line wrap: on
line source
function X = stft_peak(x, w, N, H, threshold) % Analysis/synthesis of a sound using the short-time fourier transform % x: input sound, % w: analysis window (odd number of samples required) % N: FFT size, % H: hop size % y: output sound lengthx = length(x); % length of sound signal w = w/sum(w); % normalize window W = length(w); % window size (odd) W2 = (W-1)/2; % half window N2 = N/2+1; % half FFT size p_start = 1+W2; % first frame pointer p_end = lengthx-W2; % last frame pointer fft_buffer = zeros(N,1); % FFT buffer for g=p_start:H:p_end % advance hop size each loop % ANALYSIS xw = w(1:W)'.*x(g-W2:g+W2); % multiply window by input frame fft_buffer(1:W2+1) = xw(W2+1:W); % adjust buffer for zero-phase computation fft_buffer(N-W2+1:N) = xw(1:W2); X = fft(fft_buffer); % FFT of current buffer mX = 20*log10(abs(X(1:N2))); % magnitude spectrum pX = unwrap(angle(X(1:N2))); % phase spectrum (unwrapped) ploc = 1+find((mX(2:N2-1)>threshold).*(mX(2:N2-1)>mX(3:N2)).*(mX(2:N2-1)>mX(1:N2-2))); pmag = mX(ploc); pphase = pX(ploc); plength = length(ploc); if(mod((g-p_start)/H+1,(floor(p_end/H/5)))==0) % select only 5 equally distributed frames of the sound figure subplot(2,1,1) plot(mX) % plot magnitude and phase spectrums hold on plot(ploc(1:plength),pmag(1:plength),'xr'); % add peaks to the plot xlim([1 N2]) ylim([-80 0]) title('Magnitude spectrum of frame') ylabel('Magnitude spectrum (dB)') xlabel('Frequency (rad)') display(['Peak positions: ' num2str(ploc')]); hold off subplot(2,1,2) plot(pX) % same with the phase hold on plot(ploc(1:plength),pphase(1:plength),'xr'); xlim([1 N2]) % ylim([-pi pi]) % pause() hold off end end