- fixed jitter in H estimation

- consider power boost in params
- RX: cleaned up
- TX: cleaned up


git-svn-id: http://moon:8086/svn/matlab/trunk@44 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
2015-04-30 06:21:22 +00:00
parent 584d16e3bf
commit c5c6c37848
5 changed files with 106 additions and 114 deletions
+5 -8
View File
@@ -1,18 +1,14 @@
function W_syms = calcWiener(drm_mode, drm_bw)
% calcWiener('B', '10k');
fs = 12000;
fd_max = 0.1;
tau_max = 0.0001;
[params, spec_occ] = drm_params(drm_mode, drm_bw);
N = params.nu
Ts = params.nu/fs
dF = 1/Ts
sigm = 10^(-14/10);
frames_per_window = 2*params.y
window_delay = params.y
num_symbols_per_frame = params.nspf
num_carrier_per_symbol = spec_occ.kmax - spec_occ.kmin - 1
num_carrier_per_symbol = spec_occ.kmax - spec_occ.kmin
num_symbols_per_frame = num_symbols_per_frame * num_carrier_per_symbol
% PHI = auto-covariance-matrix
@@ -38,7 +34,7 @@ for d=0:window_delay-1
t1_pos = t2_pos(k1);
PHI(k1,k2) = sinc(f_cut_k*(k1_pos-k2_pos)) .* sinc(f_cut_t*(t1_pos-t2_pos));
end
PHI_inv = inv(PHI + eye(length(PHI))*0.0001);
PHI_inv = inv(PHI + eye(length(PHI))*sigm);
THETA = zeros(1, length(k2_pos));
% THETA
@@ -47,7 +43,8 @@ for d=0:window_delay-1
k2 = [1:length(k2_pos)];
k1_pos = carriers(k1);
t1_pos = window_delay;
THETA(k2) = sinc( (k1_pos-k2_pos)*f_cut_k ).*sinc( (t1_pos-t2_pos)*f_cut_t );
THETA(k2) = sinc(f_cut_k*(k1_pos-k2_pos)) .* sinc(f_cut_t*(t1_pos-t2_pos));
W_syms{d+1}(:, k1) = transpose( THETA*PHI_inv );
end
end
W_syms
+30 -30
View File
@@ -14,40 +14,40 @@ DRM_MODE_C = 3;
DRM_MODE_D = 4;
DRM_MODE_E = 5;
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 2, 'kmax', 102);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 2, 'kmax', 114);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', -102, 'kmax', 102);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -114, 'kmax', 114);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 98, 'kmax', 314);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', -110, 'kmax', 350);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 2, 'kmax', 102, 'boost', [2,6,98,102]);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 2, 'kmax', 114, 'boost', [2,6,110,114]);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', -102, 'kmax', 102, 'boost', [-102,-98,98,102]);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -114, 'kmax', 114, 'boost', [-114,-110,110,114]);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 98, 'kmax', 314, 'boost', [-98,-94,310,314]);
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', -110, 'kmax', 350, 'boost', [-110,-106,346,350]);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 1, 'kmax', 91);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 1, 'kmax', 103);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', - 91, 'kmax', 91);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -103, 'kmax', 103);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 87, 'kmax', 279);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 99, 'kmax', 311);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 1, 'kmax', 91, 'boost', [1,3,89,91]);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 1, 'kmax', 103, 'boost', [1,3,101,103]);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', - 91, 'kmax', 91, 'boost', [-91,-89,89,91]);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', -103, 'kmax', 103, 'boost', [-103,-101,101,103]);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', - 87, 'kmax', 279, 'boost', [-87,-85,277,279]);
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 99, 'kmax', 311, 'boost', [-99,-97,309,311]);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 69, 'kmax', 69);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 67, 'kmax', 213);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 69, 'kmax', 69, 'boost', [-69,-67,67,69]);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 67, 'kmax', 213, 'boost', [-67,-65,211,213]);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 44, 'kmax', 44);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 43, 'kmax', 135);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', - 44, 'kmax', 44, 'boost', [-44,-43,43,44]);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', - 43, 'kmax', 135, 'boost', [-43,-42,134,135]);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', -106, 'kmax', 106);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', 0, 'kmax', 0);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_4k5) = struct('spec', '4k5', 'kmin', -106, 'kmax', 106, 'boost', [-106,-102,102,106]);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_5k0) = struct('spec', '5k0', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_9k0) = struct('spec', '9k0', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_10k) = struct('spec', '10k', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_18k) = struct('spec', '18k', 'kmin', 0, 'kmax', 0, 'boost', []);
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_20k) = struct('spec', '20k', 'kmin', 0, 'kmax', 0, 'boost', []);
W1024{DRM_MODE_A,:,:} = [228 341 455; 455 569 683; 683 796 910; 910 0 114; 114 228 341];
W1024{DRM_MODE_B,:,:} = [512 0 512 0 512; 0 512 0 512 0; 512 0 512 0 512];
+6 -1
View File
@@ -14,9 +14,14 @@ n = mod(s, y);
m = floor(s/y);
p = (k - k0 - n*x)/(x*y);
ref_a = sqrt(2)*ones(1,length(k));
mag = sqrt(2);
ref_a = mag*ones(1,length(k));
ref_c = k;
for b=spec_occ.boost
ref_a(find(ref_c == b)) = 2*mag;
end
switch ofdm_params.mode
case 'A'
+12 -22
View File
@@ -148,15 +148,6 @@ for k=1:K,
Xlast = X;
end
df_track = mean(df_track_(10:200))
mean_df_fine = mean(df_fine_, 2)
mu_Hp = mean(abs(Hp_'))'
sigma_Hp = var(abs(Hp_'))'
SNR_Hp = -10*log10(sigma_Hp)'
G = (conj(Hp)*1)./(abs(Hp).^2 * 1 + sigma_Hp)
Hp_1 = 1./Hp
if ~isempty(cp_off_)
figure;
plot(0:length(cp_off_)-1, cp_off_, 0:length(cp_off_)-1, cp_off*ones(size(cp_off_)), 'r-'); grid; title('cp_{off}')
@@ -220,20 +211,16 @@ W = calcWiener(drm_mode, drm_bw);
figure;
% Detect scattered gain pilots
sym_count = 0;
start = skip_syms+frame_start
symbol_counter = 0;
win_count = 0;
start = skip_syms+frame_start;
H = zeros(N, 1);
H = [];
sym_H = [];
sym_out = [];
kk = 1;
G = [];
bin = c2i(N, 13);
Hraw = [];
symbols_per_frame = 15;
symbols_per_frame = ofdm_drm_params.nspf;
symbols_to_delay = ofdm_drm_params.y;
symbol_counter = 0;
frames_per_window = 2*ofdm_drm_params.y
H_gain_cell = cell (frames_per_window, 1);
H_gain_carriers_cell = cell (frames_per_window, 1);
@@ -244,14 +231,16 @@ for k=start:length(Z_)
n = rem(nn, ofdm_drm_params.y);
m = floor(nn/ofdm_drm_params.y);
[carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, symbol_counter); symbol_counter = symbol_counter + 1;
[carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_drm_params, ofdm_spec_occ, symbol_counter);
carrier_gain_bins = c2i(N, carrier_gain);
Hp = Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).';
H_gain_cell{win_count+1} = transpose(Z_(carrier_gain_bins, k)./(mag_gain.*exp(j*2*pi*phi_gain/1024)).');
ii = 1+mod(0+win_count+(0:frames_per_window-1), frames_per_window);
ii = 1+mod(n+(0:frames_per_window-1), frames_per_window);
H_gain = [H_gain_cell{ii}];
H_gain_carriers_cell{win_count+1} = carrier_gain;
str = sprintf('Frame %d, SymCount %d, winCount %d, n=%d', k, symbol_counter, win_count, n);
if length(H_gain) == 208
if 1
H = H_gain*W{n+1};
@@ -259,16 +248,16 @@ for k=start:length(Z_)
sym_out(:, kk) = ZZ ./ H;
if 1
subplot(2, 1, 1)
plot(0:length(H)-1, abs(H)); grid; title('abs(H)'); axis([0 length(H)-1 0 15+0*max(abs(H))]);
plot(0:length(H)-1, abs(H)); grid; title('abs(H)'); axis([0 length(H)-1 0 15+0*max(abs(H))]); title(str);
subplot(2, 1, 2)
plot(0:length(H)-1, angle(H)); grid; title('phi(H)'); axis([0 length(H)-1 -4 4]);
plot(0:length(H)-1, angle(H)); grid; title('phi(H)'); axis([0 length(H)-1 -4 4]); title(str);
else
hold on;
plot(sym_out(:, kk), '+');
hold off;
grid; title('Sym');
end
pause(0.01);
pause(0.025);
else
ii = [H_gain_carriers_cell{1:6}]
H = H_gain;
@@ -282,6 +271,7 @@ for k=start:length(Z_)
end
kk = kk + 1;
win_count = mod(win_count+1, frames_per_window);
symbol_counter = symbol_counter + 1;
end
+53 -53
View File
@@ -47,64 +47,64 @@ x_suffix = zeros(2, Ng);
ofdm_spec_occ.kmin
ofdm_spec_occ.kmax
sym_count = 0;
for k=1:N_frames
for sym_count=0:ofdm_params.nspf-1,
X = zeros(N,1);
% Data
if WITH_DATA == 1
data_i = c2i(N, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax);
sym = round(M_QAM*rand(1, length(data_i))+0.5);
X(data_i) = qlut(sym);
end;
X = zeros(N,1);
if (sym_count==0) & (WITH_TIME_REF == 1)
[ref_c ref_p ref_a] = getRefTime(ofdm_params.mode);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024));
end;
% Data
if WITH_DATA == 1
data_i = c2i(N, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax);
sym = round(M_QAM*rand(1, length(data_i))+0.5);
X(data_i) = qlut(sym);
end;
if WITH_GAIN_REF == 1
[ref_c ref_p ref_a] = getRefGain(ofdm_params, ofdm_spec_occ, sym_count);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024));
end;
if WITH_GAIN_REF == 1
[ref_c ref_p ref_a] = getRefGain(ofdm_params, ofdm_spec_occ, sym_count);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024));
end;
if WITH_FREQ_REF == 1
[ref_c ref_p ref_a] = getRefFreq(ofdm_params.mode);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024));
end;
if (sym_count==0) & (WITH_TIME_REF == 1)
[ref_c ref_p ref_a] = getRefTime(ofdm_params.mode);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024));
end;
X(c2i(N, 0)) = 0;
% Modulate
xu = k_fft*ifft(X, N).';
if WITH_RCWIN == 1
x_prefix(1,:) = xu(N-Ng+1:N);
x_suffix(1,:) = xu(1:Ng);
x_pw = x_suffix(2,:) .* (1-wng) + x_prefix(1,:) .* wng;
xs = [x_pw xu];
x_prefix(2,:) = x_prefix(1,:);
x_suffix(2,:) = x_suffix(1,:);
else
xs = [xu(N-Ng+1:N) xu];
end;
xv = [xv xs(1:Ng+N)];
if (DO_PLOT == 1)
if WITH_FREQ_REF == 1
[ref_c ref_p ref_a] = getRefFreq(ofdm_params.mode);
bins = c2i(N, ref_c);
X(bins) = ref_a.*(exp(j*2*pi*ref_p/1024));
end;
X(c2i(N, 0)) = 0;
% Modulate
xu = k_fft*ifft(X, N).';
if WITH_RCWIN == 1
x_prefix(1,:) = xu(N-Ng+1:N);
x_suffix(1,:) = xu(1:Ng);
x_pw = x_suffix(2,:) .* (1-wng) + x_prefix(1,:) .* wng;
xs = [x_pw xu];
x_prefix(2,:) = x_prefix(1,:);
x_suffix(2,:) = x_suffix(1,:);
else
xs = [xu(N-Ng+1:N) xu];
end;
xv = [xv xs(1:Ng+N)];
if (DO_PLOT == 1)
% Xs = fftshift(fft(xs(Ng+1:Ng+N), N)/k_fft);
Xs = fftshift(X);
subplot(2, 1, 1)
plot(0:N-1, abs(Xs(1:N)), '-*'); grid; axis([0 N-1 0 2]);
subplot(2, 1, 2)
plot(0:N-1, angle(Xs(1:N)), '-*'); grid; axis([0 N-1 -2*pi 2*pi]);
pause(plot_speed);
end
end;
Xs = fftshift(X);
subplot(2, 1, 1)
plot(0:N-1, abs(Xs(1:N)), '-*'); grid; axis([0 N-1 0 3.0]);
subplot(2, 1, 2)
plot(0:N-1, angle(Xs(1:N)), '-*'); grid; axis([0 N-1 -2*pi 2*pi]);
pause(plot_speed);
end
sym_count = mod(sym_count+1, ofdm_params.nspf);
end;
hold off;
grid;
@@ -119,7 +119,7 @@ xup = filter(hlp, 1, xup);
yc = exp(j*2*pi.*(0:length(xup)-1)*0.25) .* xup;
yv = real(yc) + imag(yc);
xv = conj(xv')./abs(max(xv));
xv = xv.' ./abs(max(xv));
yv = yv'./max(yv);
wavwrite(0.9*yv,4*fa,16,'yv.wav')