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
|