From bddaaee2d5c49e80cc6b40b9721e40677969634d Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 5 Apr 2015 14:07:25 +0000 Subject: [PATCH] - auto compensate cyclic prefix git-svn-id: http://moon:8086/svn/matlab/trunk@25 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/fdet.m | 9 ++++----- ofdm/fdet_wav.m | 30 +++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/ofdm/fdet.m b/ofdm/fdet.m index eca070d..bd5a1ed 100644 --- a/ofdm/fdet.m +++ b/ofdm/fdet.m @@ -1,8 +1,7 @@ -function [omega, err, dmod, omega_coarse, omega_est] = fdet(x, N, Ng, omega_min, omega_step, omega_max) +function [omega, err, dmod, omega_coarse, omega_est] = fdet(x, N, Ng, off, omega_min, omega_step, omega_max) % -% Example: fdet_eval(1200, pi/4, -10, [1100 1350 1]) -K = fix(length(x-Ng)/(N+Ng)); +K = fix((length(x)-Ng)/(N+Ng))-1; % Initial guess omega_coarse = fdet_coarse(x, N, omega_min, omega_step, omega_max); @@ -10,12 +9,12 @@ omega_coarse = fdet_coarse(x, N, omega_min, omega_step, omega_max); phi_est = 0; omega_est = omega_coarse; -off = 0; for k=1:K omega(k) = omega_est; xp = x((k-1)*(N+Ng)+off+1:k*(N+Ng)+off); x_est = exp(-j*(2*pi*omega_est*(0:N-1)' + phi_est)); - dmod(k) = sum(xp(Ng+1:N+Ng).*x_est); + iq = xp(Ng+1:N+Ng).*x_est; + dmod(k) = sum(iq); phi = angle(dmod(k)); omega_f = phi/N/(2*pi); err(k) = omega_f; diff --git a/ofdm/fdet_wav.m b/ofdm/fdet_wav.m index 933e692..06e2f90 100644 --- a/ofdm/fdet_wav.m +++ b/ofdm/fdet_wav.m @@ -28,21 +28,41 @@ else x = xwav.*exp(-j*(2*pi*fc/fs*(0:len-1)')); end +fprintf('Perform frequency correction\n'); x = x.*exp(j*(2*pi*foff/fs*(0:len-1)')); -[omega, err, dmod, omega_coarse, omega_est] = fdet(x, N, Ng, omega_min, omega_step, omega_max); + +% Remove cyclic prefix +fprintf('Perform CP calculation\n'); +x0 = x(1:2*(N+Ng)); +x1 = x(N+Ng+1:3*(N+Ng)); + +c = xcorr(x0, x1); +[v, ii] = max(abs(c)); +cp_off = mod(ii, Ng+N) + +% Detect CFO +fprintf('Perform frequency detection\n'); +[omega, err, dmod, omega_coarse, omega_est] = fdet(x, N, Ng, cp_off, omega_min, omega_step, omega_max); f_coarse = omega_coarse*fs f_est = omega_est*fs close all; -subplot(4,1,1) + +plot(abs(c)); grid; +figure; + +subplot(5,1,1) plot(1:lge(omega), real(dmod)/N, 1:lge(omega), imag(dmod)/N, 1:lge(omega), abs(dmod)/N); grid; legend('Re', 'Im', 'abs()'); -subplot(4,1,2) +subplot(5,1,2) plot(1:lge(omega), err*fs, '-'); grid; legend('error'); -subplot(4,1,3) +subplot(5,1,3) plot(1:lge(omega), omega*fs); grid; legend('f'); -subplot(4,1,4) +subplot(5,1,4) plot(1:lge(omega), angle(dmod), '-', 1:lge(omega), diff(angle([0 dmod])), 'r-'); grid; legend('phi', 'dphi'); + +subplot(5,1,5) +plot(1:lge(omega), abs(dmod)/N - real(dmod)/N, '-'); grid; legend('diff');