From 626f3141cbe7de7462f35e294aed11c7e63cab61 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 19 Apr 2015 18:46:10 +0000 Subject: [PATCH] - moved DRM stuff into DRM git-svn-id: http://moon:8086/svn/matlab/trunk@32 801c6759-fa7c-4059-a304-17956f83a07c --- ofdm/drm/c2i.m | 5 ++ ofdm/drm/drm_params.m | 120 ++++++++++++++++++++++++++++++++++++++++++ ofdm/drm/getRefFreq.m | 30 +++++++++++ ofdm/drm/getRefGain.m | 41 +++++++++++++++ ofdm/drm/getRefTime.m | 36 +++++++++++++ 5 files changed, 232 insertions(+) create mode 100644 ofdm/drm/c2i.m create mode 100644 ofdm/drm/drm_params.m create mode 100644 ofdm/drm/getRefFreq.m create mode 100644 ofdm/drm/getRefGain.m create mode 100644 ofdm/drm/getRefTime.m diff --git a/ofdm/drm/c2i.m b/ofdm/drm/c2i.m new file mode 100644 index 0000000..96ef92f --- /dev/null +++ b/ofdm/drm/c2i.m @@ -0,0 +1,5 @@ +function index = c2i(N, carriers) + ri = []; + ri = [ri find(carriers == 0)]; + carriers(ri) = []; + index = mod(carriers, N) + 1; diff --git a/ofdm/drm/drm_params.m b/ofdm/drm/drm_params.m new file mode 100644 index 0000000..b0bf7ec --- /dev/null +++ b/ofdm/drm/drm_params.m @@ -0,0 +1,120 @@ +% function drm_params(drm_mode, spec_occupancy) +function [params, spec_occ] = drm_params(mode, spec_occupancy) + +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', '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_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_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_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_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); + +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', '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', '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', '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', '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', 'E', 'nu', 27, 'ng', 3, 'nspf', 40, 'W', W1024(DRM_MODE_E), 'Z', Z1024(DRM_MODE_E), 'Q', Q1024(DRM_MODE_E)); + +drm_mode_index = 0; +switch mode + case 'A' + drm_mode_index = DRM_MODE_A; + + case 'B' + drm_mode_index = DRM_MODE_B; + + case 'C' + drm_mode_index = DRM_MODE_C; + + case 'D' + drm_mode_index = DRM_MODE_D; + + case 'E' + drm_mode_index = DRM_MODE_E; +end +if (drm_mode_index == 0) + error ('Invalid DRM mode!'); +end + +spec_occ_index = 0; +switch spec_occupancy + case '4k5' + spec_occ_index = SPEC_OCC_4k5; + + case '5k0' + spec_occ_index = SPEC_OCC_5k0; + + case '9k0' + spec_occ_index = SPEC_OCC_9k0; + + case '10k' + spec_occ_index = SPEC_OCC_10k; + + case '18k' + spec_occ_index = SPEC_OCC_18k; + + case '20k' + spec_occ_index = SPEC_OCC_20k; +end +if (spec_occ_index == 0) + error ('Invalid spectrun occupancy!'); +end + +params = ofdm_params_drm(drm_mode_index); +spec_occ = ofdm_spec_occ_drm(drm_mode_index, spec_occ_index); diff --git a/ofdm/drm/getRefFreq.m b/ofdm/drm/getRefFreq.m new file mode 100644 index 0000000..7a8c0bb --- /dev/null +++ b/ofdm/drm/getRefFreq.m @@ -0,0 +1,30 @@ +function [ref_c ref_p ref_a] = getRefFreq(drmMode) + +switch drmMode + case 'A' + ref_c = [18 54 72]; + ref_p = [205 836 215]; + ref_a = sqrt(2)*ones(1,3); + + case 'B' + ref_c = [16 48 64]; + ref_p = [331 651 555]; + ref_a = sqrt(2)*ones(1,3); + + case 'C' + ref_c = [11 33 44]; + ref_p = [214 392 242]; + ref_a = sqrt(2)*ones(1,3); + + case 'D' + ref_c = [ 7 21 28]; + ref_p = [788 1014 332]; + ref_a = sqrt(2)*ones(1,3); + + case 'E' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode E!'); + +end; diff --git a/ofdm/drm/getRefGain.m b/ofdm/drm/getRefGain.m new file mode 100644 index 0000000..04339e5 --- /dev/null +++ b/ofdm/drm/getRefGain.m @@ -0,0 +1,41 @@ +function [ref_c ref_p ref_a] = getRefGain(spec_occ, ofdm_params, sym_count) + +switch ofdm_params.mode + case 'A' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode A!'); + + case 'B' + k0 = 1; + x = 2; + y = 3; + k = (spec_occ.kmin:1:spec_occ.kmax); + ref_c = 1 + 2*mod(sym_count,3)+6*k; + ref_c(find(ref_c > spec_occ.kmax)) = []; + ref_c(find(ref_c < spec_occ.kmin)) = []; + n = mod(sym_count, y); + m = floor(sym_count/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+sym_count)*ofdm_params.Q, 1024); + ref_a = sqrt(2)*ones(1,length(ref_c)); + + case 'C' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode C!'); + + case 'D' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode D!'); + + case 'E' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode E!'); +end; \ No newline at end of file diff --git a/ofdm/drm/getRefTime.m b/ofdm/drm/getRefTime.m new file mode 100644 index 0000000..d2e826b --- /dev/null +++ b/ofdm/drm/getRefTime.m @@ -0,0 +1,36 @@ +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 'A' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode A!'); + + case 'B' + ref_c = ref_B_c; + ref_p = ref_B_p; + ref_a = ref_B_a; + + case 'C' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode C!'); + + case 'D' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode D!'); + + case 'E' + ref_c = []; + ref_p = []; + ref_a = []; + error ('Implement Mode E!'); +end; \ No newline at end of file