annotate dsp/powspec.m @ 61:eff6bddf82e3 tip

Finally implemented perceptual brightness thing.
author samer
date Sun, 11 Oct 2015 10:20:42 +0100
parents c3b0cd708782
children
rev   line source
samer@32 1 function [S,F]=powspec(X,N)
samer@32 2 % powspec - power spectra of columns of x
samer@32 3 %
samer@32 4 % powspec ::
samer@32 5 % [[K,L]] ~'sequence of L K-point signal frames',
samer@32 6 % N:natural ~'optional size of FFT (defaults to K)'
samer@32 7 % -> [[M,L]] ~'sequence of L M-point power spectra, M=dftbins(N)',
samer@32 8 % [[M]] ~'normalised centre frequencies for each spectral bin'.
samer@32 9 %
samer@32 10 % This function is careful to account for the energy in the original
samer@32 11 % signal properly: we return the total energy in the signal in each
samer@32 12 % band of the DFT such that sum(powspec(x))/4 = sum(x.^2).
samer@32 13 % Don't ask about the 4 - I don't know why it's in there. It just is
samer@32 14 % NB. this is not strictly the power spectral *density* because
samer@32 15 % when N is even, first and last bands, the singleton bands, are
samer@32 16 % half as wide as the others.
samer@32 17
samer@32 18 if nargin<2, N=size(X,1); end
samer@32 19
samer@32 20 select=1:(1+floor(N/2)); % non-redundant bands
samer@32 21 singles=1:ceil(N/2):select(end); % bands which don't come in pairs
samer@32 22 Y=fft(X,N);
samer@32 23 S=(8/N)*abs(Y(select,:)).^2; % power in selected bands
samer@32 24 S(singles,:)=S(singles,:)/2; % undo double counting of singleton bands
samer@32 25 if nargout>1, F=(select-1)/N; end % normalised centre frequencies
samer@32 26