dan@0
|
1 % a high-level function for computing a DTFT based DDM
|
dan@0
|
2 % (constructs the linear system of equations using distribution derivative rule and solves it via
|
dan@0
|
3 % pseudo-inverse (pinv). Use this function if non-Fourier kernels are needed or
|
dan@0
|
4 % DTFT at specific frequency rather than FFT is required for whatever reason...
|
dan@0
|
5 % no zero-padding is used internally
|
dan@0
|
6 function [gdi,r, A,b, gdi_lns, r_lns] = ddm_gen(krnls, krlns_ders, mf_ders, sig, N, tol)
|
dan@0
|
7 %generic multi-frequency distribution derivative based estimator for
|
dan@0
|
8 % non-stationary sinusoidal analysis
|
dan@0
|
9 %
|
dan@0
|
10 %
|
dan@0
|
11 % [1] Michael Betser: Sinusoidal Polynomial Estimation Using The Distribution
|
dan@0
|
12 % Derivative, in IEEE Transactions on Signal Processing, Vol.57, Nr. 12,
|
dan@0
|
13 % December 2009
|
dan@0
|
14 %
|
dan@0
|
15 % krnls: matrix of all the kernels... N x R , where R is the number of
|
dan@0
|
16 % non-static parameters to estimate and at the same time, the number
|
dan@0
|
17 % of kernels
|
dan@0
|
18 %
|
dan@0
|
19 % krlns_ders: matrix of all the kernel time derivatives... N x R , where R
|
dan@0
|
20 % is the number of non-static parameters to estimate and at the same
|
dan@0
|
21 % time, the number of kernels
|
dan@0
|
22 %
|
dan@0
|
23 % mf_ders: matrix of all the model function time derivatives... N x Q , where Q
|
dan@0
|
24 % is the number of model functions
|
dan@0
|
25 %
|
dan@0
|
26 %
|
dan@0
|
27 % sig: vector - signal, N x 1 (CAUTION: MUST be column vector!!!)
|
dan@0
|
28 %
|
dan@0
|
29 % N: odd integer - signal buffer length, ...
|
dan@0
|
30 %
|
dan@0
|
31 % For any reasonable use, Q equals R, otherwise it makes little sense.
|
dan@0
|
32 % Kernels must include the window function...
|
dan@0
|
33
|
dan@0
|
34 [A,b] = ddm_lin_sys(krnls, krlns_ders, mf_ders, sig, N);
|
dan@0
|
35
|
dan@0
|
36 % solving via pinv with provided tolerance
|
dan@0
|
37 gdi = pinv(A,tol) * b;
|
dan@0
|
38 % r = rcond(A);
|
dan@0
|
39 % [gdi_lns r_lns] = linsolve(A,b);
|
dan@0
|
40 end |