- working TX and RX
git-svn-id: http://moon:8086/svn/matlab/trunk@34 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
+269
-26
@@ -1,26 +1,269 @@
|
||||
function ofdm_rx(x)
|
||||
|
||||
close all;
|
||||
|
||||
CP_SIZE = 256;
|
||||
FFT_SIZE = 1024;
|
||||
fa = 48000;
|
||||
fo = 0.0;
|
||||
k_fft = 2*sqrt(FFT_SIZE);
|
||||
|
||||
% Introduce frequency offset
|
||||
x = 0.5*exp(i*2*pi.*(0:length(x)-1)*fo/fa)' .* x;
|
||||
|
||||
figure;
|
||||
Ns = (CP_SIZE + FFT_SIZE);
|
||||
Nf = length(x)/Ns;
|
||||
for k=1:Nf
|
||||
Xs = fft(x((k-1)*Ns+CP_SIZE+1:(k-1)*Ns+CP_SIZE+FFT_SIZE), FFT_SIZE)/k_fft;
|
||||
mag = abs(Xs(1:FFT_SIZE/8));
|
||||
phase = angle(Xs(1:FFT_SIZE/8));
|
||||
subplot(2, 1, 1)
|
||||
plot(fa*(0:lge(mag)-1)/FFT_SIZE, mag, '-*'); grid;
|
||||
subplot(2, 1, 2)
|
||||
plot(fa*(0:lge(phase)-1)/FFT_SIZE, phase, '-*'); axis([0, fa*(lge(phase)-1)/FFT_SIZE, -pi, +pi]);grid;
|
||||
pause (0.001);
|
||||
end
|
||||
function [x] = ofdm_rx(filename, foff, knoise_dB, with_cir)
|
||||
%
|
||||
% Example: ofdm_rx('drm-15435-if.wav', -174.65, -400, 0)
|
||||
% Example: ofdm_tx(40, 1)
|
||||
% ofdm_rx('xv.wav', 0, -400, 0)
|
||||
% or ofdm_rx('yv.wav', 0, -400, 0)
|
||||
|
||||
drm_mode = 'B';
|
||||
drm_bw = '10k';
|
||||
|
||||
[ofdm_drm_params, ofdm_spec_occ] = drm_params(drm_mode, drm_bw);
|
||||
|
||||
close all;
|
||||
pre_mix = 0;
|
||||
Kdown = 4;
|
||||
fs = 48000/Kdown;
|
||||
fc = fs/4;
|
||||
N = 1024/Kdown;
|
||||
Ng = 256/Kdown;
|
||||
[carrier_pilot, phi_pilot, mag_pilot] = getRefFreq(drm_mode);
|
||||
[carrier_time, phi_time, mag_time] = getRefTime(drm_mode);
|
||||
|
||||
h_cir = [0 0 .1 -.2 .5 .2 -.1 0 0 ];
|
||||
|
||||
close all;
|
||||
|
||||
% Generate signal
|
||||
[xwav fs_ nbits] = wavread(filename);
|
||||
|
||||
[len ndim] = size(xwav);
|
||||
|
||||
if (ndim == 2)
|
||||
fprintf('Mode: Baseband\n');
|
||||
x = xwav(:, 1) + j*xwav(:, 2);
|
||||
elseif (ndim == 1)
|
||||
fprintf('Mode: Passband\n');
|
||||
x = xwav.*exp(-j*(2*pi*(0.25-foff/fs_)*(0:len-1)'));
|
||||
hlp = FIRCalcLowpass(12000/fs_, 33);
|
||||
x = filter(hlp, 1, x);
|
||||
else
|
||||
error('Cannot read file!');
|
||||
end
|
||||
x = x(1:Kdown:length(x));
|
||||
|
||||
if with_cir
|
||||
x = filter(h_cir, 1, x);
|
||||
end
|
||||
x = x - mean(x);
|
||||
x = x./max(abs(x));
|
||||
xout = [real(x) imag(x)];
|
||||
wavwrite(xout,fs,nbits,'ofdm_rx.wav');
|
||||
|
||||
x = x + sqrt(0.5)*10^(knoise_dB/20)*(randn(size(x)) + j*randn(size(x)));
|
||||
|
||||
|
||||
K = fix((length(x)-Ng)/(N+Ng));
|
||||
|
||||
% Timing coarse
|
||||
cp_off_ = [];
|
||||
cp_off = 0;
|
||||
if 1
|
||||
fprintf('Coarse timing estimation\n');
|
||||
Z = 0;
|
||||
for k=1:20
|
||||
xp = x((k-1)*(N+Ng)+1:k*(N+Ng));
|
||||
[cp_off, Nd, valid, Z] = timing_coarse(xp, N, Ng, Ng, Z);
|
||||
if (valid)
|
||||
cp_off_ = [cp_off_ cp_off];
|
||||
end
|
||||
end;
|
||||
cp_off = round(median(cp_off_))
|
||||
Nd = Nd
|
||||
end
|
||||
|
||||
fdet_coarse_Z = 0;
|
||||
Z_cfa_pre = 0;
|
||||
df_i_ = [];
|
||||
df_ = [];
|
||||
f_pilots = carrier_pilot'/N*fs
|
||||
valid_latency_count = 20;
|
||||
if 1
|
||||
fprintf('Coarse integer CFO estimation\n');
|
||||
% Integer CFO coarse
|
||||
for k=1:200
|
||||
xp = x((k-1)*(N+Ng)+cp_off+1:k*(N+Ng)+cp_off);
|
||||
[d_bin, valid, fdet_coarse_Z] = cfo_coarse_int(xp(Ng+1:N+Ng), N, carrier_pilot, 11, fdet_coarse_Z);
|
||||
if valid
|
||||
df_i = -d_bin(1)/N*fs;
|
||||
if valid_latency_count > 0
|
||||
valid_latency_count = valid_latency_count - 1;
|
||||
else
|
||||
break;
|
||||
end
|
||||
end
|
||||
end;
|
||||
end
|
||||
|
||||
fprintf('Coarse fractional CFO estimation\n');
|
||||
% CFO coarse
|
||||
df_f_ = [];
|
||||
for k=1:200
|
||||
xp = x((k-1)*(N+Ng)+cp_off+1:k*(N+Ng)+cp_off);
|
||||
[domega_f, Z_cfa_pre] = cfo_coarse_fract(xp, N, Ng, Ng, Nd, Z_cfa_pre);
|
||||
df_f_ = [df_f_ domega_f*fs];
|
||||
end;
|
||||
df_coarse = df_i + mean(df_f_(10:200))
|
||||
df_coarse_ = df_i + df_f_;
|
||||
|
||||
if pre_mix
|
||||
x1 = x.*exp(j*(2*pi*df_coarse/fs.*(0:length(x)-1)'));
|
||||
df_track = 0;
|
||||
else
|
||||
x1 = x;
|
||||
df_track = df_coarse;
|
||||
end
|
||||
|
||||
% CFO Fine
|
||||
fprintf('Fine CFO estimation\n');
|
||||
fprintf('Receive Symbols\n');
|
||||
Xlast = [];
|
||||
df_fine = 0;
|
||||
df_fine_ = [];
|
||||
df_track_ = [];
|
||||
kn = fs/(2*pi*(1+Ng/N))/N;
|
||||
x_ = [];
|
||||
Hp_ = [];
|
||||
Z_ = [];
|
||||
phi = 0.0;
|
||||
bin_track = 1;
|
||||
sym_pilot = exp(j*2*pi*phi_pilot'/1024);
|
||||
|
||||
bin_pilot = c2i(N, carrier_pilot);
|
||||
for k=1:K,
|
||||
xp = x1((k-1)*(N+Ng)+cp_off+1:k*(N+Ng)+cp_off);
|
||||
xp = xp.*exp(j*(2*pi*df_track/fs*(0:N+Ng-1)' + phi));
|
||||
phi = phi + 2*pi*df_track/fs*(N+Ng);
|
||||
xp = xp(Ng+1:N+Ng);
|
||||
x_ = [x_' xp']';
|
||||
X = fft(xp);
|
||||
if (~isempty(Xlast))
|
||||
Z = Xlast .* conj(X);
|
||||
df_fine = kn*angle(Z(bin_pilot));
|
||||
df_fine_ = [df_fine_ df_fine];
|
||||
phi_p = angle(X(bin_pilot));
|
||||
mag_p = abs(X(bin_pilot));
|
||||
df_track = df_track + 0.1*mean(df_fine(bin_track));
|
||||
df_track_ = [df_track_ df_track];
|
||||
Hp = X(bin_pilot)./conj(sym_pilot);
|
||||
Hp_ = [Hp_ Hp];
|
||||
Z_ = [Z_ X];
|
||||
end
|
||||
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}')
|
||||
end
|
||||
|
||||
df_track_ = df_track_';
|
||||
|
||||
figure;
|
||||
subplot(3, 1, 1)
|
||||
plot(0:length(df_coarse_)-1, df_coarse_); grid; title('df_{coarse}')
|
||||
|
||||
subplot(3, 1, 2)
|
||||
plot(0:length(df_track_)-1, df_track_); grid; title('df_{track}')
|
||||
|
||||
subplot(3, 1, 3)
|
||||
plot(0:length(df_fine_)-1, df_fine_); grid; title('df_{fine}')
|
||||
|
||||
figure;
|
||||
Z_pilot = Z_(bin_pilot, 200:length(Z_))';
|
||||
plot(real(Z_pilot), imag(Z_pilot), '+'); grid; title('SymPilot_{Freq}');
|
||||
maxZ = max(max(abs(Z_pilot)));
|
||||
if (maxZ < 1)
|
||||
axis([-1 1 -1 1]);
|
||||
else
|
||||
axis([-maxZ maxZ -maxZ maxZ]);
|
||||
end
|
||||
|
||||
%% Detect start of DRM frame
|
||||
bins = c2i(N, carrier_time);
|
||||
kc_max = -1000;
|
||||
n_max = 0;
|
||||
for n=0:15-1
|
||||
frame_timing_Z = 0;
|
||||
k = 200+n;
|
||||
for m=1:2
|
||||
[kc valid frame_timing_Z] = timing_frame(Z_(bins, k)', bins, 15, frame_timing_Z);
|
||||
k = k + 15;
|
||||
end
|
||||
if valid
|
||||
if kc > kc_max
|
||||
n_max = n;
|
||||
kc_max = kc;
|
||||
end
|
||||
end
|
||||
end
|
||||
frame_start = n_max;
|
||||
|
||||
figure;
|
||||
start = 200+frame_start;
|
||||
Z_timing = Z_(bins, start:15:length(Z_))';
|
||||
plot(real(Z_timing), imag(Z_timing), '+'); grid; title('SymPilot_{Time}');
|
||||
maxZ = max(max(abs(Z_timing)));
|
||||
if (maxZ < 1)
|
||||
axis([-1 1 -1 1]);
|
||||
else
|
||||
axis([-maxZ maxZ -maxZ maxZ]);
|
||||
end
|
||||
|
||||
figure;
|
||||
% Detect scattered gain pilots
|
||||
sym_count = 0;
|
||||
start = 200+frame_start;
|
||||
H = zeros(N, 1);
|
||||
sym_H = [];
|
||||
for k=start:length(Z_)
|
||||
[carrier_gain, phi_gain, mag_gain] = getRefGain(ofdm_spec_occ, ofdm_drm_params, sym_count);
|
||||
carrier_gain_bins = c2i(N, carrier_gain);
|
||||
Hp = Z_(carrier_gain_bins, k)./(mag_gain.*exp(-j*2*pi*phi_gain/1024))';
|
||||
H(carrier_gain_bins) = Hp;
|
||||
sym_count_str = sprintf('%d', sym_count);
|
||||
if 0
|
||||
plot(abs(Hp)); grid; title(sym_count_str);
|
||||
pause(0.1);
|
||||
end
|
||||
|
||||
if (sym_count < 14)
|
||||
sym_count = sym_count+1;
|
||||
else
|
||||
H(1:2:N) = H(2:2:length(H));
|
||||
if 1
|
||||
% G = ones(size(H));
|
||||
% G = 1./(H+1e-6);
|
||||
G = (conj(H)*1)./(abs(H).^2 * 1 + sigma_Hp(1));
|
||||
subplot(4, 1, 1)
|
||||
plot(abs(spec_order(N, H))); grid; title('abs(H)');
|
||||
subplot(4, 1, 2)
|
||||
plot(angle(spec_order(N, H))); grid; title('phi(H)');
|
||||
subplot(4, 1, 3)
|
||||
plot(abs(spec_order(N, G))); grid; title('abs(G)');
|
||||
subplot(4, 1, 4)
|
||||
plot(angle(spec_order(N, G))); grid; title('phi(G)');
|
||||
pause(0.01);
|
||||
|
||||
bin = c2i(N, 13);
|
||||
sym_H = [sym_H Z_(bin, k).*G(bin)];
|
||||
end
|
||||
H_gather = zeros(N, 1);
|
||||
sym_count = 0;
|
||||
end;
|
||||
end
|
||||
|
||||
figure;
|
||||
plot(real(sym_H'), imag(sym_H'), '+'); grid; title('Sym_{H}'); axis([-2 2 -2 2]);
|
||||
|
||||
function Y = spec_order(N, X)
|
||||
Y = [X(N/2+1:N)' X(1:N/2)']';
|
||||
|
||||
+52
-232
@@ -1,16 +1,18 @@
|
||||
% function ofdm_tx(N_frames)
|
||||
function [yv xv] = ofdm_tx(N_frames, withData)
|
||||
function [yv xv] = ofdm_tx(mode, bandwidth, N_frames, withData)
|
||||
|
||||
close all;
|
||||
|
||||
DO_PLOT = 1;
|
||||
WITH_RCWIN = 1;
|
||||
WITH_FREQ_REF = 1;
|
||||
WITH_TIME_REF = 0;
|
||||
WITH_GAIN_REF = 0;
|
||||
WITH_TIME_REF = 1;
|
||||
WITH_GAIN_REF = 1;
|
||||
WITH_DATA = withData;
|
||||
DELAY = 100;
|
||||
|
||||
M_QAM = 4;
|
||||
RCWIN_ROLLOFF = 0.1;
|
||||
M_QAM = 64;
|
||||
RCWIN_ROLLOFF = 0.125;
|
||||
|
||||
% Params
|
||||
fa = 48000;
|
||||
@@ -19,78 +21,7 @@ F1 = 750;
|
||||
F2 = 2250;
|
||||
F3 = 3000;
|
||||
|
||||
SPEC_OCC_4k5 = 1;
|
||||
SPEC_OCC_5k0 = 2;
|
||||
SPEC_OCC_9k0 = 3;
|
||||
SPEC_OCC_10k = 4;
|
||||
SPEC_OCC_18k = 5;
|
||||
SPEC_OCC_20k = 6;
|
||||
|
||||
DRM_MODE_A = 1;
|
||||
DRM_MODE_B = 2;
|
||||
DRM_MODE_C = 3;
|
||||
DRM_MODE_D = 4;
|
||||
DRM_MODE_E = 5;
|
||||
|
||||
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', 2, 'kmax', 102);
|
||||
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 2, 'kmax', 114);
|
||||
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', -102, 'kmax', 102);
|
||||
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', -114, 'kmax', 114);
|
||||
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', - 98, 'kmax', 314);
|
||||
ofdm_spec_occ_drm(DRM_MODE_A, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', -110, 'kmax', 350);
|
||||
|
||||
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', 1, 'kmax', 91);
|
||||
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 1, 'kmax', 103);
|
||||
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', - 91, 'kmax', 91);
|
||||
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', -103, 'kmax', 103);
|
||||
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', - 87, 'kmax', 279);
|
||||
ofdm_spec_occ_drm(DRM_MODE_B, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', - 99, 'kmax', 311);
|
||||
|
||||
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', - 69, 'kmax', 69);
|
||||
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_C, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', - 67, 'kmax', 213);
|
||||
|
||||
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', - 44, 'kmax', 44);
|
||||
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_D, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', - 43, 'kmax', 135);
|
||||
|
||||
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_4k5) = struct('spec', SPEC_OCC_4k5, 'kmin', -106, 'kmax', 106);
|
||||
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_5k0) = struct('spec', SPEC_OCC_5k0, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_9k0) = struct('spec', SPEC_OCC_9k0, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_10k) = struct('spec', SPEC_OCC_10k, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_18k) = struct('spec', SPEC_OCC_18k, 'kmin', 0, 'kmax', 0);
|
||||
ofdm_spec_occ_drm(DRM_MODE_E, SPEC_OCC_20k) = struct('spec', SPEC_OCC_20k, 'kmin', 0, 'kmax', 0);
|
||||
|
||||
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];
|
||||
W1024{DRM_MODE_C,:,:} = [465 372 279 186 93 0 931 838 745 652; 931 838 745 652 559 465 372 279 186 93];
|
||||
W1024{DRM_MODE_D,:,:} = [366 439 512 585 658 731 805 878; 731 805 878 951 0 73 146 219; 73 146 219 293 366 439 512 585];
|
||||
W1024{DRM_MODE_E,:,:} = [];
|
||||
Z1024{DRM_MODE_A,:,:} = [0 81 248; 18 106 106; 122 116 31; 129 129 39; 33 32 111];
|
||||
Z1024{DRM_MODE_B,:,:} = [0 57 164 64 12; 168 255 161 106 118; 25 232 132 233 38];
|
||||
Z1024{DRM_MODE_C,:,:} = [0 76 29 76 9 190 161 248 33 108; 179 178 83 253 127 105 101 198 250 145];
|
||||
Z1024{DRM_MODE_D,:,:} = [0 240 17 60 220 38 151 101; 110 70 78 82 175 150 106 25; 165 7 252 124 253 177 197 142];
|
||||
Z1024{DRM_MODE_E,:,:} = [];
|
||||
Q1024{DRM_MODE_A,:,:} = [36];
|
||||
Q1024{DRM_MODE_B,:,:} = [12];
|
||||
Q1024{DRM_MODE_C,:,:} = [12];
|
||||
Q1024{DRM_MODE_D,:,:} = [14];
|
||||
Q1024{DRM_MODE_E,:,:} = [];
|
||||
|
||||
ofdm_params_drm(DRM_MODE_A) = struct('mode', 'MODE_A', 'nu', 288, 'ng', 32, 'nspf', 15, 'W', W1024(DRM_MODE_A), 'Z', Z1024(DRM_MODE_A), 'Q', Q1024(DRM_MODE_A));
|
||||
ofdm_params_drm(DRM_MODE_B) = struct('mode', 'MODE_B', 'nu', 256, 'ng', 64, 'nspf', 15, 'W', W1024(DRM_MODE_B), 'Z', Z1024(DRM_MODE_B), 'Q', Q1024(DRM_MODE_B));
|
||||
ofdm_params_drm(DRM_MODE_C) = struct('mode', 'MODE_C', 'nu', 176, 'ng', 64, 'nspf', 20, 'W', W1024(DRM_MODE_C), 'Z', Z1024(DRM_MODE_C), 'Q', Q1024(DRM_MODE_C));
|
||||
ofdm_params_drm(DRM_MODE_D) = struct('mode', 'MODE_D', 'nu', 112, 'ng', 88, 'nspf', 24, 'W', W1024(DRM_MODE_D), 'Z', Z1024(DRM_MODE_D), 'Q', Q1024(DRM_MODE_D));
|
||||
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_10k);
|
||||
[ofdm_params, ofdm_spec_occ] = drm_params(mode, bandwidth);
|
||||
|
||||
ofdm_params_mode = ofdm_params.mode
|
||||
ofdm_spec_occ_kmin = ofdm_spec_occ.kmin
|
||||
@@ -101,202 +32,91 @@ Tu = ofdm_params.nu * T
|
||||
Tg = ofdm_params.ng * T
|
||||
Ts = Tu+Tg
|
||||
Ng = round(Tg*fa)
|
||||
Nu = round(Tu*fa)
|
||||
N = round(Tu*fa)
|
||||
Ns = round(Ts*fa)
|
||||
N_fft = Nu
|
||||
SubCarrierspacing_HZ = fa/N_fft
|
||||
SubCarrierspacing_HZ = fa/N
|
||||
|
||||
% TX window
|
||||
[rcwin Nt] = txwin_eval(Nu, Ng, RCWIN_ROLLOFF);
|
||||
[rcwin Nt wng] = txwin_eval(N, Ng, RCWIN_ROLLOFF);
|
||||
Nt = Nt
|
||||
|
||||
% Source
|
||||
qlut = qamtable(M_QAM);
|
||||
|
||||
k_fft = sqrt(N_fft);
|
||||
xv = [];
|
||||
k_fft = sqrt(N);
|
||||
xv = zeros(1, DELAY);
|
||||
xt = zeros(1, Nt);
|
||||
x_prefix = zeros(2, Ng);
|
||||
x_suffix = zeros(2, Ng);
|
||||
|
||||
ofdm_spec_occ.kmin
|
||||
ofdm_spec_occ.kmax
|
||||
figure;
|
||||
for k=1:N_frames
|
||||
for s=0:ofdm_params.nspf-1,
|
||||
for sym_count=0:ofdm_params.nspf-1,
|
||||
|
||||
X = zeros(N_fft,1);
|
||||
X = zeros(N,1);
|
||||
|
||||
% Data
|
||||
if WITH_DATA == 1
|
||||
data_i = c2i(N_fft, ofdm_spec_occ.kmin:1:ofdm_spec_occ.kmax);
|
||||
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) = 0.20*qlut(sym);
|
||||
X(data_i) = qlut(sym);
|
||||
end;
|
||||
|
||||
if WITH_FREQ_REF == 1
|
||||
[ref_c ref_p ref_a] = getRefFreq(ofdm_params.mode);
|
||||
X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024));
|
||||
bins = c2i(N, ref_c);
|
||||
X(bins) = ref_a.*(exp(2*pi*i*ref_p/1024));
|
||||
end;
|
||||
|
||||
|
||||
if (s==0) & (WITH_TIME_REF == 1)
|
||||
if (sym_count==0) & (WITH_TIME_REF == 1)
|
||||
[ref_c ref_p ref_a] = getRefTime(ofdm_params.mode);
|
||||
X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024));
|
||||
bins = c2i(N, ref_c);
|
||||
X(bins) = ref_a.*(exp(2*pi*i*ref_p/1024));
|
||||
end;
|
||||
|
||||
if WITH_GAIN_REF == 1
|
||||
[ref_c ref_p ref_a] = getRefGain(ofdm_spec_occ, ofdm_params, s);
|
||||
X(c2i(N_fft, ref_c)) = 0.20*ref_a.*(exp(2*pi*i*ref_p/1024));
|
||||
[ref_c ref_p ref_a] = getRefGain(ofdm_spec_occ, ofdm_params, sym_count);
|
||||
X(c2i(N, ref_c)) = ref_a.*(exp(2*pi*i*ref_p/1024));
|
||||
end;
|
||||
|
||||
% Modulate
|
||||
xu = k_fft*ifft(X, N_fft)';
|
||||
xu = conj(k_fft*ifft(X, N)');
|
||||
if WITH_RCWIN == 1
|
||||
xs = [xu(Nu-Ng+1:Nu) xu xu(1:Nt)] .* rcwin;
|
||||
xs(1:Nt) = xs(1:Nt) + xt(1:Nt);
|
||||
xt = xs(Ng+Nu+1:Ng+Nu+Nt);
|
||||
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(Nu-Ng+1:Nu) xu];
|
||||
xs = [xu(N-Ng+1:N) xu];
|
||||
end;
|
||||
xv = [xv xs(1:Ng+Nu)];
|
||||
Xs = fft(xs(Ng+1:Ng+Nu), N_fft)/k_fft;
|
||||
plot(0:N_fft-1, abs(Xs(1:N_fft)), '-*'); grid;
|
||||
pause (0.001);
|
||||
xv = [xv xs(1:Ng+N)];
|
||||
|
||||
if (DO_PLOT == 1)
|
||||
Xs = fft(xs(Ng+1:Ng+N), N)/k_fft;
|
||||
plot(0:N-1, abs(Xs(1:N)), '-*'); grid;
|
||||
pause(0.01);
|
||||
end
|
||||
end;
|
||||
end;
|
||||
hold off;
|
||||
grid;
|
||||
|
||||
plot(wng); grid;
|
||||
|
||||
% Modulate on carrier
|
||||
yc = 0.5*exp(j*2*pi.*(0:length(xv)-1)*fc/fa) .* xv;
|
||||
yc = exp(j*2*pi.*(0:length(xv)-1)*fc/fa) .* xv;
|
||||
yv = real(yc) + imag(yc);
|
||||
|
||||
xv = conj(xv');
|
||||
yv = yv';
|
||||
xv = conj(xv')./abs(max(xv));
|
||||
yv = yv'./max(yv);
|
||||
|
||||
wavwrite(0.9*yv,fa,16,'yv.wav')
|
||||
wavwrite(0.9*[real(xv) imag(xv)],fa,16,'xv.wav')
|
||||
|
||||
function index = c2i(N_fft, carriers)
|
||||
ri = [];
|
||||
ri = [ri find(carriers == 0)];
|
||||
carriers(ri) = [];
|
||||
index = mod(-carriers, N_fft) + 1;
|
||||
|
||||
function [ref_c ref_p ref_a] = getRefFreq(drmMode)
|
||||
|
||||
ref_A_c = [18 54 72];
|
||||
ref_A_p = [205 836 215];
|
||||
ref_A_a = sqrt(2)*ones(1,3);
|
||||
|
||||
|
||||
ref_B_c = [16 48 64];
|
||||
ref_B_p = [331 651 555];
|
||||
ref_B_a = sqrt(2)*ones(1,3);
|
||||
|
||||
ref_C_c = [11 33 44];
|
||||
ref_C_p = [214 392 242];
|
||||
ref_C_a = sqrt(2)*ones(1,3);
|
||||
|
||||
ref_D_c = [ 7 21 28];
|
||||
ref_D_p = [788 1014 332];
|
||||
ref_D_a = sqrt(2)*ones(1,3);
|
||||
|
||||
ref_E_c = [];
|
||||
ref_E_p = [];
|
||||
ref_E_a = [];
|
||||
|
||||
switch drmMode
|
||||
case 'MODE_A'
|
||||
ref_c = ref_A_c;
|
||||
ref_p = ref_A_p;
|
||||
ref_a = ref_A_a;
|
||||
|
||||
case 'MODE_B'
|
||||
ref_c = ref_B_c;
|
||||
ref_p = ref_B_p;
|
||||
ref_a = ref_B_a;
|
||||
|
||||
case 'MODE_C'
|
||||
ref_c = ref_C_c;
|
||||
ref_p = ref_C_p;
|
||||
ref_a = ref_C_a;
|
||||
|
||||
case 'MODE_D'
|
||||
ref_c = ref_D_c;
|
||||
ref_p = ref_D_p;
|
||||
ref_a = ref_D_a;
|
||||
|
||||
case 'MODE_E'
|
||||
ref_c = ref_E_c;
|
||||
ref_p = ref_E_p;
|
||||
ref_a = ref_E_a;
|
||||
end;
|
||||
|
||||
function [ref_c ref_p ref_a] = getRefTime(drmMode)
|
||||
|
||||
ref_B_c = [14 18 20 24 26 32 36 42 44 49 50 54 56 62 66 68];
|
||||
ref_B_p = [304 108 620 192 704 44 432 588 844 651 651 460 460 944 940 428];
|
||||
ref_B_a = sqrt(2)*ones(1,16);
|
||||
|
||||
switch drmMode
|
||||
case 'MODE_A'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
|
||||
case 'MODE_B'
|
||||
ref_c = ref_B_c;
|
||||
ref_p = ref_B_p;
|
||||
ref_a = ref_B_a;
|
||||
|
||||
case 'MODE_C'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
|
||||
case 'MODE_D'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
|
||||
case 'MODE_E'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
end;
|
||||
|
||||
function [ref_c ref_p ref_a] = getRefGain(spec_occ, ofdm_params, s)
|
||||
|
||||
switch ofdm_params.mode
|
||||
case 'MODE_A'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
|
||||
case 'MODE_B'
|
||||
k0 = 1;
|
||||
x = 2;
|
||||
y = 3;
|
||||
k = (spec_occ.kmin:1:spec_occ.kmax);
|
||||
ref_c = 1 + 2*mod(s,3)+6*k;
|
||||
ref_c(find(ref_c > spec_occ.kmax)) = [];
|
||||
ref_c(find(ref_c < spec_occ.kmin)) = [];
|
||||
n = mod(s, y);
|
||||
m = floor(s/y);
|
||||
p = (ref_c - k0 - n*x)/(x*y);
|
||||
ref_p = mod(4*ofdm_params.Z(n+1,m+1) + p*ofdm_params.W(n+1,m+1) + p.*p*(1+s)*ofdm_params.Q, 1024);
|
||||
ref_a = sqrt(2)*ones(1,length(ref_c));
|
||||
|
||||
case 'MODE_C'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
|
||||
case 'MODE_D'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
|
||||
case 'MODE_E'
|
||||
ref_c = [];
|
||||
ref_p = [];
|
||||
ref_a = [];
|
||||
end;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user