function fdet_eval(f_true, knoise_dB, numFrames) fs = 48000; N = 1024; K = numFrames; phi_true = 1; % Adaption rate mu = 20.0; % Generate signal x_true = exp(j*(2*pi*f_true/fs*(0:K*N-1)'+phi_true)) + sqrt(10^(knoise_dB/10))*randn(K*N,1); % Initial guess X = fft(x_true, N); [v maxk] = max(abs(X)); f_est = (maxk-1)*fs/N; % * (1+angle(X(maxk))) for k=1:K xp = x_true((k-1)*N+1:k*N); phi_est = angle(xp(1)); x_est = exp(-j*(2*pi*f_est/fs*(0:N-1)'+phi_est)); dmod(k) = sum(xp.*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; phi(k) = phi_est; end; f_true = f_true f_est = f_est mean_fest = mean(f(K/2+1:K)) error_ppm = 1E6*(1-mean_fest/f_true) close all; subplot(4,1,1) plot(1:lge(f), 1-real(dmod)./abs(dmod), 1:lge(f), imag(dmod)./abs(dmod), 1:lge(f), real(dmod)./abs(dmod)); grid; subplot(4,1,2) plot(1:lge(f), err, '-*'); grid; subplot(4,1,3) plot(1:lge(f), f); grid; subplot(4,1,4) plot(1:lge(f), angle(dmod)); grid;