function fdet_eval(f_true, knoise_dB) fs = 48000; N = 1024; phi_true = 1; x_true = exp(j*(2*pi*f_true/fs*(0:N-1)'+phi_true)) + sqrt(10^(knoise_dB/10))*randn(N,1); % Initial guess X = fft(x_true, N); [v maxk] = max(abs(X)); f_est = (maxk-1)*fs/N phi_est = angle(x_true(1)); mu = 1.0; for k=1:500 x_est = exp(-j*(2*pi*f_est/fs*(0:N-1)'+phi_est)); dmod(k) = sum(x_true.*x_est); err(k) = sign(imag(dmod(k)))*(1-real(dmod(k)/abs(dmod(k))))^.5; f_est = f_est + mu*err(k); f(k) = f_est; end; f_true = f_true f_est = f_est close all; subplot(3,1,1) plot(1:lge(f), 1-real(dmod)./abs(dmod), 1:lge(f), imag(dmod)./abs(dmod)); grid; subplot(3,1,2) plot(1:lge(f), err, '-*'); grid; subplot(3,1,3) plot(1:lge(f), f); grid;