samer@32: function o=mag_phase_split(N) samer@32: % mag_phase_split - arrow to get FFT and do mag/phase split samer@32: % samer@32: % mag_phase_split :: samer@32: % N:natural ~'frame size' samer@32: % -> arrow( {[[N,L]]}, {[[M,L]], [[M,L]]},empty) :- M=dftbins(N). samer@32: samer@32: bins=1+floor(N/2); samer@32: singles=1:ceil(N/2):bins; samer@32: o=arr(@mps); samer@32: samer@32: function [S,P]=mps(X) samer@32: Y=fft(X,N); samer@32: Z=Y(1:bins,:); samer@32: M=abs(Z); samer@32: P=Z./M; % get complex phases of components. samer@32: S=M*sqrt(2/N); % sqrt of double of total power per band samer@32: S(singles,:)=S(singles,:)/sqrt(2); % undo double counting of singletons samer@32: end samer@32: end samer@32: