From 7e89f89dd5697ffaba2e621624ef47177ac7b7f5 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 5 Apr 2015 09:02:10 +0000 Subject: [PATCH] - removed fs from fdet_coarse - fdet_eval and fdet_wav use fdet - ofdm_tx has additional parameter withData git-svn-id: http://moon:8086/svn/matlab/trunk@20 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/fdet_coarse.m | 10 +++++----- ofdm/fdet_eval.m | 37 +++++++++++-------------------------- ofdm/ofdm_tx.m | 8 ++++---- 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/ofdm/fdet_coarse.m b/ofdm/fdet_coarse.m index 28812ed..68e86f7 100644 --- a/ofdm/fdet_coarse.m +++ b/ofdm/fdet_coarse.m @@ -1,11 +1,11 @@ -function [f dmod] = fdet_coarse(x, N, fs, f_off_lo, df, f_off_hi) +function omega_coarse = fdet_coarse(x, N, omega_min, omega_step, omega_max) -f_range = (f_off_lo:df:f_off_hi); +omega_range = (omega_min:omega_step:omega_max); -for k=1:lge(f_range) - x_est = exp(-j*(2*pi*f_range(k)/fs*(0:N-1)' + 0)); +for k=1:lge(omega_range) + x_est = exp(-j*(2*pi*omega_range(k)*(0:N-1)' + 0)); dmod(k) = sum(x(1:N).*x_est); end; [v maxk] = max(abs(dmod)); -f = f_range(maxk); +omega_coarse = omega_range(maxk); diff --git a/ofdm/fdet_eval.m b/ofdm/fdet_eval.m index 8656be7..fc49e33 100644 --- a/ofdm/fdet_eval.m +++ b/ofdm/fdet_eval.m @@ -6,44 +6,29 @@ fs = 48000; N = 1024; K = 40; -f_min = p(1); -f_max = p(2); -f_step = p(3); +omega_min = p(1)/fs; +omega_max = p(2)/fs; +omega_step = p(3)/fs; % 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); +x = exp(j*(2*pi*f_true/fs*(0:K*N-1)'+ phi_true)) + sqrt(10^(knoise_dB/10))*randn(K*N,1); -% Initial guess -f_coarse = fdet_coarse(x_true, N, fs, f_min, f_step, f_max) +[omega, err, dmod, omega_coarse, omega_est] = fdet(x, N, omega_min, omega_step, omega_max); -phi_est = 0; -f_est = f_coarse; -for k=1:K - f(k) = f_est; - xp = x_true((k-1)*N+1:k*N); - x_est = exp(-j*(2*pi*f_est/fs*(0:N-1)' + phi_est)); - dmod(k) = sum(xp.*x_est); - f_f = angle(dmod(k))/N*fs/(2*pi); - err(k) = f_f; - f_est = f_est + f_f; - dphi_est = 2*pi*mod(f_est/fs*N, 1); - phi_est = mod(phi_est + dphi_est, 2*pi); -end; - -f_est = f_est +f_coarse = omega_coarse*fs +f_est = omega_est*fs error_ppm = 1E6*(1-f_est/f_true) - close all; subplot(4,1,1) -plot(1:lge(f), real(dmod)/N, 1:lge(f), imag(dmod)/N, 1:lge(f), abs(dmod)/N); grid; legend('Re', 'Im', 'abs()'); +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) -plot(1:lge(f), err, '-'); grid; legend('error'); +plot(1:lge(omega), err, '-'); grid; legend('error'); subplot(4,1,3) -plot(1:lge(f), f); grid; legend('f'); +plot(1:lge(omega), omega*fs); grid; legend('f'); subplot(4,1,4) -plot(1:lge(f), angle(dmod), '-*', 1:lge(f), diff(angle([0 dmod])), 'r-*'); grid; legend('phi', 'dphi'); +plot(1:lge(omega), angle(dmod), '-*', 1:lge(omega), diff(angle([0 dmod])), 'r-*'); grid; legend('phi', 'dphi'); diff --git a/ofdm/ofdm_tx.m b/ofdm/ofdm_tx.m index cd67de1..f978d78 100644 --- a/ofdm/ofdm_tx.m +++ b/ofdm/ofdm_tx.m @@ -1,5 +1,5 @@ % function ofdm_tx(N_frames) -function [yv xv] = ofdm_tx(N_frames) +function [yv xv] = ofdm_tx(N_frames, withData) close all; @@ -7,7 +7,7 @@ WITH_RCWIN = 1; WITH_FREQ_REF = 1; WITH_TIME_REF = 0; WITH_GAIN_REF = 0; -WITH_DATA = 0; +WITH_DATA = withData; M_QAM = 4; RCWIN_ROLLOFF = 0.1; @@ -90,7 +90,7 @@ ofdm_params_drm(DRM_MODE_D) = struct('mode', 'MODE_D', 'nu', 112, 'ng', 88, 'nsp ofdm_params_drm(DRM_MODE_E) = struct('mode', 'MODE_E', 'nu', 27, 'ng', 3, 'nspf', 40, 'W', W1024(DRM_MODE_E), 'Z', Z1024(DRM_MODE_E), 'Q', Q1024(DRM_MODE_E)); ofdm_params = ofdm_params_drm(DRM_MODE_B); -ofdm_spec_occ = ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0); +ofdm_spec_occ = ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k); ofdm_params_mode = ofdm_params.mode ofdm_spec_occ_kmin = ofdm_spec_occ.kmin @@ -128,7 +128,7 @@ for k=1:N_frames if WITH_DATA == 1 data_i = c2i(N_fft, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax); sym = round(M_QAM*rand(1, length(data_i))+0.5); - X(data_i) = 0.20*qlut(sym); + X(data_i) = 0.10*qlut(sym); end; % X(c2i(N_fft,65)) = 0.20*qlut(round(M_qam*rand(1, 1)+0.5));