Mercurial > hg > nimfks
comparison src/matlab/ifgram.m @ 0:c52bc3e8d3ad tip
user: boblsturm
branch 'default'
added README.md
added assets/.DS_Store
added assets/playButton.jpg
added assets/stopButton.png
added assets/swapButton.jpg
added data/.DS_Store
added data/fiveoctaves.mp3
added data/glock2.wav
added data/sinScale.mp3
added data/speech_female.mp3
added data/sweep.wav
added nimfks.m.lnk
added src/.DS_Store
added src/matlab/.DS_Store
added src/matlab/AnalysisCache.m
added src/matlab/CSS.m
added src/matlab/DataHash.m
added src/matlab/ExistsInCache.m
added src/matlab/KLDivCost.m
added src/matlab/LoadFromCache.m
added src/matlab/SA_B_NMF.m
added src/matlab/SaveInCache.m
added src/matlab/Sound.m
added src/matlab/SynthesisCache.m
added src/matlab/chromagram_E.m
added src/matlab/chromagram_IF.m
added src/matlab/chromagram_P.m
added src/matlab/chromsynth.m
added src/matlab/computeSTFTFeat.m
added src/matlab/controller.m
added src/matlab/decibelSliderReleaseCallback.m
added src/matlab/drawClickCallBack.m
added src/matlab/fft2chromamx.m
added src/matlab/hz2octs.m
added src/matlab/ifgram.m
added src/matlab/ifptrack.m
added src/matlab/istft.m
added src/matlab/nimfks.fig
added src/matlab/nimfks.m
added src/matlab/nmfFn.m
added src/matlab/nmf_beta.m
added src/matlab/nmf_divergence.m
added src/matlab/nmf_euclidean.m
added src/matlab/prune_corpus.m
added src/matlab/rot_kernel.m
added src/matlab/templateAdditionResynth.m
added src/matlab/templateDelCb.m
added src/matlab/templateScrollCb.m
| author | boblsturm | 
|---|---|
| date | Sun, 18 Jun 2017 06:26:13 -0400 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| -1:000000000000 | 0:c52bc3e8d3ad | 
|---|---|
| 1 function [F,D] = ifgram(X, N, W, H, SR) | |
| 2 % [F,D] = ifgram(X, N, W, H, SR) Instantaneous frequency by phase deriv. | |
| 3 % X is a 1-D signal. Process with N-point FFTs applying a W-point | |
| 4 % window, stepping by H points; return (N/2)+1 channels with the | |
| 5 % instantaneous frequency (as a proportion of the sampling rate) | |
| 6 % obtained as the time-derivative of the phase of the complex spectrum | |
| 7 % as described by Toshihiro Abe et al in ICASSP'95, Eurospeech'97 | |
| 8 % Same arguments and some common code as dpwebox/stft.m. | |
| 9 % Calculates regular STFT as side effect - returned in D. | |
| 10 % after 1998may02 dpwe@icsi.berkeley.edu | |
| 11 % 2001-03-05 dpwe@ee.columbia.edu revised version | |
| 12 % 2001-12-13 dpwe@ee.columbia.edu Fixed to work when N != W | |
| 13 % $Header: $ | |
| 14 | |
| 15 % Copyright (c) 2006 Columbia University. | |
| 16 % | |
| 17 % This file is part of LabROSA-coversongID | |
| 18 % | |
| 19 % LabROSA-coversongID is free software; you can redistribute it and/or modify | |
| 20 % it under the terms of the GNU General Public License version 2 as | |
| 21 % published by the Free Software Foundation. | |
| 22 % | |
| 23 % LabROSA-coversongID is distributed in the hope that it will be useful, but | |
| 24 % WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 25 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 26 % General Public License for more details. | |
| 27 % | |
| 28 % You should have received a copy of the GNU General Public License | |
| 29 % along with LabROSA-coversongID; if not, write to the Free Software | |
| 30 % Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | |
| 31 % 02110-1301 USA | |
| 32 % | |
| 33 % See the file "COPYING" for the text of the license. | |
| 34 | |
| 35 if nargin < 2; N = 256; end | |
| 36 if nargin < 3; W = N; end | |
| 37 if nargin < 4; H = W/2; end | |
| 38 if nargin < 5; SR = 1; end | |
| 39 | |
| 40 s = length(X); | |
| 41 % Make sure it's a single row | |
| 42 if size(X,1) > 1 | |
| 43 X = X'; | |
| 44 end | |
| 45 | |
| 46 %win = [0,hanning(W-1)']; | |
| 47 win = 0.5*(1-cos([0:(W-1)]/W*2*pi)); | |
| 48 | |
| 49 % Window for discrete differentiation | |
| 50 T = W/SR; | |
| 51 dwin = -pi / T * sin([0:(W-1)]/W*2*pi); | |
| 52 | |
| 53 % sum(win) takes out integration due to window, 2 compensates for neg frq | |
| 54 norm = 2/sum(win); | |
| 55 | |
| 56 % How many complete windows? | |
| 57 nhops = 1 + floor((s - W)/H); | |
| 58 | |
| 59 F = zeros(1 + N/2, nhops); | |
| 60 D = zeros(1 + N/2, nhops); | |
| 61 | |
| 62 nmw1 = floor( (N-W)/2 ); | |
| 63 nmw2 = N-W - nmw1; | |
| 64 | |
| 65 ww = 2*pi*[0:(N-1)]*SR/N; | |
| 66 | |
| 67 for h = 1:nhops | |
| 68 u = X((h-1)*H + [1:W]); | |
| 69 % if(h==0) | |
| 70 % plot(u) | |
| 71 % end | |
| 72 % Apply windows now, while the length is right | |
| 73 wu = win.*u; | |
| 74 du = dwin.*u; | |
| 75 | |
| 76 % Pad or truncate samples if N != W | |
| 77 if N > W | |
| 78 wu = [zeros(1,nmw1),wu,zeros(1,nmw2)]; | |
| 79 du = [zeros(1,nmw1),du,zeros(1,nmw2)]; | |
| 80 end | |
| 81 if N < W | |
| 82 wu = wu(-nmw1+[1:N]); | |
| 83 du = du(-nmw1+[1:N]); | |
| 84 end | |
| 85 % FFTs of straight samples plus differential-weighted ones | |
| 86 t1 = fft(fftshift(du)); | |
| 87 t2 = fft(fftshift(wu)); | |
| 88 % Scale down to factor out length & window effects | |
| 89 D(:,h) = t2(1:(1 + N/2))'*norm; | |
| 90 | |
| 91 % Calculate instantaneous frequency from phase of differential spectrum | |
| 92 t = t1 + j*(ww.*t2); | |
| 93 a = real(t2); | |
| 94 b = imag(t2); | |
| 95 da = real(t); | |
| 96 db = imag(t); | |
| 97 instf = (1/(2*pi))*(a.*db - b.*da)./((a.*a + b.*b)+(abs(t2)==0)); | |
| 98 % 1/2pi converts rad/s into cycles/s | |
| 99 % sampling rate already factored in as constant in dwin & ww | |
| 100 % so result is in Hz | |
| 101 | |
| 102 F(:,h) = instf(1:(1 + N/2))'; | |
| 103 | |
| 104 end; | |
| 105 | 
