annotate ddm_fft.m @ 4:72c011ed1977 tip

more elaborate example with non-stat. estimate explanation
author smusevic
date Tue, 30 Jul 2013 09:56:27 +0100
parents a4a7e3405062
children
rev   line source
dan@0 1 function [dg rs] = ddm_fft(R,w, w_d, mf_ders,sig, N, N_fft,fs)
dan@0 2 % multi-frequency distribution derivative based non-stationary sinusoidal estimator
dan@0 3 % can estimate only 1 sinusoid at the once
dan@0 4 %
dan@0 5 %
dan@0 6 % [1] Michael Betser: Sinusoidal Polynomial Estimation Using The Distribution
dan@0 7 % Derivative, in IEEE Transactions on Signal Processing, Vol.57, Nr. 12,
dan@0 8 % December 2009
dan@0 9 %
dan@0 10 % krnls: matrix of all the kernels... N x R x K, where R is the number of
dan@0 11 % non-static parameters to estimate and at the same time, the number
dan@0 12 % of kernels for each sinusoid, K
dan@0 13 %
dan@0 14 % krlns_ders: matrix of all the kernel time derivatives... N x R x K , where R
dan@0 15 % is the number of non-static parameters to estimate and at the same
dan@0 16 % time, the number of kernels
dan@0 17 %
dan@0 18 % mf_ders: matrix of all the model function time derivatives... N x Q , where Q
dan@0 19 % is the number of model functions
dan@0 20 %
dan@0 21 %
dan@0 22 % sig: vector - signal, N x 1 (CAUTION: MUST be column vector!!!)
dan@0 23 %
dan@0 24 % N: odd integer - signal buffer length, ...
dan@0 25 %
dan@0 26 % K: number of sinusoids to estimate - NOT OVERLAPPING!!!
dan@0 27 %
dan@0 28 % For any reasonable use, Q equals R, otherwise it makes little sense.
dan@0 29 % Kernels must include the window function...
dan@0 30
dan@0 31
dan@0 32 Q = size(mf_ders,2);
dan@0 33
dan@0 34 [A_,b_,As, bs] = ddm_lin_sys_fft(R, size(mf_ders, 2), w, w_d, mf_ders, sig, N, N_fft, fs);
dan@0 35 %[A, b] = ddm_lin_sys(krnls, krlns_ders, mf_ders, sig, N); % generate the linear system of eqs (slow)
dan@0 36 %dg2 = lin_solve_dgr_3(A,b,1); %hardcoded degree 2 solver (fast)
dan@0 37 dg = zeros(Q,N_fft-R+1);
dan@0 38 rs = zeros(1,N_fft-R+1);
dan@0 39 for k = 1:N_fft-R+1
dan@0 40 A = As(:,:,k);
dan@0 41 b = bs(:,k);
dan@0 42 Asq = A.'*A;
dan@0 43 rs(k) = rcond(Asq);
dan@0 44 dg(:,k) = inv(Asq)*A.'*b;
dan@0 45 end