diff options
| author | Eli Zaretskii | 2015-05-30 14:00:06 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2015-05-30 14:00:06 +0300 |
| commit | 5e73eab8faaa6c5198d445d8625db53971300777 (patch) | |
| tree | 01b5d149f387a23d0862d4e36650e618593887cf | |
| parent | 71f1139cf97e805f8e610dc477f2b90f0d8d4bee (diff) | |
| download | emacs-5e73eab8faaa6c5198d445d8625db53971300777.tar.gz emacs-5e73eab8faaa6c5198d445d8625db53971300777.zip | |
Restore EOL format testing in etags
* test/etags/ETAGS.good_1, test/etags/ETAGS.good_2:
* test/etags/ETAGS.good_3, test/etags/ETAGS.good_4:
* test/etags/ETAGS.good_5, test/etags/CTAGS.good: Adjust to
test-case changes below.
* test/etags/html-src/algrthms.html: Convert back to DOS EOL format.
* test/etags/cp-src/c.C (B): Add back stray CR character.
* test/etags/c-src/dostorture.c: Add back.
* test/etags/Makefile (CSRC): Add back c-src/dostorture.c.
| -rw-r--r-- | test/etags/CTAGS.good | 11 | ||||
| -rw-r--r-- | test/etags/ETAGS.good_1 | 111 | ||||
| -rw-r--r-- | test/etags/ETAGS.good_2 | 125 | ||||
| -rw-r--r-- | test/etags/ETAGS.good_3 | 127 | ||||
| -rw-r--r-- | test/etags/ETAGS.good_4 | 111 | ||||
| -rw-r--r-- | test/etags/ETAGS.good_5 | 141 | ||||
| -rw-r--r-- | test/etags/Makefile | 2 | ||||
| -rw-r--r-- | test/etags/c-src/dostorture.c | 107 | ||||
| -rw-r--r-- | test/etags/cp-src/c.C | 2 | ||||
| -rw-r--r-- | test/etags/html-src/algrthms.html | 1038 |
10 files changed, 979 insertions, 796 deletions
diff --git a/test/etags/CTAGS.good b/test/etags/CTAGS.good index 2cfadb9ec6e..52c335a5d4c 100644 --- a/test/etags/CTAGS.good +++ b/test/etags/CTAGS.good | |||
| @@ -3544,7 +3544,9 @@ not_bol c-src/emacs/src/regex.h 391 | |||
| 3544 | not_eol c-src/emacs/src/regex.h 394 | 3544 | not_eol c-src/emacs/src/regex.h 394 |
| 3545 | not_single_kboard_state c-src/emacs/src/keyboard.c /^not_single_kboard_state (KBOARD *kboard)$/ | 3545 | not_single_kboard_state c-src/emacs/src/keyboard.c /^not_single_kboard_state (KBOARD *kboard)$/ |
| 3546 | notag2 c-src/torture.c 26 | 3546 | notag2 c-src/torture.c 26 |
| 3547 | notag2 c-src/dostorture.c 26 | ||
| 3547 | notag4 c-src/torture.c 45 | 3548 | notag4 c-src/torture.c 45 |
| 3549 | notag4 c-src/dostorture.c 45 | ||
| 3548 | notinname c-src/etags.c /^#define notinname(c) (_nin[CHAR (c)]) \/* c is not / | 3550 | notinname c-src/etags.c /^#define notinname(c) (_nin[CHAR (c)]) \/* c is not / |
| 3549 | npending c-src/emacs/src/keyboard.c 7244 | 3551 | npending c-src/emacs/src/keyboard.c 7244 |
| 3550 | ntool_bar_items c-src/emacs/src/keyboard.c 7974 | 3552 | ntool_bar_items c-src/emacs/src/keyboard.c 7974 |
| @@ -3715,8 +3717,11 @@ post pyt-src/server.py /^ def post(self):$/ | |||
| 3715 | post pyt-src/server.py /^ def post(self):$/ | 3717 | post pyt-src/server.py /^ def post(self):$/ |
| 3716 | pot_etags_version c-src/etags.c 81 | 3718 | pot_etags_version c-src/etags.c 81 |
| 3717 | pp1 c-src/torture.c /^int pp1($/ | 3719 | pp1 c-src/torture.c /^int pp1($/ |
| 3720 | pp1 c-src/dostorture.c /^int pp1($/ | ||
| 3718 | pp2 c-src/torture.c /^pp2$/ | 3721 | pp2 c-src/torture.c /^pp2$/ |
| 3722 | pp2 c-src/dostorture.c /^pp2$/ | ||
| 3719 | pp3 c-src/torture.c /^pp3(int bar)$/ | 3723 | pp3 c-src/torture.c /^pp3(int bar)$/ |
| 3724 | pp3 c-src/dostorture.c /^pp3(int bar)$/ | ||
| 3720 | pp_bas_cat prol-src/natded.prolog /^pp_bas_cat(Cat):-$/ | 3725 | pp_bas_cat prol-src/natded.prolog /^pp_bas_cat(Cat):-$/ |
| 3721 | pp_cat prol-src/natded.prolog /^pp_cat(Syn:Sem):-$/ | 3726 | pp_cat prol-src/natded.prolog /^pp_cat(Syn:Sem):-$/ |
| 3722 | pp_exp prol-src/natded.prolog /^pp_exp('NIL'):-$/ | 3727 | pp_exp prol-src/natded.prolog /^pp_exp('NIL'):-$/ |
| @@ -4097,12 +4102,18 @@ tag-re-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-re-match-p (re) | |||
| 4097 | tag-symbol-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-symbol-match-p (tag)$/ | 4102 | tag-symbol-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-symbol-match-p (tag)$/ |
| 4098 | tag-word-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-word-match-p (tag)$/ | 4103 | tag-word-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-word-match-p (tag)$/ |
| 4099 | tag1 c-src/torture.c /^(*tag1 (sig, handler)) ()$/ | 4104 | tag1 c-src/torture.c /^(*tag1 (sig, handler)) ()$/ |
| 4105 | tag1 c-src/dostorture.c /^(*tag1 (sig, handler)) ()$/ | ||
| 4100 | tag1 c-src/h.h 110 | 4106 | tag1 c-src/h.h 110 |
| 4101 | tag2 c-src/torture.c /^(*tag2 (sig, handler)) ()$/ | 4107 | tag2 c-src/torture.c /^(*tag2 (sig, handler)) ()$/ |
| 4108 | tag2 c-src/dostorture.c /^(*tag2 (sig, handler)) ()$/ | ||
| 4102 | tag3 c-src/torture.c /^(*tag3 (int sig, void (*handler) (int))) (int)$/ | 4109 | tag3 c-src/torture.c /^(*tag3 (int sig, void (*handler) (int))) (int)$/ |
| 4110 | tag3 c-src/dostorture.c /^(*tag3 (int sig, void (*handler) (int))) (int)$/ | ||
| 4103 | tag4 c-src/torture.c /^(*tag4 (int sig, void (*handler) (int))) (int)$/ | 4111 | tag4 c-src/torture.c /^(*tag4 (int sig, void (*handler) (int))) (int)$/ |
| 4112 | tag4 c-src/dostorture.c /^(*tag4 (int sig, void (*handler) (int))) (int)$/ | ||
| 4104 | tag5 c-src/torture.c /^tag5 (handler, arg)$/ | 4113 | tag5 c-src/torture.c /^tag5 (handler, arg)$/ |
| 4114 | tag5 c-src/dostorture.c /^tag5 (handler, arg)$/ | ||
| 4105 | tag6 c-src/torture.c /^tag6 (void (*handler) (void *), void *arg)$/ | 4115 | tag6 c-src/torture.c /^tag6 (void (*handler) (void *), void *arg)$/ |
| 4116 | tag6 c-src/dostorture.c /^tag6 (void (*handler) (void *), void *arg)$/ | ||
| 4106 | tag_or_ch c-src/emacs/src/lisp.h 3026 | 4117 | tag_or_ch c-src/emacs/src/lisp.h 3026 |
| 4107 | taggedfname c-src/etags.c 207 | 4118 | taggedfname c-src/etags.c 207 |
| 4108 | tags-add-tables el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-add-tables 'ask-user$/ | 4119 | tags-add-tables el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-add-tables 'ask-user$/ |
diff --git a/test/etags/ETAGS.good_1 b/test/etags/ETAGS.good_1 index ebd079f253a..a8e826f5df3 100644 --- a/test/etags/ETAGS.good_1 +++ b/test/etags/ETAGS.good_1 | |||
| @@ -579,6 +579,19 @@ char **tab_fill(tab_fill70,1129 | |||
| 579 | int tab_delete_first(91,1638 | 579 | int tab_delete_first(91,1638 |
| 580 | int tab_count_words(103,1820 | 580 | int tab_count_words(103,1820 |
| 581 | 581 | ||
| 582 | c-src/dostorture.c,198 | ||
| 583 | (*tag1 tag118,468 | ||
| 584 | #define notag2 26,577 | ||
| 585 | (*tag2 tag229,657 | ||
| 586 | (*tag3 tag339,809 | ||
| 587 | #define notag4 45,904 | ||
| 588 | (*tag4 tag448,1001 | ||
| 589 | tag5 57,1136 | ||
| 590 | tag6 66,1272 | ||
| 591 | int pp1(74,1389 | ||
| 592 | pp287,1504 | ||
| 593 | pp3(100,1616 | ||
| 594 | |||
| 582 | c-src/emacs/src/gmalloc.c,3539 | 595 | c-src/emacs/src/gmalloc.c,3539 |
| 583 | #define USE_PTHREAD25,1002 | 596 | #define USE_PTHREAD25,1002 |
| 584 | #undef get_current_dir_name33,1126 | 597 | #undef get_current_dir_name33,1126 |
| @@ -1896,46 +1909,46 @@ template <class C, int n> class AT 52,1668 | |||
| 1896 | class AU 53,1716 | 1909 | class AU 53,1716 |
| 1897 | class B<B54,1735 | 1910 | class B<B54,1735 |
| 1898 | class B<int> { void f(54,1735 | 1911 | class B<int> { void f(54,1735 |
| 1899 | const A::B::T& abt 55,1765 | 1912 | const A::B::T& abt 55,1766 |
| 1900 | class A 56,1791 | 1913 | class A 56,1792 |
| 1901 | class A { class B 56,1791 | 1914 | class A { class B 56,1792 |
| 1902 | class A 57,1826 | 1915 | class A 57,1827 |
| 1903 | A operator+(59,1860 | 1916 | A operator+(59,1861 |
| 1904 | is_muldiv_operation(61,1887 | 1917 | is_muldiv_operation(61,1888 |
| 1905 | domain foo 68,1955 | 1918 | domain foo 68,1956 |
| 1906 | void f(69,1968 | 1919 | void f(69,1969 |
| 1907 | void A::A(A72,1989 | 1920 | void A::A(A72,1990 |
| 1908 | struct A 73,2004 | 1921 | struct A 73,2005 |
| 1909 | struct B 74,2022 | 1922 | struct B 74,2023 |
| 1910 | void B::B(B75,2041 | 1923 | void B::B(B75,2042 |
| 1911 | void BE_Node::BE_Node(BE_Node76,2056 | 1924 | void BE_Node::BE_Node(BE_Node76,2057 |
| 1912 | class BE_Node 77,2083 | 1925 | class BE_Node 77,2084 |
| 1913 | struct foo 79,2102 | 1926 | struct foo 79,2103 |
| 1914 | class test 86,2156 | 1927 | class test 86,2157 |
| 1915 | int f(87,2169 | 1928 | int f(87,2170 |
| 1916 | int ff(89,2231 | 1929 | int ff(89,2232 |
| 1917 | int g(90,2254 | 1930 | int g(90,2255 |
| 1918 | class AST_Root 92,2278 | 1931 | class AST_Root 92,2279 |
| 1919 | AST_ConcreteType::AST_ConcreteType(99,2393 | 1932 | AST_ConcreteType::AST_ConcreteType(99,2394 |
| 1920 | AST_Array::AST_Array(107,2532 | 1933 | AST_Array::AST_Array(107,2533 |
| 1921 | void f(115,2733 | 1934 | void f(115,2734 |
| 1922 | struct A 117,2753 | 1935 | struct A 117,2754 |
| 1923 | A::~A(~A120,2777 | 1936 | A::~A(~A120,2778 |
| 1924 | struct B 122,2789 | 1937 | struct B 122,2790 |
| 1925 | ~B(123,2800 | 1938 | ~B(123,2801 |
| 1926 | enum {dog,dog126,2817 | 1939 | enum {dog,dog126,2818 |
| 1927 | enum {dog, cat}cat126,2817 | 1940 | enum {dog, cat}cat126,2818 |
| 1928 | enum {dog, cat} animals;126,2817 | 1941 | enum {dog, cat} animals;126,2818 |
| 1929 | struct {int teats;} cow;127,2842 | 1942 | struct {int teats;} cow;127,2843 |
| 1930 | class Boo 129,2868 | 1943 | class Boo 129,2869 |
| 1931 | enum {dog,dog130,2880 | 1944 | enum {dog,dog130,2881 |
| 1932 | enum {dog, cat}cat130,2880 | 1945 | enum {dog, cat}cat130,2881 |
| 1933 | foo(133,2954 | 1946 | foo(133,2955 |
| 1934 | Boo(137,2995 | 1947 | Boo(137,2996 |
| 1935 | Boo::Boo(141,3070 | 1948 | Boo::Boo(141,3071 |
| 1936 | typedef int should_see_this_one_enclosed_in_extern_C;149,3155 | 1949 | typedef int should_see_this_one_enclosed_in_extern_C;149,3156 |
| 1937 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228 | 1950 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3229 |
| 1938 | typedef int should_see_this_array_type[should_see_this_array_type156,3310 | 1951 | typedef int should_see_this_array_type[should_see_this_array_type156,3311 |
| 1939 | 1952 | ||
| 1940 | cp-src/burton.cpp,124 | 1953 | cp-src/burton.cpp,124 |
| 1941 | ::dummy::dummy test::dummy1(dummy11,0 | 1954 | ::dummy::dummy test::dummy1(dummy11,0 |
| @@ -2278,15 +2291,15 @@ Comunicati e iniziative32,976 | |||
| 2278 | Ultime notizie dall'associazione63,2030 | 2291 | Ultime notizie dall'associazione63,2030 |
| 2279 | 2292 | ||
| 2280 | html-src/algrthms.html,467 | 2293 | html-src/algrthms.html,467 |
| 2281 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,271 | 2294 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,277 |
| 2282 | Descriptionalgorithms10,472 | 2295 | Descriptionalgorithms10,481 |
| 2283 | Generating the Datagenalgorithm48,1948 | 2296 | Generating the Datagenalgorithm48,1995 |
| 2284 | Convolutionallyconalgorithm55,2458 | 2297 | Convolutionallyconalgorithm55,2512 |
| 2285 | Nextstatetable262,11326 | 2298 | Nextstatetable262,11587 |
| 2286 | Outputoutputtable350,13566 | 2299 | Outputoutputtable350,13915 |
| 2287 | Mapping the Channel Symbolsmapping433,15781 | 2300 | Mapping the Channel Symbolsmapping433,16213 |
| 2288 | Adding Noise to theaddnoise439,16169 | 2301 | Adding Noise to theaddnoise439,16607 |
| 2289 | Quantizing the Receivedquantizing469,18632 | 2302 | Quantizing the Receivedquantizing469,19100 |
| 2290 | 2303 | ||
| 2291 | html-src/software.html,439 | 2304 | html-src/software.html,439 |
| 2292 | Francesco Potortì Software Page9,280 | 2305 | Francesco Potortì Software Page9,280 |
diff --git a/test/etags/ETAGS.good_2 b/test/etags/ETAGS.good_2 index 12554bd95f1..73336b7aaa0 100644 --- a/test/etags/ETAGS.good_2 +++ b/test/etags/ETAGS.good_2 | |||
| @@ -646,6 +646,19 @@ char **tab_fill(tab_fill70,1129 | |||
| 646 | int tab_delete_first(91,1638 | 646 | int tab_delete_first(91,1638 |
| 647 | int tab_count_words(103,1820 | 647 | int tab_count_words(103,1820 |
| 648 | 648 | ||
| 649 | c-src/dostorture.c,198 | ||
| 650 | (*tag1 tag118,468 | ||
| 651 | #define notag2 26,577 | ||
| 652 | (*tag2 tag229,657 | ||
| 653 | (*tag3 tag339,809 | ||
| 654 | #define notag4 45,904 | ||
| 655 | (*tag4 tag448,1001 | ||
| 656 | tag5 57,1136 | ||
| 657 | tag6 66,1272 | ||
| 658 | int pp1(74,1389 | ||
| 659 | pp287,1504 | ||
| 660 | pp3(100,1616 | ||
| 661 | |||
| 649 | c-src/emacs/src/gmalloc.c,6643 | 662 | c-src/emacs/src/gmalloc.c,6643 |
| 650 | #define USE_PTHREAD25,1002 | 663 | #define USE_PTHREAD25,1002 |
| 651 | #undef get_current_dir_name33,1126 | 664 | #undef get_current_dir_name33,1126 |
| @@ -2402,53 +2415,53 @@ template <class C, int n> class AT 52,1668 | |||
| 2402 | class AU 53,1716 | 2415 | class AU 53,1716 |
| 2403 | class B<B54,1735 | 2416 | class B<B54,1735 |
| 2404 | class B<int> { void f(54,1735 | 2417 | class B<int> { void f(54,1735 |
| 2405 | const A::B::T& abt 55,1765 | 2418 | const A::B::T& abt 55,1766 |
| 2406 | class A 56,1791 | 2419 | class A 56,1792 |
| 2407 | class A { class B 56,1791 | 2420 | class A { class B 56,1792 |
| 2408 | class A { class B { int f(56,1791 | 2421 | class A { class B { int f(56,1792 |
| 2409 | class A 57,1826 | 2422 | class A 57,1827 |
| 2410 | int get_data(58,1836 | 2423 | int get_data(58,1837 |
| 2411 | A operator+(59,1860 | 2424 | A operator+(59,1861 |
| 2412 | is_muldiv_operation(61,1887 | 2425 | is_muldiv_operation(61,1888 |
| 2413 | domain foo 68,1955 | 2426 | domain foo 68,1956 |
| 2414 | void f(69,1968 | 2427 | void f(69,1969 |
| 2415 | void A::A(A72,1989 | 2428 | void A::A(A72,1990 |
| 2416 | struct A 73,2004 | 2429 | struct A 73,2005 |
| 2417 | struct A { A(73,2004 | 2430 | struct A { A(73,2005 |
| 2418 | struct B 74,2022 | 2431 | struct B 74,2023 |
| 2419 | struct B { B(74,2022 | 2432 | struct B { B(74,2023 |
| 2420 | void B::B(B75,2041 | 2433 | void B::B(B75,2042 |
| 2421 | void BE_Node::BE_Node(BE_Node76,2056 | 2434 | void BE_Node::BE_Node(BE_Node76,2057 |
| 2422 | class BE_Node 77,2083 | 2435 | class BE_Node 77,2084 |
| 2423 | struct foo 79,2102 | 2436 | struct foo 79,2103 |
| 2424 | class test 86,2156 | 2437 | class test 86,2157 |
| 2425 | int f(87,2169 | 2438 | int f(87,2170 |
| 2426 | int ff(89,2231 | 2439 | int ff(89,2232 |
| 2427 | int g(90,2254 | 2440 | int g(90,2255 |
| 2428 | class AST_Root 92,2278 | 2441 | class AST_Root 92,2279 |
| 2429 | class AST_Root;96,2327 | 2442 | class AST_Root;96,2328 |
| 2430 | AST_ConcreteType::AST_ConcreteType(99,2393 | 2443 | AST_ConcreteType::AST_ConcreteType(99,2394 |
| 2431 | AST_Array::AST_Array(107,2532 | 2444 | AST_Array::AST_Array(107,2533 |
| 2432 | void f(115,2733 | 2445 | void f(115,2734 |
| 2433 | struct A 117,2753 | 2446 | struct A 117,2754 |
| 2434 | ~A(118,2764 | 2447 | ~A(118,2765 |
| 2435 | A::~A(~A120,2777 | 2448 | A::~A(~A120,2778 |
| 2436 | struct B 122,2789 | 2449 | struct B 122,2790 |
| 2437 | ~B(123,2800 | 2450 | ~B(123,2801 |
| 2438 | enum {dog,dog126,2817 | 2451 | enum {dog,dog126,2818 |
| 2439 | enum {dog, cat}cat126,2817 | 2452 | enum {dog, cat}cat126,2818 |
| 2440 | enum {dog, cat} animals;126,2817 | 2453 | enum {dog, cat} animals;126,2818 |
| 2441 | struct {int teats;} cow;127,2842 | 2454 | struct {int teats;} cow;127,2843 |
| 2442 | class Boo 129,2868 | 2455 | class Boo 129,2869 |
| 2443 | enum {dog,dog130,2880 | 2456 | enum {dog,dog130,2881 |
| 2444 | enum {dog, cat}cat130,2880 | 2457 | enum {dog, cat}cat130,2881 |
| 2445 | foo(133,2954 | 2458 | foo(133,2955 |
| 2446 | Boo(137,2995 | 2459 | Boo(137,2996 |
| 2447 | Boo(138,3052 | 2460 | Boo(138,3053 |
| 2448 | Boo::Boo(141,3070 | 2461 | Boo::Boo(141,3071 |
| 2449 | typedef int should_see_this_one_enclosed_in_extern_C;149,3155 | 2462 | typedef int should_see_this_one_enclosed_in_extern_C;149,3156 |
| 2450 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228 | 2463 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3229 |
| 2451 | typedef int should_see_this_array_type[should_see_this_array_type156,3310 | 2464 | typedef int should_see_this_array_type[should_see_this_array_type156,3311 |
| 2452 | 2465 | ||
| 2453 | cp-src/burton.cpp,124 | 2466 | cp-src/burton.cpp,124 |
| 2454 | ::dummy::dummy test::dummy1(dummy11,0 | 2467 | ::dummy::dummy test::dummy1(dummy11,0 |
| @@ -2845,15 +2858,15 @@ Comunicati e iniziative32,976 | |||
| 2845 | Ultime notizie dall'associazione63,2030 | 2858 | Ultime notizie dall'associazione63,2030 |
| 2846 | 2859 | ||
| 2847 | html-src/algrthms.html,467 | 2860 | html-src/algrthms.html,467 |
| 2848 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,271 | 2861 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,277 |
| 2849 | Descriptionalgorithms10,472 | 2862 | Descriptionalgorithms10,481 |
| 2850 | Generating the Datagenalgorithm48,1948 | 2863 | Generating the Datagenalgorithm48,1995 |
| 2851 | Convolutionallyconalgorithm55,2458 | 2864 | Convolutionallyconalgorithm55,2512 |
| 2852 | Nextstatetable262,11326 | 2865 | Nextstatetable262,11587 |
| 2853 | Outputoutputtable350,13566 | 2866 | Outputoutputtable350,13915 |
| 2854 | Mapping the Channel Symbolsmapping433,15781 | 2867 | Mapping the Channel Symbolsmapping433,16213 |
| 2855 | Adding Noise to theaddnoise439,16169 | 2868 | Adding Noise to theaddnoise439,16607 |
| 2856 | Quantizing the Receivedquantizing469,18632 | 2869 | Quantizing the Receivedquantizing469,19100 |
| 2857 | 2870 | ||
| 2858 | html-src/software.html,439 | 2871 | html-src/software.html,439 |
| 2859 | Francesco Potortì Software Page9,280 | 2872 | Francesco Potortì Software Page9,280 |
diff --git a/test/etags/ETAGS.good_3 b/test/etags/ETAGS.good_3 index 714903c205f..950ed4ff67e 100644 --- a/test/etags/ETAGS.good_3 +++ b/test/etags/ETAGS.good_3 | |||
| @@ -648,6 +648,19 @@ char **tab_fill(tab_fill70,1129 | |||
| 648 | int tab_delete_first(91,1638 | 648 | int tab_delete_first(91,1638 |
| 649 | int tab_count_words(103,1820 | 649 | int tab_count_words(103,1820 |
| 650 | 650 | ||
| 651 | c-src/dostorture.c,198 | ||
| 652 | (*tag1 tag118,468 | ||
| 653 | #define notag2 26,577 | ||
| 654 | (*tag2 tag229,657 | ||
| 655 | (*tag3 tag339,809 | ||
| 656 | #define notag4 45,904 | ||
| 657 | (*tag4 tag448,1001 | ||
| 658 | tag5 57,1136 | ||
| 659 | tag6 66,1272 | ||
| 660 | int pp1(74,1389 | ||
| 661 | pp287,1504 | ||
| 662 | pp3(100,1616 | ||
| 663 | |||
| 651 | c-src/emacs/src/gmalloc.c,4207 | 664 | c-src/emacs/src/gmalloc.c,4207 |
| 652 | #define USE_PTHREAD25,1002 | 665 | #define USE_PTHREAD25,1002 |
| 653 | #undef get_current_dir_name33,1126 | 666 | #undef get_current_dir_name33,1126 |
| @@ -2186,54 +2199,54 @@ class AU 53,1716 | |||
| 2186 | class AU { T x;53,1716 | 2199 | class AU { T x;53,1716 |
| 2187 | class B<B54,1735 | 2200 | class B<B54,1735 |
| 2188 | class B<int> { void f(54,1735 | 2201 | class B<int> { void f(54,1735 |
| 2189 | const A::B::T& abt 55,1765 | 2202 | const A::B::T& abt 55,1766 |
| 2190 | class A 56,1791 | 2203 | class A 56,1792 |
| 2191 | class A { class B 56,1791 | 2204 | class A { class B 56,1792 |
| 2192 | class A 57,1826 | 2205 | class A 57,1827 |
| 2193 | A operator+(59,1860 | 2206 | A operator+(59,1861 |
| 2194 | is_muldiv_operation(61,1887 | 2207 | is_muldiv_operation(61,1888 |
| 2195 | domain foo 68,1955 | 2208 | domain foo 68,1956 |
| 2196 | void f(69,1968 | 2209 | void f(69,1969 |
| 2197 | void A::A(A72,1989 | 2210 | void A::A(A72,1990 |
| 2198 | struct A 73,2004 | 2211 | struct A 73,2005 |
| 2199 | struct B 74,2022 | 2212 | struct B 74,2023 |
| 2200 | void B::B(B75,2041 | 2213 | void B::B(B75,2042 |
| 2201 | void BE_Node::BE_Node(BE_Node76,2056 | 2214 | void BE_Node::BE_Node(BE_Node76,2057 |
| 2202 | class BE_Node 77,2083 | 2215 | class BE_Node 77,2084 |
| 2203 | struct foo 79,2102 | 2216 | struct foo 79,2103 |
| 2204 | int x;80,2115 | 2217 | int x;80,2116 |
| 2205 | class test 86,2156 | 2218 | class test 86,2157 |
| 2206 | int f(87,2169 | 2219 | int f(87,2170 |
| 2207 | int ff(89,2231 | 2220 | int ff(89,2232 |
| 2208 | int g(90,2254 | 2221 | int g(90,2255 |
| 2209 | class AST_Root 92,2278 | 2222 | class AST_Root 92,2279 |
| 2210 | AST_ConcreteType::AST_ConcreteType(99,2393 | 2223 | AST_ConcreteType::AST_ConcreteType(99,2394 |
| 2211 | AST_Array::AST_Array(107,2532 | 2224 | AST_Array::AST_Array(107,2533 |
| 2212 | void f(115,2733 | 2225 | void f(115,2734 |
| 2213 | struct A 117,2753 | 2226 | struct A 117,2754 |
| 2214 | A::~A(~A120,2777 | 2227 | A::~A(~A120,2778 |
| 2215 | struct B 122,2789 | 2228 | struct B 122,2790 |
| 2216 | ~B(123,2800 | 2229 | ~B(123,2801 |
| 2217 | enum {dog,dog126,2817 | 2230 | enum {dog,dog126,2818 |
| 2218 | enum {dog, cat}cat126,2817 | 2231 | enum {dog, cat}cat126,2818 |
| 2219 | enum {dog, cat} animals;126,2817 | 2232 | enum {dog, cat} animals;126,2818 |
| 2220 | struct {int teats;127,2842 | 2233 | struct {int teats;127,2843 |
| 2221 | struct {int teats;} cow;127,2842 | 2234 | struct {int teats;} cow;127,2843 |
| 2222 | class Boo 129,2868 | 2235 | class Boo 129,2869 |
| 2223 | enum {dog,dog130,2880 | 2236 | enum {dog,dog130,2881 |
| 2224 | enum {dog, cat}cat130,2880 | 2237 | enum {dog, cat}cat130,2881 |
| 2225 | enum {dog, cat} animals;130,2880 | 2238 | enum {dog, cat} animals;130,2881 |
| 2226 | struct {int treats;131,2909 | 2239 | struct {int treats;131,2910 |
| 2227 | struct {int treats;} cow;131,2909 | 2240 | struct {int treats;} cow;131,2910 |
| 2228 | int i,132,2939 | 2241 | int i,132,2940 |
| 2229 | int i,a,132,2939 | 2242 | int i,a,132,2940 |
| 2230 | int i,a,b;132,2939 | 2243 | int i,a,b;132,2940 |
| 2231 | foo(133,2954 | 2244 | foo(133,2955 |
| 2232 | Boo(137,2995 | 2245 | Boo(137,2996 |
| 2233 | Boo::Boo(141,3070 | 2246 | Boo::Boo(141,3071 |
| 2234 | typedef int should_see_this_one_enclosed_in_extern_C;149,3155 | 2247 | typedef int should_see_this_one_enclosed_in_extern_C;149,3156 |
| 2235 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228 | 2248 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3229 |
| 2236 | typedef int should_see_this_array_type[should_see_this_array_type156,3310 | 2249 | typedef int should_see_this_array_type[should_see_this_array_type156,3311 |
| 2237 | 2250 | ||
| 2238 | cp-src/burton.cpp,124 | 2251 | cp-src/burton.cpp,124 |
| 2239 | ::dummy::dummy test::dummy1(dummy11,0 | 2252 | ::dummy::dummy test::dummy1(dummy11,0 |
| @@ -2595,15 +2608,15 @@ Comunicati e iniziative32,976 | |||
| 2595 | Ultime notizie dall'associazione63,2030 | 2608 | Ultime notizie dall'associazione63,2030 |
| 2596 | 2609 | ||
| 2597 | html-src/algrthms.html,467 | 2610 | html-src/algrthms.html,467 |
| 2598 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,271 | 2611 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,277 |
| 2599 | Descriptionalgorithms10,472 | 2612 | Descriptionalgorithms10,481 |
| 2600 | Generating the Datagenalgorithm48,1948 | 2613 | Generating the Datagenalgorithm48,1995 |
| 2601 | Convolutionallyconalgorithm55,2458 | 2614 | Convolutionallyconalgorithm55,2512 |
| 2602 | Nextstatetable262,11326 | 2615 | Nextstatetable262,11587 |
| 2603 | Outputoutputtable350,13566 | 2616 | Outputoutputtable350,13915 |
| 2604 | Mapping the Channel Symbolsmapping433,15781 | 2617 | Mapping the Channel Symbolsmapping433,16213 |
| 2605 | Adding Noise to theaddnoise439,16169 | 2618 | Adding Noise to theaddnoise439,16607 |
| 2606 | Quantizing the Receivedquantizing469,18632 | 2619 | Quantizing the Receivedquantizing469,19100 |
| 2607 | 2620 | ||
| 2608 | html-src/software.html,439 | 2621 | html-src/software.html,439 |
| 2609 | Francesco Potortì Software Page9,280 | 2622 | Francesco Potortì Software Page9,280 |
diff --git a/test/etags/ETAGS.good_4 b/test/etags/ETAGS.good_4 index 5dd8d551460..01b27618f2b 100644 --- a/test/etags/ETAGS.good_4 +++ b/test/etags/ETAGS.good_4 | |||
| @@ -603,6 +603,19 @@ char **tab_fill(tab_fill70,1129 | |||
| 603 | int tab_delete_first(91,1638 | 603 | int tab_delete_first(91,1638 |
| 604 | int tab_count_words(103,1820 | 604 | int tab_count_words(103,1820 |
| 605 | 605 | ||
| 606 | c-src/dostorture.c,198 | ||
| 607 | (*tag1 tag118,468 | ||
| 608 | #define notag2 26,577 | ||
| 609 | (*tag2 tag229,657 | ||
| 610 | (*tag3 tag339,809 | ||
| 611 | #define notag4 45,904 | ||
| 612 | (*tag4 tag448,1001 | ||
| 613 | tag5 57,1136 | ||
| 614 | tag6 66,1272 | ||
| 615 | int pp1(74,1389 | ||
| 616 | pp287,1504 | ||
| 617 | pp3(100,1616 | ||
| 618 | |||
| 606 | c-src/emacs/src/gmalloc.c,3539 | 619 | c-src/emacs/src/gmalloc.c,3539 |
| 607 | #define USE_PTHREAD25,1002 | 620 | #define USE_PTHREAD25,1002 |
| 608 | #undef get_current_dir_name33,1126 | 621 | #undef get_current_dir_name33,1126 |
| @@ -2060,46 +2073,46 @@ template <class C, int n> class AT 52,1668 | |||
| 2060 | class AU 53,1716 | 2073 | class AU 53,1716 |
| 2061 | class B<B54,1735 | 2074 | class B<B54,1735 |
| 2062 | class B<int> { void f(54,1735 | 2075 | class B<int> { void f(54,1735 |
| 2063 | const A::B::T& abt 55,1765 | 2076 | const A::B::T& abt 55,1766 |
| 2064 | class A 56,1791 | 2077 | class A 56,1792 |
| 2065 | class A { class B 56,1791 | 2078 | class A { class B 56,1792 |
| 2066 | class A 57,1826 | 2079 | class A 57,1827 |
| 2067 | A operator+(59,1860 | 2080 | A operator+(59,1861 |
| 2068 | is_muldiv_operation(61,1887 | 2081 | is_muldiv_operation(61,1888 |
| 2069 | domain foo 68,1955 | 2082 | domain foo 68,1956 |
| 2070 | void f(69,1968 | 2083 | void f(69,1969 |
| 2071 | void A::A(A72,1989 | 2084 | void A::A(A72,1990 |
| 2072 | struct A 73,2004 | 2085 | struct A 73,2005 |
| 2073 | struct B 74,2022 | 2086 | struct B 74,2023 |
| 2074 | void B::B(B75,2041 | 2087 | void B::B(B75,2042 |
| 2075 | void BE_Node::BE_Node(BE_Node76,2056 | 2088 | void BE_Node::BE_Node(BE_Node76,2057 |
| 2076 | class BE_Node 77,2083 | 2089 | class BE_Node 77,2084 |
| 2077 | struct foo 79,2102 | 2090 | struct foo 79,2103 |
| 2078 | class test 86,2156 | 2091 | class test 86,2157 |
| 2079 | int f(87,2169 | 2092 | int f(87,2170 |
| 2080 | int ff(89,2231 | 2093 | int ff(89,2232 |
| 2081 | int g(90,2254 | 2094 | int g(90,2255 |
| 2082 | class AST_Root 92,2278 | 2095 | class AST_Root 92,2279 |
| 2083 | AST_ConcreteType::AST_ConcreteType(99,2393 | 2096 | AST_ConcreteType::AST_ConcreteType(99,2394 |
| 2084 | AST_Array::AST_Array(107,2532 | 2097 | AST_Array::AST_Array(107,2533 |
| 2085 | void f(115,2733 | 2098 | void f(115,2734 |
| 2086 | struct A 117,2753 | 2099 | struct A 117,2754 |
| 2087 | A::~A(~A120,2777 | 2100 | A::~A(~A120,2778 |
| 2088 | struct B 122,2789 | 2101 | struct B 122,2790 |
| 2089 | ~B(123,2800 | 2102 | ~B(123,2801 |
| 2090 | enum {dog,dog126,2817 | 2103 | enum {dog,dog126,2818 |
| 2091 | enum {dog, cat}cat126,2817 | 2104 | enum {dog, cat}cat126,2818 |
| 2092 | enum {dog, cat} animals;126,2817 | 2105 | enum {dog, cat} animals;126,2818 |
| 2093 | struct {int teats;} cow;127,2842 | 2106 | struct {int teats;} cow;127,2843 |
| 2094 | class Boo 129,2868 | 2107 | class Boo 129,2869 |
| 2095 | enum {dog,dog130,2880 | 2108 | enum {dog,dog130,2881 |
| 2096 | enum {dog, cat}cat130,2880 | 2109 | enum {dog, cat}cat130,2881 |
| 2097 | foo(133,2954 | 2110 | foo(133,2955 |
| 2098 | Boo(137,2995 | 2111 | Boo(137,2996 |
| 2099 | Boo::Boo(141,3070 | 2112 | Boo::Boo(141,3071 |
| 2100 | typedef int should_see_this_one_enclosed_in_extern_C;149,3155 | 2113 | typedef int should_see_this_one_enclosed_in_extern_C;149,3156 |
| 2101 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228 | 2114 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3229 |
| 2102 | typedef int should_see_this_array_type[should_see_this_array_type156,3310 | 2115 | typedef int should_see_this_array_type[should_see_this_array_type156,3311 |
| 2103 | 2116 | ||
| 2104 | cp-src/burton.cpp,124 | 2117 | cp-src/burton.cpp,124 |
| 2105 | ::dummy::dummy test::dummy1(dummy11,0 | 2118 | ::dummy::dummy test::dummy1(dummy11,0 |
| @@ -2442,15 +2455,15 @@ Comunicati e iniziative32,976 | |||
| 2442 | Ultime notizie dall'associazione63,2030 | 2455 | Ultime notizie dall'associazione63,2030 |
| 2443 | 2456 | ||
| 2444 | html-src/algrthms.html,467 | 2457 | html-src/algrthms.html,467 |
| 2445 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,271 | 2458 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,277 |
| 2446 | Descriptionalgorithms10,472 | 2459 | Descriptionalgorithms10,481 |
| 2447 | Generating the Datagenalgorithm48,1948 | 2460 | Generating the Datagenalgorithm48,1995 |
| 2448 | Convolutionallyconalgorithm55,2458 | 2461 | Convolutionallyconalgorithm55,2512 |
| 2449 | Nextstatetable262,11326 | 2462 | Nextstatetable262,11587 |
| 2450 | Outputoutputtable350,13566 | 2463 | Outputoutputtable350,13915 |
| 2451 | Mapping the Channel Symbolsmapping433,15781 | 2464 | Mapping the Channel Symbolsmapping433,16213 |
| 2452 | Adding Noise to theaddnoise439,16169 | 2465 | Adding Noise to theaddnoise439,16607 |
| 2453 | Quantizing the Receivedquantizing469,18632 | 2466 | Quantizing the Receivedquantizing469,19100 |
| 2454 | 2467 | ||
| 2455 | html-src/software.html,439 | 2468 | html-src/software.html,439 |
| 2456 | Francesco Potortì Software Page9,280 | 2469 | Francesco Potortì Software Page9,280 |
diff --git a/test/etags/ETAGS.good_5 b/test/etags/ETAGS.good_5 index 526ad4079b8..d84017245c9 100644 --- a/test/etags/ETAGS.good_5 +++ b/test/etags/ETAGS.good_5 | |||
| @@ -739,6 +739,19 @@ char **tab_fill(tab_fill70,1129 | |||
| 739 | int tab_delete_first(91,1638 | 739 | int tab_delete_first(91,1638 |
| 740 | int tab_count_words(103,1820 | 740 | int tab_count_words(103,1820 |
| 741 | 741 | ||
| 742 | c-src/dostorture.c,198 | ||
| 743 | (*tag1 tag118,468 | ||
| 744 | #define notag2 26,577 | ||
| 745 | (*tag2 tag229,657 | ||
| 746 | (*tag3 tag339,809 | ||
| 747 | #define notag4 45,904 | ||
| 748 | (*tag4 tag448,1001 | ||
| 749 | tag5 57,1136 | ||
| 750 | tag6 66,1272 | ||
| 751 | int pp1(74,1389 | ||
| 752 | pp287,1504 | ||
| 753 | pp3(100,1616 | ||
| 754 | |||
| 742 | c-src/emacs/src/gmalloc.c,7311 | 755 | c-src/emacs/src/gmalloc.c,7311 |
| 743 | #define USE_PTHREAD25,1002 | 756 | #define USE_PTHREAD25,1002 |
| 744 | #undef get_current_dir_name33,1126 | 757 | #undef get_current_dir_name33,1126 |
| @@ -2856,61 +2869,61 @@ class AU 53,1716 | |||
| 2856 | class AU { T x;53,1716 | 2869 | class AU { T x;53,1716 |
| 2857 | class B<B54,1735 | 2870 | class B<B54,1735 |
| 2858 | class B<int> { void f(54,1735 | 2871 | class B<int> { void f(54,1735 |
| 2859 | const A::B::T& abt 55,1765 | 2872 | const A::B::T& abt 55,1766 |
| 2860 | class A 56,1791 | 2873 | class A 56,1792 |
| 2861 | class A { class B 56,1791 | 2874 | class A { class B 56,1792 |
| 2862 | class A { class B { int f(56,1791 | 2875 | class A { class B { int f(56,1792 |
| 2863 | class A 57,1826 | 2876 | class A 57,1827 |
| 2864 | int get_data(58,1836 | 2877 | int get_data(58,1837 |
| 2865 | A operator+(59,1860 | 2878 | A operator+(59,1861 |
| 2866 | is_muldiv_operation(61,1887 | 2879 | is_muldiv_operation(61,1888 |
| 2867 | domain foo 68,1955 | 2880 | domain foo 68,1956 |
| 2868 | void f(69,1968 | 2881 | void f(69,1969 |
| 2869 | void A::A(A72,1989 | 2882 | void A::A(A72,1990 |
| 2870 | struct A 73,2004 | 2883 | struct A 73,2005 |
| 2871 | struct A { A(73,2004 | 2884 | struct A { A(73,2005 |
| 2872 | struct B 74,2022 | 2885 | struct B 74,2023 |
| 2873 | struct B { B(74,2022 | 2886 | struct B { B(74,2023 |
| 2874 | void B::B(B75,2041 | 2887 | void B::B(B75,2042 |
| 2875 | void BE_Node::BE_Node(BE_Node76,2056 | 2888 | void BE_Node::BE_Node(BE_Node76,2057 |
| 2876 | class BE_Node 77,2083 | 2889 | class BE_Node 77,2084 |
| 2877 | struct foo 79,2102 | 2890 | struct foo 79,2103 |
| 2878 | int x;80,2115 | 2891 | int x;80,2116 |
| 2879 | class test 86,2156 | 2892 | class test 86,2157 |
| 2880 | int f(87,2169 | 2893 | int f(87,2170 |
| 2881 | int ff(89,2231 | 2894 | int ff(89,2232 |
| 2882 | int g(90,2254 | 2895 | int g(90,2255 |
| 2883 | class AST_Root 92,2278 | 2896 | class AST_Root 92,2279 |
| 2884 | class AST_Root;96,2327 | 2897 | class AST_Root;96,2328 |
| 2885 | AST_ConcreteType::AST_ConcreteType(99,2393 | 2898 | AST_ConcreteType::AST_ConcreteType(99,2394 |
| 2886 | AST_Array::AST_Array(107,2532 | 2899 | AST_Array::AST_Array(107,2533 |
| 2887 | void f(115,2733 | 2900 | void f(115,2734 |
| 2888 | struct A 117,2753 | 2901 | struct A 117,2754 |
| 2889 | ~A(118,2764 | 2902 | ~A(118,2765 |
| 2890 | A::~A(~A120,2777 | 2903 | A::~A(~A120,2778 |
| 2891 | struct B 122,2789 | 2904 | struct B 122,2790 |
| 2892 | ~B(123,2800 | 2905 | ~B(123,2801 |
| 2893 | enum {dog,dog126,2817 | 2906 | enum {dog,dog126,2818 |
| 2894 | enum {dog, cat}cat126,2817 | 2907 | enum {dog, cat}cat126,2818 |
| 2895 | enum {dog, cat} animals;126,2817 | 2908 | enum {dog, cat} animals;126,2818 |
| 2896 | struct {int teats;127,2842 | 2909 | struct {int teats;127,2843 |
| 2897 | struct {int teats;} cow;127,2842 | 2910 | struct {int teats;} cow;127,2843 |
| 2898 | class Boo 129,2868 | 2911 | class Boo 129,2869 |
| 2899 | enum {dog,dog130,2880 | 2912 | enum {dog,dog130,2881 |
| 2900 | enum {dog, cat}cat130,2880 | 2913 | enum {dog, cat}cat130,2881 |
| 2901 | enum {dog, cat} animals;130,2880 | 2914 | enum {dog, cat} animals;130,2881 |
| 2902 | struct {int treats;131,2909 | 2915 | struct {int treats;131,2910 |
| 2903 | struct {int treats;} cow;131,2909 | 2916 | struct {int treats;} cow;131,2910 |
| 2904 | int i,132,2939 | 2917 | int i,132,2940 |
| 2905 | int i,a,132,2939 | 2918 | int i,a,132,2940 |
| 2906 | int i,a,b;132,2939 | 2919 | int i,a,b;132,2940 |
| 2907 | foo(133,2954 | 2920 | foo(133,2955 |
| 2908 | Boo(137,2995 | 2921 | Boo(137,2996 |
| 2909 | Boo(138,3052 | 2922 | Boo(138,3053 |
| 2910 | Boo::Boo(141,3070 | 2923 | Boo::Boo(141,3071 |
| 2911 | typedef int should_see_this_one_enclosed_in_extern_C;149,3155 | 2924 | typedef int should_see_this_one_enclosed_in_extern_C;149,3156 |
| 2912 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228 | 2925 | typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3229 |
| 2913 | typedef int should_see_this_array_type[should_see_this_array_type156,3310 | 2926 | typedef int should_see_this_array_type[should_see_this_array_type156,3311 |
| 2914 | 2927 | ||
| 2915 | cp-src/burton.cpp,124 | 2928 | cp-src/burton.cpp,124 |
| 2916 | ::dummy::dummy test::dummy1(dummy11,0 | 2929 | ::dummy::dummy test::dummy1(dummy11,0 |
| @@ -3326,15 +3339,15 @@ Comunicati e iniziative32,976 | |||
| 3326 | Ultime notizie dall'associazione63,2030 | 3339 | Ultime notizie dall'associazione63,2030 |
| 3327 | 3340 | ||
| 3328 | html-src/algrthms.html,467 | 3341 | html-src/algrthms.html,467 |
| 3329 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,271 | 3342 | Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,277 |
| 3330 | Descriptionalgorithms10,472 | 3343 | Descriptionalgorithms10,481 |
| 3331 | Generating the Datagenalgorithm48,1948 | 3344 | Generating the Datagenalgorithm48,1995 |
| 3332 | Convolutionallyconalgorithm55,2458 | 3345 | Convolutionallyconalgorithm55,2512 |
| 3333 | Nextstatetable262,11326 | 3346 | Nextstatetable262,11587 |
| 3334 | Outputoutputtable350,13566 | 3347 | Outputoutputtable350,13915 |
| 3335 | Mapping the Channel Symbolsmapping433,15781 | 3348 | Mapping the Channel Symbolsmapping433,16213 |
| 3336 | Adding Noise to theaddnoise439,16169 | 3349 | Adding Noise to theaddnoise439,16607 |
| 3337 | Quantizing the Receivedquantizing469,18632 | 3350 | Quantizing the Receivedquantizing469,19100 |
| 3338 | 3351 | ||
| 3339 | html-src/software.html,439 | 3352 | html-src/software.html,439 |
| 3340 | Francesco Potortì Software Page9,280 | 3353 | Francesco Potortì Software Page9,280 |
diff --git a/test/etags/Makefile b/test/etags/Makefile index 99ad41ebaab..c305a8b26b9 100644 --- a/test/etags/Makefile +++ b/test/etags/Makefile | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | ADASRC=$(addprefix ./ada-src/,etags-test-for.ada 2ataspri.adb 2ataspri.ads waroquiers.ada) | 1 | ADASRC=$(addprefix ./ada-src/,etags-test-for.ada 2ataspri.adb 2ataspri.ads waroquiers.ada) |
| 2 | ASRC=$(addprefix ./a-src/,empty.zz empty.zz.gz) | 2 | ASRC=$(addprefix ./a-src/,empty.zz empty.zz.gz) |
| 3 | CSRC=$(addprefix ./c-src/,abbrev.c .//c.c torture.c getopt.h etags.c\ | 3 | CSRC=$(addprefix ./c-src/,abbrev.c .//c.c torture.c getopt.h etags.c\ |
| 4 | exit.c exit.strange_suffix sysdep.h tab.c\ | 4 | exit.c exit.strange_suffix sysdep.h tab.c dostorture.c\ |
| 5 | emacs/src/gmalloc.c emacs/src/regex.h emacs/src/keyboard.c emacs/src/lisp.h\ | 5 | emacs/src/gmalloc.c emacs/src/regex.h emacs/src/keyboard.c emacs/src/lisp.h\ |
| 6 | machsyscalls.c machsyscalls.h fail.c a/b/b.c) ../etags/c-src/h.h | 6 | machsyscalls.c machsyscalls.h fail.c a/b/b.c) ../etags/c-src/h.h |
| 7 | CPSRC=$(addprefix ./cp-src/,c.C burton.cpp burton.cpp\ | 7 | CPSRC=$(addprefix ./cp-src/,c.C burton.cpp burton.cpp\ |
diff --git a/test/etags/c-src/dostorture.c b/test/etags/c-src/dostorture.c new file mode 100644 index 00000000000..5190734e0fe --- /dev/null +++ b/test/etags/c-src/dostorture.c | |||
| @@ -0,0 +1,107 @@ | |||
| 1 | /* Date: Thu, 05 Aug 1993 20:28:03 +0200 | ||
| 2 | From: "Tom R.Hageman" <tom@basil.icce.rug.nl> | ||
| 3 | Subject: more etags torture;-) [etags 7.3 patch#3] | ||
| 4 | To: pot@CNUCE.CNR.IT | ||
| 5 | |||
| 6 | Hi, | ||
| 7 | |||
| 8 | This test file illustrates some more problems with etags (7.3): | ||
| 9 | |||
| 10 | |||
| 11 | 1. parentheses are confusing, | ||
| 12 | 2. preprocessor directives can disrupt other state machines. */ | ||
| 13 | |||
| 14 | /* A small torture test for etags. */ | ||
| 15 | |||
| 16 | /* The classic parenthesis nightmare, based on signal(). */ | ||
| 17 | void | ||
| 18 | (*tag1 (sig, handler)) () | ||
| 19 | int sig; | ||
| 20 | void (*handler) (); | ||
| 21 | { | ||
| 22 | (*handler)(sig); | ||
| 23 | return handler; | ||
| 24 | } | ||
| 25 | |||
| 26 | #define notag2 void | ||
| 27 | /* The classic, with user-defined return type. */ | ||
| 28 | notag2 | ||
| 29 | (*tag2 (sig, handler)) () | ||
| 30 | int sig; | ||
| 31 | void (*handler) (); | ||
| 32 | { | ||
| 33 | (*handler)(sig); | ||
| 34 | return handler; | ||
| 35 | } | ||
| 36 | |||
| 37 | /* The classic, in ANSI C style. */ | ||
| 38 | void | ||
| 39 | (*tag3 (int sig, void (*handler) (int))) (int) | ||
| 40 | { | ||
| 41 | (*handler)(sig); | ||
| 42 | return handler; | ||
| 43 | } | ||
| 44 | |||
| 45 | #define notag4 void | ||
| 46 | /* The classic, with user-defined return type, in ANSI C style. */ | ||
| 47 | notag4 | ||
| 48 | (*tag4 (int sig, void (*handler) (int))) (int) | ||
| 49 | { | ||
| 50 | (*handler)(sig); | ||
| 51 | return handler; | ||
| 52 | } | ||
| 53 | |||
| 54 | |||
| 55 | /* A less tortuous example. */ | ||
| 56 | void | ||
| 57 | tag5 (handler, arg) | ||
| 58 | void (*handler)(); | ||
| 59 | void *arg; | ||
| 60 | { | ||
| 61 | (*handler)(arg); | ||
| 62 | } | ||
| 63 | |||
| 64 | /* A less tortuous example, in ANSI C style. */ | ||
| 65 | void | ||
| 66 | tag6 (void (*handler) (void *), void *arg) | ||
| 67 | { | ||
| 68 | (*handler)(arg); | ||
| 69 | } | ||
| 70 | |||
| 71 | |||
| 72 | /* Interfering preprocessing torture */ | ||
| 73 | |||
| 74 | int pp1( | ||
| 75 | #if (__STDC__) | ||
| 76 | int | ||
| 77 | #endif | ||
| 78 | bar) | ||
| 79 | #if (!__STDC__) | ||
| 80 | int bar; | ||
| 81 | #endif | ||
| 82 | { | ||
| 83 | return bar; | ||
| 84 | } | ||
| 85 | |||
| 86 | int | ||
| 87 | pp2 | ||
| 88 | #if __STDC__ | ||
| 89 | (int bar) | ||
| 90 | #else | ||
| 91 | (bar) | ||
| 92 | int bar; | ||
| 93 | #endif | ||
| 94 | { | ||
| 95 | return bar; | ||
| 96 | } | ||
| 97 | |||
| 98 | int | ||
| 99 | #if __STDC__ | ||
| 100 | pp3(int bar) | ||
| 101 | #else | ||
| 102 | pp3(bar) | ||
| 103 | int bar; | ||
| 104 | #endif | ||
| 105 | { | ||
| 106 | return bar; | ||
| 107 | } | ||
diff --git a/test/etags/cp-src/c.C b/test/etags/cp-src/c.C index dae933a9a05..2c5f7e01fac 100644 --- a/test/etags/cp-src/c.C +++ b/test/etags/cp-src/c.C | |||
| @@ -51,7 +51,7 @@ int A<int>::f(A<int>* x) {} | |||
| 51 | A<float,B<int> > A<B<float>,int>::f(A<int>* x) {} | 51 | A<float,B<int> > A<B<float>,int>::f(A<int>* x) {} |
| 52 | template <class C, int n> class AT { C t[n]; }; | 52 | template <class C, int n> class AT { C t[n]; }; |
| 53 | class AU { T x; }; | 53 | class AU { T x; }; |
| 54 | class B<int> { void f() {} }; | 54 | class B<int> { void f() {} }; |
| 55 | const A::B::T& abt = abc; | 55 | const A::B::T& abt = abc; |
| 56 | class A { class B { int f(); }; }; | 56 | class A { class B { int f(); }; }; |
| 57 | class A { | 57 | class A { |
diff --git a/test/etags/html-src/algrthms.html b/test/etags/html-src/algrthms.html index f051505263c..becd93a62d0 100644 --- a/test/etags/html-src/algrthms.html +++ b/test/etags/html-src/algrthms.html | |||
| @@ -1,519 +1,519 @@ | |||
| 1 | <!doctype html public "-//w3c//dtd html 4.0 transitional//en"> | 1 | <!doctype html public "-//w3c//dtd html 4.0 transitional//en"> |
| 2 | <html> | 2 | <html> |
| 3 | <head> | 3 | <head> |
| 4 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | 4 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
| 5 | <meta name="Author" content="Chip Fleming"> | 5 | <meta name="Author" content="Chip Fleming"> |
| 6 | <meta name="GENERATOR" content="Mozilla/4.7 [en] (Win95; U) [Netscape]"> | 6 | <meta name="GENERATOR" content="Mozilla/4.7 [en] (Win95; U) [Netscape]"> |
| 7 | <title>Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms</title> | 7 | <title>Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms</title> |
| 8 | </head> | 8 | </head> |
| 9 | <body> | 9 | <body> |
| 10 | <a NAME="algorithms"></a><b><font face="Arial"><font size=+1>Description | 10 | <a NAME="algorithms"></a><b><font face="Arial"><font size=+1>Description |
| 11 | of the Algorithms (Part 1)</font></font></b> | 11 | of the Algorithms (Part 1)</font></font></b> |
| 12 | <p> The steps involved in simulating a communication channel using | 12 | <p> The steps involved in simulating a communication channel using |
| 13 | convolutional encoding and Viterbi decoding are as follows: | 13 | convolutional encoding and Viterbi decoding are as follows: |
| 14 | <ul> | 14 | <ul> |
| 15 | <li> | 15 | <li> |
| 16 | <a href="#genalgorithm">Generate the data</a> to be transmitted through | 16 | <a href="#genalgorithm">Generate the data</a> to be transmitted through |
| 17 | the channel-result is binary data bits</li> | 17 | the channel-result is binary data bits</li> |
| 18 | 18 | ||
| 19 | <li> | 19 | <li> |
| 20 | <a href="#conalgorithm">Convolutionally encode</a> the data-result is channel | 20 | <a href="#conalgorithm">Convolutionally encode</a> the data-result is channel |
| 21 | symbols</li> | 21 | symbols</li> |
| 22 | 22 | ||
| 23 | <li> | 23 | <li> |
| 24 | <a href="#mapping">Map the one/zero channel symbols</a> onto an antipodal | 24 | <a href="#mapping">Map the one/zero channel symbols</a> onto an antipodal |
| 25 | baseband signal, producing transmitted channel symbols</li> | 25 | baseband signal, producing transmitted channel symbols</li> |
| 26 | 26 | ||
| 27 | <li> | 27 | <li> |
| 28 | <a href="#addnoise">Add noise</a> to the transmitted channel symbols-result | 28 | <a href="#addnoise">Add noise</a> to the transmitted channel symbols-result |
| 29 | is received channel symbols</li> | 29 | is received channel symbols</li> |
| 30 | 30 | ||
| 31 | <li> | 31 | <li> |
| 32 | <a href="#quantizing">Quantize</a> the received channel levels-one bit | 32 | <a href="#quantizing">Quantize</a> the received channel levels-one bit |
| 33 | quantization is called hard-decision, and two to n bit quantization is | 33 | quantization is called hard-decision, and two to n bit quantization is |
| 34 | called soft-decision (n is usually three or four)</li> | 34 | called soft-decision (n is usually three or four)</li> |
| 35 | 35 | ||
| 36 | <li> | 36 | <li> |
| 37 | <a href="algrthms2.html">Perform Viterbi decoding</a> on the quantized | 37 | <a href="algrthms2.html">Perform Viterbi decoding</a> on the quantized |
| 38 | received channel symbols-result is again binary data bits</li> | 38 | received channel symbols-result is again binary data bits</li> |
| 39 | 39 | ||
| 40 | <li> | 40 | <li> |
| 41 | Compare the decoded data bits to the transmitted data bits and count the | 41 | Compare the decoded data bits to the transmitted data bits and count the |
| 42 | number of errors.</li> | 42 | number of errors.</li> |
| 43 | </ul> | 43 | </ul> |
| 44 | <i>Many of you will notice that I left out the steps of modulating the | 44 | <i>Many of you will notice that I left out the steps of modulating the |
| 45 | channel symbols onto a transmitted carrier, and then demodulating the received | 45 | channel symbols onto a transmitted carrier, and then demodulating the received |
| 46 | carrier to recover the channel symbols. You're right, but we can accurately | 46 | carrier to recover the channel symbols. You're right, but we can accurately |
| 47 | model the effects of AWGN even though we bypass those steps.</i> | 47 | model the effects of AWGN even though we bypass those steps.</i> |
| 48 | <p><a NAME="genalgorithm"></a><b><i><font face="Arial">Generating the Data</font></i></b> | 48 | <p><a NAME="genalgorithm"></a><b><i><font face="Arial">Generating the Data</font></i></b> |
| 49 | <p>Generating the data to be transmitted through the channel can be accomplished | 49 | <p>Generating the data to be transmitted through the channel can be accomplished |
| 50 | quite simply by using a random number generator. One that produces a uniform | 50 | quite simply by using a random number generator. One that produces a uniform |
| 51 | distribution of numbers on the interval 0 to a maximum value is provided | 51 | distribution of numbers on the interval 0 to a maximum value is provided |
| 52 | in C: <tt>rand ()</tt>. Using this function, we can say that any value | 52 | in C: <tt>rand ()</tt>. Using this function, we can say that any value |
| 53 | less than half of the maximum value is a zero; any value greater than or | 53 | less than half of the maximum value is a zero; any value greater than or |
| 54 | equal to half of the maximum value is a one. | 54 | equal to half of the maximum value is a one. |
| 55 | <p><a NAME="conalgorithm"></a><b><i><font face="Arial">Convolutionally | 55 | <p><a NAME="conalgorithm"></a><b><i><font face="Arial">Convolutionally |
| 56 | Encoding the Data</font></i></b> | 56 | Encoding the Data</font></i></b> |
| 57 | <p>Convolutionally encoding the data is accomplished using a shift register | 57 | <p>Convolutionally encoding the data is accomplished using a shift register |
| 58 | and associated combinatorial logic that performs modulo-two addition. (A | 58 | and associated combinatorial logic that performs modulo-two addition. (A |
| 59 | shift register is merely a chain of flip-flops wherein the output of the | 59 | shift register is merely a chain of flip-flops wherein the output of the |
| 60 | nth flip-flop is tied to the input of the (n+1)th flip-flop. Every time | 60 | nth flip-flop is tied to the input of the (n+1)th flip-flop. Every time |
| 61 | the active edge of the clock occurs, the input to the flip-flop is clocked | 61 | the active edge of the clock occurs, the input to the flip-flop is clocked |
| 62 | through to the output, and thus the data are shifted over one stage.) The | 62 | through to the output, and thus the data are shifted over one stage.) The |
| 63 | combinatorial logic is often in the form of cascaded exclusive-or gates. | 63 | combinatorial logic is often in the form of cascaded exclusive-or gates. |
| 64 | As a reminder, exclusive-or gates are two-input, one-output gates often | 64 | As a reminder, exclusive-or gates are two-input, one-output gates often |
| 65 | represented by the logic symbol shown below, | 65 | represented by the logic symbol shown below, |
| 66 | <center> | 66 | <center> |
| 67 | <p><img SRC="figs/xor_gate.gif" ALT="exclusive-or gate symbol" height=64 width=93></center> | 67 | <p><img SRC="figs/xor_gate.gif" ALT="exclusive-or gate symbol" height=64 width=93></center> |
| 68 | 68 | ||
| 69 | <p>that implement the following truth-table: | 69 | <p>that implement the following truth-table: |
| 70 | <br> | 70 | <br> |
| 71 | <br> | 71 | <br> |
| 72 | <center><table BORDER CELLPADDING=7 WIDTH="218" > | 72 | <center><table BORDER CELLPADDING=7 WIDTH="218" > |
| 73 | <tr> | 73 | <tr> |
| 74 | <td VALIGN=TOP WIDTH="28%"> | 74 | <td VALIGN=TOP WIDTH="28%"> |
| 75 | <center><b><tt>Input A</tt></b></center> | 75 | <center><b><tt>Input A</tt></b></center> |
| 76 | </td> | 76 | </td> |
| 77 | 77 | ||
| 78 | <td VALIGN=TOP WIDTH="27%"> | 78 | <td VALIGN=TOP WIDTH="27%"> |
| 79 | <center><b><tt>Input B</tt></b></center> | 79 | <center><b><tt>Input B</tt></b></center> |
| 80 | </td> | 80 | </td> |
| 81 | 81 | ||
| 82 | <td VALIGN=TOP WIDTH="45%"> | 82 | <td VALIGN=TOP WIDTH="45%"> |
| 83 | <center><b><tt>Output</tt></b> | 83 | <center><b><tt>Output</tt></b> |
| 84 | <p><b><tt>(A xor B)</tt></b></center> | 84 | <p><b><tt>(A xor B)</tt></b></center> |
| 85 | </td> | 85 | </td> |
| 86 | </tr> | 86 | </tr> |
| 87 | 87 | ||
| 88 | <tr> | 88 | <tr> |
| 89 | <td VALIGN=TOP WIDTH="28%"> | 89 | <td VALIGN=TOP WIDTH="28%"> |
| 90 | <center><tt>0</tt></center> | 90 | <center><tt>0</tt></center> |
| 91 | </td> | 91 | </td> |
| 92 | 92 | ||
| 93 | <td VALIGN=TOP WIDTH="27%"> | 93 | <td VALIGN=TOP WIDTH="27%"> |
| 94 | <center><tt>0</tt></center> | 94 | <center><tt>0</tt></center> |
| 95 | </td> | 95 | </td> |
| 96 | 96 | ||
| 97 | <td VALIGN=TOP WIDTH="45%"> | 97 | <td VALIGN=TOP WIDTH="45%"> |
| 98 | <center><tt>0</tt></center> | 98 | <center><tt>0</tt></center> |
| 99 | </td> | 99 | </td> |
| 100 | </tr> | 100 | </tr> |
| 101 | 101 | ||
| 102 | <tr> | 102 | <tr> |
| 103 | <td VALIGN=TOP WIDTH="28%"> | 103 | <td VALIGN=TOP WIDTH="28%"> |
| 104 | <center><tt>0</tt></center> | 104 | <center><tt>0</tt></center> |
| 105 | </td> | 105 | </td> |
| 106 | 106 | ||
| 107 | <td VALIGN=TOP WIDTH="27%"> | 107 | <td VALIGN=TOP WIDTH="27%"> |
| 108 | <center><tt>1</tt></center> | 108 | <center><tt>1</tt></center> |
| 109 | </td> | 109 | </td> |
| 110 | 110 | ||
| 111 | <td VALIGN=TOP WIDTH="45%"> | 111 | <td VALIGN=TOP WIDTH="45%"> |
| 112 | <center><tt>1</tt></center> | 112 | <center><tt>1</tt></center> |
| 113 | </td> | 113 | </td> |
| 114 | </tr> | 114 | </tr> |
| 115 | 115 | ||
| 116 | <tr> | 116 | <tr> |
| 117 | <td VALIGN=TOP WIDTH="28%"> | 117 | <td VALIGN=TOP WIDTH="28%"> |
| 118 | <center><tt>1</tt></center> | 118 | <center><tt>1</tt></center> |
| 119 | </td> | 119 | </td> |
| 120 | 120 | ||
| 121 | <td VALIGN=TOP WIDTH="27%"> | 121 | <td VALIGN=TOP WIDTH="27%"> |
| 122 | <center><tt>0</tt></center> | 122 | <center><tt>0</tt></center> |
| 123 | </td> | 123 | </td> |
| 124 | 124 | ||
| 125 | <td VALIGN=TOP WIDTH="45%"> | 125 | <td VALIGN=TOP WIDTH="45%"> |
| 126 | <center><tt>1</tt></center> | 126 | <center><tt>1</tt></center> |
| 127 | </td> | 127 | </td> |
| 128 | </tr> | 128 | </tr> |
| 129 | 129 | ||
| 130 | <tr> | 130 | <tr> |
| 131 | <td VALIGN=TOP WIDTH="28%"> | 131 | <td VALIGN=TOP WIDTH="28%"> |
| 132 | <center><tt>1</tt></center> | 132 | <center><tt>1</tt></center> |
| 133 | </td> | 133 | </td> |
| 134 | 134 | ||
| 135 | <td VALIGN=TOP WIDTH="27%"> | 135 | <td VALIGN=TOP WIDTH="27%"> |
| 136 | <center><tt>1</tt></center> | 136 | <center><tt>1</tt></center> |
| 137 | </td> | 137 | </td> |
| 138 | 138 | ||
| 139 | <td VALIGN=TOP WIDTH="45%"> | 139 | <td VALIGN=TOP WIDTH="45%"> |
| 140 | <center><tt>0</tt></center> | 140 | <center><tt>0</tt></center> |
| 141 | </td> | 141 | </td> |
| 142 | </tr> | 142 | </tr> |
| 143 | </table></center> | 143 | </table></center> |
| 144 | 144 | ||
| 145 | <p>The exclusive-or gate performs modulo-two addition of its inputs. When | 145 | <p>The exclusive-or gate performs modulo-two addition of its inputs. When |
| 146 | you cascade q two-input exclusive-or gates, with the output of the first | 146 | you cascade q two-input exclusive-or gates, with the output of the first |
| 147 | one feeding one of the inputs of the second one, the output of the second | 147 | one feeding one of the inputs of the second one, the output of the second |
| 148 | one feeding one of the inputs of the third one, etc., the output of the | 148 | one feeding one of the inputs of the third one, etc., the output of the |
| 149 | last one in the chain is the modulo-two sum of the q + 1 inputs. | 149 | last one in the chain is the modulo-two sum of the q + 1 inputs. |
| 150 | <p>Another way to illustrate the modulo-two adder, and the way that is | 150 | <p>Another way to illustrate the modulo-two adder, and the way that is |
| 151 | most commonly used in textbooks, is as a circle with a + symbol inside, | 151 | most commonly used in textbooks, is as a circle with a + symbol inside, |
| 152 | thus: | 152 | thus: |
| 153 | <center> | 153 | <center> |
| 154 | <p><img SRC="figs/ringsum.gif" ALT="modulo-two adder symbol" height=48 width=48></center> | 154 | <p><img SRC="figs/ringsum.gif" ALT="modulo-two adder symbol" height=48 width=48></center> |
| 155 | 155 | ||
| 156 | <p>Now that we have the two basic components of the convolutional encoder | 156 | <p>Now that we have the two basic components of the convolutional encoder |
| 157 | (flip-flops comprising the shift register and exclusive-or gates comprising | 157 | (flip-flops comprising the shift register and exclusive-or gates comprising |
| 158 | the associated modulo-two adders) defined, let's look at a picture of a | 158 | the associated modulo-two adders) defined, let's look at a picture of a |
| 159 | convolutional encoder for a rate 1/2, K = 3, m = 2 code: | 159 | convolutional encoder for a rate 1/2, K = 3, m = 2 code: |
| 160 | <br> | 160 | <br> |
| 161 | <br> | 161 | <br> |
| 162 | <br> | 162 | <br> |
| 163 | <center> | 163 | <center> |
| 164 | <p><img SRC="figs/ce_7_5_a.gif" ALT="rate 1/2 K = 3 (7, 5) convolutional encoder" height=232 width=600></center> | 164 | <p><img SRC="figs/ce_7_5_a.gif" ALT="rate 1/2 K = 3 (7, 5) convolutional encoder" height=232 width=600></center> |
| 165 | 165 | ||
| 166 | <p>In this encoder, data bits are provided at a rate of k bits per second. | 166 | <p>In this encoder, data bits are provided at a rate of k bits per second. |
| 167 | Channel symbols are output at a rate of n = 2k symbols per second. The | 167 | Channel symbols are output at a rate of n = 2k symbols per second. The |
| 168 | input bit is stable during the encoder cycle. The encoder cycle starts | 168 | input bit is stable during the encoder cycle. The encoder cycle starts |
| 169 | when an input clock edge occurs. When the input clock edge occurs, the | 169 | when an input clock edge occurs. When the input clock edge occurs, the |
| 170 | output of the left-hand flip-flop is clocked into the right-hand flip-flop, | 170 | output of the left-hand flip-flop is clocked into the right-hand flip-flop, |
| 171 | the previous input bit is clocked into the left-hand flip-flop, and a new | 171 | the previous input bit is clocked into the left-hand flip-flop, and a new |
| 172 | input bit becomes available. Then the outputs of the upper and lower modulo-two | 172 | input bit becomes available. Then the outputs of the upper and lower modulo-two |
| 173 | adders become stable. The output selector (SEL A/B block) cycles through | 173 | adders become stable. The output selector (SEL A/B block) cycles through |
| 174 | two states-in the first state, it selects and outputs the output of the | 174 | two states-in the first state, it selects and outputs the output of the |
| 175 | upper modulo-two adder; in the second state, it selects and outputs the | 175 | upper modulo-two adder; in the second state, it selects and outputs the |
| 176 | output of the lower modulo-two adder. | 176 | output of the lower modulo-two adder. |
| 177 | <p>The encoder shown above encodes the K = 3, (7, 5) convolutional code. | 177 | <p>The encoder shown above encodes the K = 3, (7, 5) convolutional code. |
| 178 | The octal numbers 7 and 5 represent the code generator polynomials, which | 178 | The octal numbers 7 and 5 represent the code generator polynomials, which |
| 179 | when read in binary (111<sub>2</sub> and 101<sub>2</sub>) correspond to | 179 | when read in binary (111<sub>2</sub> and 101<sub>2</sub>) correspond to |
| 180 | the shift register connections to the upper and lower modulo-two adders, | 180 | the shift register connections to the upper and lower modulo-two adders, |
| 181 | respectively. This code has been determined to be the "best" code for rate | 181 | respectively. This code has been determined to be the "best" code for rate |
| 182 | 1/2, K = 3. It is the code I will use for the remaining discussion and | 182 | 1/2, K = 3. It is the code I will use for the remaining discussion and |
| 183 | examples, for reasons that will become readily apparent when we get into | 183 | examples, for reasons that will become readily apparent when we get into |
| 184 | the Viterbi decoder algorithm. | 184 | the Viterbi decoder algorithm. |
| 185 | <p>Let's look at an example input data stream, and the corresponding output | 185 | <p>Let's look at an example input data stream, and the corresponding output |
| 186 | data stream: | 186 | data stream: |
| 187 | <p>Let the input sequence be 010111001010001<sub>2</sub>. | 187 | <p>Let the input sequence be 010111001010001<sub>2</sub>. |
| 188 | <p>Assume that the outputs of both of the flip-flops in the shift register | 188 | <p>Assume that the outputs of both of the flip-flops in the shift register |
| 189 | are initially cleared, i.e. their outputs are zeroes. The first clock cycle | 189 | are initially cleared, i.e. their outputs are zeroes. The first clock cycle |
| 190 | makes the first input bit, a zero, available to the encoder. The flip-flop | 190 | makes the first input bit, a zero, available to the encoder. The flip-flop |
| 191 | outputs are both zeroes. The inputs to the modulo-two adders are all zeroes, | 191 | outputs are both zeroes. The inputs to the modulo-two adders are all zeroes, |
| 192 | so the output of the encoder is 00<sub>2</sub>. | 192 | so the output of the encoder is 00<sub>2</sub>. |
| 193 | <p>The second clock cycle makes the second input bit available to the encoder. | 193 | <p>The second clock cycle makes the second input bit available to the encoder. |
| 194 | The left-hand flip-flop clocks in the previous bit, which was a zero, and | 194 | The left-hand flip-flop clocks in the previous bit, which was a zero, and |
| 195 | the right-hand flip-flop clocks in the zero output by the left-hand flip-flop. | 195 | the right-hand flip-flop clocks in the zero output by the left-hand flip-flop. |
| 196 | The inputs to the top modulo-two adder are 100<sub>2</sub>, so the output | 196 | The inputs to the top modulo-two adder are 100<sub>2</sub>, so the output |
| 197 | is a one. The inputs to the bottom modulo-two adder are 10<sub>2</sub>, | 197 | is a one. The inputs to the bottom modulo-two adder are 10<sub>2</sub>, |
| 198 | so the output is also a one. So the encoder outputs 11<sub>2</sub> for | 198 | so the output is also a one. So the encoder outputs 11<sub>2</sub> for |
| 199 | the channel symbols. | 199 | the channel symbols. |
| 200 | <p>The third clock cycle makes the third input bit, a zero, available to | 200 | <p>The third clock cycle makes the third input bit, a zero, available to |
| 201 | the encoder. The left-hand flip-flop clocks in the previous bit, which | 201 | the encoder. The left-hand flip-flop clocks in the previous bit, which |
| 202 | was a one, and the right-hand flip-flop clocks in the zero from two bit-times | 202 | was a one, and the right-hand flip-flop clocks in the zero from two bit-times |
| 203 | ago. The inputs to the top modulo-two adder are 010<sub>2</sub>, so the | 203 | ago. The inputs to the top modulo-two adder are 010<sub>2</sub>, so the |
| 204 | output is a one. The inputs to the bottom modulo-two adder are 00<sub>2</sub>, | 204 | output is a one. The inputs to the bottom modulo-two adder are 00<sub>2</sub>, |
| 205 | so the output is zero. So the encoder outputs 10<sub>2</sub> for the channel | 205 | so the output is zero. So the encoder outputs 10<sub>2</sub> for the channel |
| 206 | symbols. | 206 | symbols. |
| 207 | <p>And so on. The timing diagram shown below illustrates the process: | 207 | <p>And so on. The timing diagram shown below illustrates the process: |
| 208 | <br> | 208 | <br> |
| 209 | <br> | 209 | <br> |
| 210 | <br> | 210 | <br> |
| 211 | <center> | 211 | <center> |
| 212 | <p><img SRC="figs/ce_td.gif" ALT="timing diagram for rate 1/2 convolutional encoder" height=322 width=600></center> | 212 | <p><img SRC="figs/ce_td.gif" ALT="timing diagram for rate 1/2 convolutional encoder" height=322 width=600></center> |
| 213 | 213 | ||
| 214 | <p><br> | 214 | <p><br> |
| 215 | <br> | 215 | <br> |
| 216 | <br> | 216 | <br> |
| 217 | <p>After all of the inputs have been presented to the encoder, the output | 217 | <p>After all of the inputs have been presented to the encoder, the output |
| 218 | sequence will be: | 218 | sequence will be: |
| 219 | <p>00 11 10 00 01 10 01 11 11 10 00 10 11 00 11<sub>2</sub>. | 219 | <p>00 11 10 00 01 10 01 11 11 10 00 10 11 00 11<sub>2</sub>. |
| 220 | <p>Notice that I have paired the encoder outputs-the first bit in each | 220 | <p>Notice that I have paired the encoder outputs-the first bit in each |
| 221 | pair is the output of the upper modulo-two adder; the second bit in each | 221 | pair is the output of the upper modulo-two adder; the second bit in each |
| 222 | pair is the output of the lower modulo-two adder. | 222 | pair is the output of the lower modulo-two adder. |
| 223 | <p>You can see from the structure of the rate 1/2 K = 3 convolutional encoder | 223 | <p>You can see from the structure of the rate 1/2 K = 3 convolutional encoder |
| 224 | and from the example given above that each input bit has an effect on three | 224 | and from the example given above that each input bit has an effect on three |
| 225 | successive pairs of output symbols. That is an extremely important point | 225 | successive pairs of output symbols. That is an extremely important point |
| 226 | and that is what gives the convolutional code its error-correcting power. | 226 | and that is what gives the convolutional code its error-correcting power. |
| 227 | The reason why will become evident when we get into the Viterbi decoder | 227 | The reason why will become evident when we get into the Viterbi decoder |
| 228 | algorithm. | 228 | algorithm. |
| 229 | <p>Now if we are only going to send the 15 data bits given above, in order | 229 | <p>Now if we are only going to send the 15 data bits given above, in order |
| 230 | for the last bit to affect three pairs of output symbols, we need to output | 230 | for the last bit to affect three pairs of output symbols, we need to output |
| 231 | two more pairs of symbols. This is accomplished in our example encoder | 231 | two more pairs of symbols. This is accomplished in our example encoder |
| 232 | by clocking the convolutional encoder flip-flops two ( = m) more times, | 232 | by clocking the convolutional encoder flip-flops two ( = m) more times, |
| 233 | while holding the input at zero. This is called "flushing" the encoder, | 233 | while holding the input at zero. This is called "flushing" the encoder, |
| 234 | and results in two more pairs of output symbols. The final binary output | 234 | and results in two more pairs of output symbols. The final binary output |
| 235 | of the encoder is thus 00 11 10 00 01 10 01 11 11 10 00 10 11 00 11 10 | 235 | of the encoder is thus 00 11 10 00 01 10 01 11 11 10 00 10 11 00 11 10 |
| 236 | 11<sub>2</sub>. If we don't perform the flushing operation, the last m | 236 | 11<sub>2</sub>. If we don't perform the flushing operation, the last m |
| 237 | bits of the message have less error-correction capability than the first | 237 | bits of the message have less error-correction capability than the first |
| 238 | through (m - 1)th bits had. This is a pretty important thing to remember | 238 | through (m - 1)th bits had. This is a pretty important thing to remember |
| 239 | if you're going to use this FEC technique in a burst-mode environment. | 239 | if you're going to use this FEC technique in a burst-mode environment. |
| 240 | So's the step of clearing the shift register at the beginning of each burst. | 240 | So's the step of clearing the shift register at the beginning of each burst. |
| 241 | The encoder must start in a known state and end in a known state for the | 241 | The encoder must start in a known state and end in a known state for the |
| 242 | decoder to be able to reconstruct the input data sequence properly. | 242 | decoder to be able to reconstruct the input data sequence properly. |
| 243 | <p>Now, let's look at the encoder from another perspective. You can think | 243 | <p>Now, let's look at the encoder from another perspective. You can think |
| 244 | of the encoder as a simple state machine. The example encoder has two bits | 244 | of the encoder as a simple state machine. The example encoder has two bits |
| 245 | of memory, so there are four possible states. Let's give the left-hand | 245 | of memory, so there are four possible states. Let's give the left-hand |
| 246 | flip-flop a binary weight of 2<sup>1</sup>, and the right-hand flip-flop | 246 | flip-flop a binary weight of 2<sup>1</sup>, and the right-hand flip-flop |
| 247 | a binary weight of 2<sup>0</sup>. Initially, the encoder is in the all-zeroes | 247 | a binary weight of 2<sup>0</sup>. Initially, the encoder is in the all-zeroes |
| 248 | state. If the first input bit is a zero, the encoder stays in the all zeroes | 248 | state. If the first input bit is a zero, the encoder stays in the all zeroes |
| 249 | state at the next clock edge. But if the input bit is a one, the encoder | 249 | state at the next clock edge. But if the input bit is a one, the encoder |
| 250 | transitions to the 10<sub>2</sub> state at the next clock edge. Then, if | 250 | transitions to the 10<sub>2</sub> state at the next clock edge. Then, if |
| 251 | the next input bit is zero, the encoder transitions to the 01<sub>2</sub> | 251 | the next input bit is zero, the encoder transitions to the 01<sub>2</sub> |
| 252 | state, otherwise, it transitions to the 11<sub>2</sub> state. The following | 252 | state, otherwise, it transitions to the 11<sub>2</sub> state. The following |
| 253 | table gives the next state given the current state and the input, with | 253 | table gives the next state given the current state and the input, with |
| 254 | the states given in binary: | 254 | the states given in binary: |
| 255 | <br> | 255 | <br> |
| 256 | <br> | 256 | <br> |
| 257 | <center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" > | 257 | <center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" > |
| 258 | <tr> | 258 | <tr> |
| 259 | <td VALIGN=TOP WIDTH="33%"><font face="Arial"><font size=-1> </font></font></td> | 259 | <td VALIGN=TOP WIDTH="33%"><font face="Arial"><font size=-1> </font></font></td> |
| 260 | 260 | ||
| 261 | <td VALIGN=TOP COLSPAN="2" WIDTH="67%"> | 261 | <td VALIGN=TOP COLSPAN="2" WIDTH="67%"> |
| 262 | <center><a NAME="statetable"></a><b><font face="Arial"><font size=-1>Next | 262 | <center><a NAME="statetable"></a><b><font face="Arial"><font size=-1>Next |
| 263 | State, if </font></font></b></center> | 263 | State, if </font></font></b></center> |
| 264 | </td> | 264 | </td> |
| 265 | </tr> | 265 | </tr> |
| 266 | 266 | ||
| 267 | <tr> | 267 | <tr> |
| 268 | <td VALIGN=TOP WIDTH="33%"> | 268 | <td VALIGN=TOP WIDTH="33%"> |
| 269 | <center><b><font face="Arial"><font size=-1>Current State</font></font></b></center> | 269 | <center><b><font face="Arial"><font size=-1>Current State</font></font></b></center> |
| 270 | </td> | 270 | </td> |
| 271 | 271 | ||
| 272 | <td VALIGN=TOP WIDTH="33%"> | 272 | <td VALIGN=TOP WIDTH="33%"> |
| 273 | <center><b><font face="Arial"><font size=-1>Input = 0:</font></font></b></center> | 273 | <center><b><font face="Arial"><font size=-1>Input = 0:</font></font></b></center> |
| 274 | </td> | 274 | </td> |
| 275 | 275 | ||
| 276 | <td VALIGN=TOP WIDTH="33%"> | 276 | <td VALIGN=TOP WIDTH="33%"> |
| 277 | <center><b><font face="Arial"><font size=-1>Input = 1:</font></font></b></center> | 277 | <center><b><font face="Arial"><font size=-1>Input = 1:</font></font></b></center> |
| 278 | </td> | 278 | </td> |
| 279 | </tr> | 279 | </tr> |
| 280 | 280 | ||
| 281 | <tr> | 281 | <tr> |
| 282 | <td VALIGN=TOP WIDTH="33%"> | 282 | <td VALIGN=TOP WIDTH="33%"> |
| 283 | <center><font face="Arial"><font size=-1>00</font></font></center> | 283 | <center><font face="Arial"><font size=-1>00</font></font></center> |
| 284 | </td> | 284 | </td> |
| 285 | 285 | ||
| 286 | <td VALIGN=TOP WIDTH="33%"> | 286 | <td VALIGN=TOP WIDTH="33%"> |
| 287 | <center><font face="Arial"><font size=-1>00</font></font></center> | 287 | <center><font face="Arial"><font size=-1>00</font></font></center> |
| 288 | </td> | 288 | </td> |
| 289 | 289 | ||
| 290 | <td VALIGN=TOP WIDTH="33%"> | 290 | <td VALIGN=TOP WIDTH="33%"> |
| 291 | <center><font face="Arial"><font size=-1>10</font></font></center> | 291 | <center><font face="Arial"><font size=-1>10</font></font></center> |
| 292 | </td> | 292 | </td> |
| 293 | </tr> | 293 | </tr> |
| 294 | 294 | ||
| 295 | <tr> | 295 | <tr> |
| 296 | <td VALIGN=TOP WIDTH="33%"> | 296 | <td VALIGN=TOP WIDTH="33%"> |
| 297 | <center><font face="Arial"><font size=-1>01</font></font></center> | 297 | <center><font face="Arial"><font size=-1>01</font></font></center> |
| 298 | </td> | 298 | </td> |
| 299 | 299 | ||
| 300 | <td VALIGN=TOP WIDTH="33%"> | 300 | <td VALIGN=TOP WIDTH="33%"> |
| 301 | <center><font face="Arial"><font size=-1>00</font></font></center> | 301 | <center><font face="Arial"><font size=-1>00</font></font></center> |
| 302 | </td> | 302 | </td> |
| 303 | 303 | ||
| 304 | <td VALIGN=TOP WIDTH="33%"> | 304 | <td VALIGN=TOP WIDTH="33%"> |
| 305 | <center><font face="Arial"><font size=-1>10</font></font></center> | 305 | <center><font face="Arial"><font size=-1>10</font></font></center> |
| 306 | </td> | 306 | </td> |
| 307 | </tr> | 307 | </tr> |
| 308 | 308 | ||
| 309 | <tr> | 309 | <tr> |
| 310 | <td VALIGN=TOP WIDTH="33%"> | 310 | <td VALIGN=TOP WIDTH="33%"> |
| 311 | <center><font face="Arial"><font size=-1>10</font></font></center> | 311 | <center><font face="Arial"><font size=-1>10</font></font></center> |
| 312 | </td> | 312 | </td> |
| 313 | 313 | ||
| 314 | <td VALIGN=TOP WIDTH="33%"> | 314 | <td VALIGN=TOP WIDTH="33%"> |
| 315 | <center><font face="Arial"><font size=-1>01</font></font></center> | 315 | <center><font face="Arial"><font size=-1>01</font></font></center> |
| 316 | </td> | 316 | </td> |
| 317 | 317 | ||
| 318 | <td VALIGN=TOP WIDTH="33%"> | 318 | <td VALIGN=TOP WIDTH="33%"> |
| 319 | <center><font face="Arial"><font size=-1>11</font></font></center> | 319 | <center><font face="Arial"><font size=-1>11</font></font></center> |
| 320 | </td> | 320 | </td> |
| 321 | </tr> | 321 | </tr> |
| 322 | 322 | ||
| 323 | <tr> | 323 | <tr> |
| 324 | <td VALIGN=TOP WIDTH="33%"> | 324 | <td VALIGN=TOP WIDTH="33%"> |
| 325 | <center><font face="Arial"><font size=-1>11</font></font></center> | 325 | <center><font face="Arial"><font size=-1>11</font></font></center> |
| 326 | </td> | 326 | </td> |
| 327 | 327 | ||
| 328 | <td VALIGN=TOP WIDTH="33%"> | 328 | <td VALIGN=TOP WIDTH="33%"> |
| 329 | <center><font face="Arial"><font size=-1>01</font></font></center> | 329 | <center><font face="Arial"><font size=-1>01</font></font></center> |
| 330 | </td> | 330 | </td> |
| 331 | 331 | ||
| 332 | <td VALIGN=TOP WIDTH="33%"> | 332 | <td VALIGN=TOP WIDTH="33%"> |
| 333 | <center><font face="Arial"><font size=-1>11</font></font></center> | 333 | <center><font face="Arial"><font size=-1>11</font></font></center> |
| 334 | </td> | 334 | </td> |
| 335 | </tr> | 335 | </tr> |
| 336 | </table></center> | 336 | </table></center> |
| 337 | 337 | ||
| 338 | <br> | 338 | <br> |
| 339 | <p>The above table is often called a state transition table. We'll refer | 339 | <p>The above table is often called a state transition table. We'll refer |
| 340 | to it as the <tt>next state</tt> table.<tt> </tt>Now let us look at a table | 340 | to it as the <tt>next state</tt> table.<tt> </tt>Now let us look at a table |
| 341 | that lists the channel output symbols, given the current state and the | 341 | that lists the channel output symbols, given the current state and the |
| 342 | input data, which we'll refer to as the <tt>output</tt> table: | 342 | input data, which we'll refer to as the <tt>output</tt> table: |
| 343 | <br> | 343 | <br> |
| 344 | <br> | 344 | <br> |
| 345 | <center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" > | 345 | <center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" > |
| 346 | <tr> | 346 | <tr> |
| 347 | <td VALIGN=TOP WIDTH="33%"></td> | 347 | <td VALIGN=TOP WIDTH="33%"></td> |
| 348 | 348 | ||
| 349 | <td VALIGN=TOP COLSPAN="2" WIDTH="67%"> | 349 | <td VALIGN=TOP COLSPAN="2" WIDTH="67%"> |
| 350 | <center><a NAME="outputtable"></a><b><font face="Arial"><font size=-1>Output | 350 | <center><a NAME="outputtable"></a><b><font face="Arial"><font size=-1>Output |
| 351 | Symbols, if</font></font></b></center> | 351 | Symbols, if</font></font></b></center> |
| 352 | </td> | 352 | </td> |
| 353 | </tr> | 353 | </tr> |
| 354 | 354 | ||
| 355 | <tr> | 355 | <tr> |
| 356 | <td VALIGN=TOP WIDTH="33%"> | 356 | <td VALIGN=TOP WIDTH="33%"> |
| 357 | <center><b><font face="Arial"><font size=-1>Current State</font></font></b></center> | 357 | <center><b><font face="Arial"><font size=-1>Current State</font></font></b></center> |
| 358 | </td> | 358 | </td> |
| 359 | 359 | ||
| 360 | <td VALIGN=TOP WIDTH="33%"> | 360 | <td VALIGN=TOP WIDTH="33%"> |
| 361 | <center><b><font face="Arial"><font size=-1>Input = 0:</font></font></b></center> | 361 | <center><b><font face="Arial"><font size=-1>Input = 0:</font></font></b></center> |
| 362 | </td> | 362 | </td> |
| 363 | 363 | ||
| 364 | <td VALIGN=TOP WIDTH="33%"> | 364 | <td VALIGN=TOP WIDTH="33%"> |
| 365 | <center><b><font face="Arial"><font size=-1>Input = 1:</font></font></b></center> | 365 | <center><b><font face="Arial"><font size=-1>Input = 1:</font></font></b></center> |
| 366 | </td> | 366 | </td> |
| 367 | </tr> | 367 | </tr> |
| 368 | 368 | ||
| 369 | <tr> | 369 | <tr> |
| 370 | <td VALIGN=TOP WIDTH="33%"> | 370 | <td VALIGN=TOP WIDTH="33%"> |
| 371 | <center><font face="Arial"><font size=-1>00</font></font></center> | 371 | <center><font face="Arial"><font size=-1>00</font></font></center> |
| 372 | </td> | 372 | </td> |
| 373 | 373 | ||
| 374 | <td VALIGN=TOP WIDTH="33%"> | 374 | <td VALIGN=TOP WIDTH="33%"> |
| 375 | <center><font face="Arial"><font size=-1>00</font></font></center> | 375 | <center><font face="Arial"><font size=-1>00</font></font></center> |
| 376 | </td> | 376 | </td> |
| 377 | 377 | ||
| 378 | <td VALIGN=TOP WIDTH="33%"> | 378 | <td VALIGN=TOP WIDTH="33%"> |
| 379 | <center><font face="Arial"><font size=-1>11</font></font></center> | 379 | <center><font face="Arial"><font size=-1>11</font></font></center> |
| 380 | </td> | 380 | </td> |
| 381 | </tr> | 381 | </tr> |
| 382 | 382 | ||
| 383 | <tr> | 383 | <tr> |
| 384 | <td VALIGN=TOP WIDTH="33%"> | 384 | <td VALIGN=TOP WIDTH="33%"> |
| 385 | <center><font face="Arial"><font size=-1>01</font></font></center> | 385 | <center><font face="Arial"><font size=-1>01</font></font></center> |
| 386 | </td> | 386 | </td> |
| 387 | 387 | ||
| 388 | <td VALIGN=TOP WIDTH="33%"> | 388 | <td VALIGN=TOP WIDTH="33%"> |
| 389 | <center><font face="Arial"><font size=-1>11</font></font></center> | 389 | <center><font face="Arial"><font size=-1>11</font></font></center> |
| 390 | </td> | 390 | </td> |
| 391 | 391 | ||
| 392 | <td VALIGN=TOP WIDTH="33%"> | 392 | <td VALIGN=TOP WIDTH="33%"> |
| 393 | <center><font face="Arial"><font size=-1>00</font></font></center> | 393 | <center><font face="Arial"><font size=-1>00</font></font></center> |
| 394 | </td> | 394 | </td> |
| 395 | </tr> | 395 | </tr> |
| 396 | 396 | ||
| 397 | <tr> | 397 | <tr> |
| 398 | <td VALIGN=TOP WIDTH="33%"> | 398 | <td VALIGN=TOP WIDTH="33%"> |
| 399 | <center><font face="Arial"><font size=-1>10</font></font></center> | 399 | <center><font face="Arial"><font size=-1>10</font></font></center> |
| 400 | </td> | 400 | </td> |
| 401 | 401 | ||
| 402 | <td VALIGN=TOP WIDTH="33%"> | 402 | <td VALIGN=TOP WIDTH="33%"> |
| 403 | <center><font face="Arial"><font size=-1>10</font></font></center> | 403 | <center><font face="Arial"><font size=-1>10</font></font></center> |
| 404 | </td> | 404 | </td> |
| 405 | 405 | ||
| 406 | <td VALIGN=TOP WIDTH="33%"> | 406 | <td VALIGN=TOP WIDTH="33%"> |
| 407 | <center><font face="Arial"><font size=-1>01</font></font></center> | 407 | <center><font face="Arial"><font size=-1>01</font></font></center> |
| 408 | </td> | 408 | </td> |
| 409 | </tr> | 409 | </tr> |
| 410 | 410 | ||
| 411 | <tr> | 411 | <tr> |
| 412 | <td VALIGN=TOP WIDTH="33%"> | 412 | <td VALIGN=TOP WIDTH="33%"> |
| 413 | <center><font face="Arial"><font size=-1>11</font></font></center> | 413 | <center><font face="Arial"><font size=-1>11</font></font></center> |
| 414 | </td> | 414 | </td> |
| 415 | 415 | ||
| 416 | <td VALIGN=TOP WIDTH="33%"> | 416 | <td VALIGN=TOP WIDTH="33%"> |
| 417 | <center><font face="Arial"><font size=-1>01</font></font></center> | 417 | <center><font face="Arial"><font size=-1>01</font></font></center> |
| 418 | </td> | 418 | </td> |
| 419 | 419 | ||
| 420 | <td VALIGN=TOP WIDTH="33%"> | 420 | <td VALIGN=TOP WIDTH="33%"> |
| 421 | <center><font face="Arial"><font size=-1>10</font></font></center> | 421 | <center><font face="Arial"><font size=-1>10</font></font></center> |
| 422 | </td> | 422 | </td> |
| 423 | </tr> | 423 | </tr> |
| 424 | </table></center> | 424 | </table></center> |
| 425 | 425 | ||
| 426 | <br> | 426 | <br> |
| 427 | <p>You should now see that with these two tables, you can completely describe | 427 | <p>You should now see that with these two tables, you can completely describe |
| 428 | the behavior of the example rate 1/2, K = 3 convolutional encoder. Note | 428 | the behavior of the example rate 1/2, K = 3 convolutional encoder. Note |
| 429 | that both of these tables have 2<sup>(K - 1)</sup> rows, and 2<sup>k</sup> | 429 | that both of these tables have 2<sup>(K - 1)</sup> rows, and 2<sup>k</sup> |
| 430 | columns, where K is the constraint length and k is the number of bits input | 430 | columns, where K is the constraint length and k is the number of bits input |
| 431 | to the encoder for each cycle. These two tables will come in handy when | 431 | to the encoder for each cycle. These two tables will come in handy when |
| 432 | we start discussing the Viterbi decoder algorithm. | 432 | we start discussing the Viterbi decoder algorithm. |
| 433 | <p><a NAME="mapping"></a><b><i><font face="Arial">Mapping the Channel Symbols | 433 | <p><a NAME="mapping"></a><b><i><font face="Arial">Mapping the Channel Symbols |
| 434 | to Signal Levels</font></i></b> | 434 | to Signal Levels</font></i></b> |
| 435 | <p>Mapping the one/zero output of the convolutional encoder onto an antipodal | 435 | <p>Mapping the one/zero output of the convolutional encoder onto an antipodal |
| 436 | baseband signaling scheme is simply a matter of translating zeroes to +1s | 436 | baseband signaling scheme is simply a matter of translating zeroes to +1s |
| 437 | and ones to -1s. This can be accomplished by performing the operation y | 437 | and ones to -1s. This can be accomplished by performing the operation y |
| 438 | = 1 - 2x on each convolutional encoder output symbol. | 438 | = 1 - 2x on each convolutional encoder output symbol. |
| 439 | <p><a NAME="addnoise"></a><b><i><font face="Arial">Adding Noise to the | 439 | <p><a NAME="addnoise"></a><b><i><font face="Arial">Adding Noise to the |
| 440 | Transmitted Symbols</font></i></b> | 440 | Transmitted Symbols</font></i></b> |
| 441 | <p>Adding noise to the transmitted channel symbols produced by the convolutional | 441 | <p>Adding noise to the transmitted channel symbols produced by the convolutional |
| 442 | encoder involves generating Gaussian random numbers, scaling the numbers | 442 | encoder involves generating Gaussian random numbers, scaling the numbers |
| 443 | according to the desired energy per symbol to noise density ratio, E<sub>s</sub>/N<sub>0</sub>, | 443 | according to the desired energy per symbol to noise density ratio, E<sub>s</sub>/N<sub>0</sub>, |
| 444 | and adding the scaled Gaussian random numbers to the channel symbol values. | 444 | and adding the scaled Gaussian random numbers to the channel symbol values. |
| 445 | <p>For the uncoded channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub>, | 445 | <p>For the uncoded channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub>, |
| 446 | since there is one channel symbol per bit. However, for the coded | 446 | since there is one channel symbol per bit. However, for the coded |
| 447 | channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> + 10log<sub>10</sub>(k/n). | 447 | channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> + 10log<sub>10</sub>(k/n). |
| 448 | For example, for rate 1/2 coding, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> | 448 | For example, for rate 1/2 coding, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> |
| 449 | + 10log<sub>10</sub>(1/2) = E<sub>b</sub>/N<sub>0</sub> - 3.01 dB. | 449 | + 10log<sub>10</sub>(1/2) = E<sub>b</sub>/N<sub>0</sub> - 3.01 dB. |
| 450 | Similarly, for rate 2/3 coding, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> | 450 | Similarly, for rate 2/3 coding, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> |
| 451 | + 10log<sub>10</sub>(2/3) = E<sub>b</sub>/N<sub>0</sub> - 1.76 dB. | 451 | + 10log<sub>10</sub>(2/3) = E<sub>b</sub>/N<sub>0</sub> - 1.76 dB. |
| 452 | <p>The Gaussian random number generator is the only interesting part of | 452 | <p>The Gaussian random number generator is the only interesting part of |
| 453 | this task. C only provides a uniform random number generator, <tt>rand()</tt>. | 453 | this task. C only provides a uniform random number generator, <tt>rand()</tt>. |
| 454 | In order to obtain Gaussian random numbers, we take advantage of relationships | 454 | In order to obtain Gaussian random numbers, we take advantage of relationships |
| 455 | between uniform, Rayleigh, and Gaussian distributions: | 455 | between uniform, Rayleigh, and Gaussian distributions: |
| 456 | <p>Given a uniform random variable U, a Rayleigh random variable R can | 456 | <p>Given a uniform random variable U, a Rayleigh random variable R can |
| 457 | be obtained by: | 457 | be obtained by: |
| 458 | <p><img SRC="figs/eqn01.gif" ALT="equation for Rayleigh random deviate given uniform random deviate" height=30 width=297 align=ABSCENTER> | 458 | <p><img SRC="figs/eqn01.gif" ALT="equation for Rayleigh random deviate given uniform random deviate" height=30 width=297 align=ABSCENTER> |
| 459 | <p>where <img SRC="figs/eqn02.gif" height=24 width=24 align=ABSCENTER>is | 459 | <p>where <img SRC="figs/eqn02.gif" height=24 width=24 align=ABSCENTER>is |
| 460 | the variance of the Rayleigh random variable, and given R and a second | 460 | the variance of the Rayleigh random variable, and given R and a second |
| 461 | uniform random variable V, two Gaussian random variables G and H can be | 461 | uniform random variable V, two Gaussian random variables G and H can be |
| 462 | obtained by | 462 | obtained by |
| 463 | <p><i>G</i> = <i>R</i> cos <i>U</i> and <i>H</i> = <i>R</i> sin <i>V</i>. | 463 | <p><i>G</i> = <i>R</i> cos <i>U</i> and <i>H</i> = <i>R</i> sin <i>V</i>. |
| 464 | <p>In the AWGN channel, the signal is corrupted by additive noise, n(t), | 464 | <p>In the AWGN channel, the signal is corrupted by additive noise, n(t), |
| 465 | which has the power spectrum <i>No</i>/2 watts/Hz. The variance <img SRC="figs/eqn02.gif" ALT="variance" height=24 width=24 align=ABSBOTTOM>of | 465 | which has the power spectrum <i>No</i>/2 watts/Hz. The variance <img SRC="figs/eqn02.gif" ALT="variance" height=24 width=24 align=ABSBOTTOM>of |
| 466 | this noise is equal to <img SRC="figs/eqn03.gif" ALT="noise density div by two" height=22 width=38 align=TEXTTOP>. | 466 | this noise is equal to <img SRC="figs/eqn03.gif" ALT="noise density div by two" height=22 width=38 align=TEXTTOP>. |
| 467 | If we set the energy per symbol <i>E<sub>s</sub></i> equal to 1, then <img SRC="figs/eqn04.gif" ALT="equation relating variance to SNR" height=28 width=110 align=ABSBOTTOM>. | 467 | If we set the energy per symbol <i>E<sub>s</sub></i> equal to 1, then <img SRC="figs/eqn04.gif" ALT="equation relating variance to SNR" height=28 width=110 align=ABSBOTTOM>. |
| 468 | So <img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" height=28 width=139 align=ABSCENTER>. | 468 | So <img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" height=28 width=139 align=ABSCENTER>. |
| 469 | <p><a NAME="quantizing"></a><b><i><font face="Arial">Quantizing the Received | 469 | <p><a NAME="quantizing"></a><b><i><font face="Arial">Quantizing the Received |
| 470 | Channel Symbols</font></i></b> | 470 | Channel Symbols</font></i></b> |
| 471 | <p>An ideal Viterbi decoder would work with infinite precision, or at least | 471 | <p>An ideal Viterbi decoder would work with infinite precision, or at least |
| 472 | with floating-point numbers. In practical systems, we quantize the received | 472 | with floating-point numbers. In practical systems, we quantize the received |
| 473 | channel symbols with one or a few bits of precision in order to reduce | 473 | channel symbols with one or a few bits of precision in order to reduce |
| 474 | the complexity of the Viterbi decoder, not to mention the circuits that | 474 | the complexity of the Viterbi decoder, not to mention the circuits that |
| 475 | precede it. If the received channel symbols are quantized to one-bit precision | 475 | precede it. If the received channel symbols are quantized to one-bit precision |
| 476 | (< 0V = 1, <u>></u> 0V = 0), the result is called hard-decision data. | 476 | (< 0V = 1, <u>></u> 0V = 0), the result is called hard-decision data. |
| 477 | If the received channel symbols are quantized with more than one bit of | 477 | If the received channel symbols are quantized with more than one bit of |
| 478 | precision, the result is called soft-decision data. A Viterbi decoder with | 478 | precision, the result is called soft-decision data. A Viterbi decoder with |
| 479 | soft decision data inputs quantized to three or four bits of precision | 479 | soft decision data inputs quantized to three or four bits of precision |
| 480 | can perform about 2 dB better than one working with hard-decision inputs. | 480 | can perform about 2 dB better than one working with hard-decision inputs. |
| 481 | The usual quantization precision is three bits. More bits provide little | 481 | The usual quantization precision is three bits. More bits provide little |
| 482 | additional improvement. | 482 | additional improvement. |
| 483 | <p>The selection of the quantizing levels is an important design decision | 483 | <p>The selection of the quantizing levels is an important design decision |
| 484 | because it can have a significant effect on the performance of the link. | 484 | because it can have a significant effect on the performance of the link. |
| 485 | The following is a very brief explanation of one way to set those levels. | 485 | The following is a very brief explanation of one way to set those levels. |
| 486 | Let's assume our received signal levels in the absence of noise are -1V | 486 | Let's assume our received signal levels in the absence of noise are -1V |
| 487 | = 1, +1V = 0. With noise, our received signal has mean +/- 1 and standard | 487 | = 1, +1V = 0. With noise, our received signal has mean +/- 1 and standard |
| 488 | deviation <img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" height=28 width=139 align=ABSCENTER>. | 488 | deviation <img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" height=28 width=139 align=ABSCENTER>. |
| 489 | Let's use a uniform, three-bit quantizer having the input/output relationship | 489 | Let's use a uniform, three-bit quantizer having the input/output relationship |
| 490 | shown in the figure below, where D is a decision level that we will calculate | 490 | shown in the figure below, where D is a decision level that we will calculate |
| 491 | shortly: | 491 | shortly: |
| 492 | <center> | 492 | <center> |
| 493 | <p><img SRC="figs/quantize.gif" ALT="8-level quantizer function plot" height=342 width=384></center> | 493 | <p><img SRC="figs/quantize.gif" ALT="8-level quantizer function plot" height=342 width=384></center> |
| 494 | 494 | ||
| 495 | <p>The decision level, D, can be calculated according to the formula <img SRC="figs/eqn06.gif" ALT="equation for quantizer decision level" height=28 width=228 align=ABSCENTER>, | 495 | <p>The decision level, D, can be calculated according to the formula <img SRC="figs/eqn06.gif" ALT="equation for quantizer decision level" height=28 width=228 align=ABSCENTER>, |
| 496 | where E<sub>s</sub>/N<sub>0</sub> is the energy per symbol to noise density | 496 | where E<sub>s</sub>/N<sub>0</sub> is the energy per symbol to noise density |
| 497 | ratio<i>. (The above figure was redrawn from Figure 2 of Advanced Hardware | 497 | ratio<i>. (The above figure was redrawn from Figure 2 of Advanced Hardware |
| 498 | Architecture's ANRS07-0795, "Soft Decision Thresholds and Effects on Viterbi | 498 | Architecture's ANRS07-0795, "Soft Decision Thresholds and Effects on Viterbi |
| 499 | Performance". See the </i><a href="fecbiblio.html">bibliography</a><i> | 499 | Performance". See the </i><a href="fecbiblio.html">bibliography</a><i> |
| 500 | for a link to their web pages.)</i> | 500 | for a link to their web pages.)</i> |
| 501 | <p>Click <a href="algrthms2.html">here</a> to proceed to the description | 501 | <p>Click <a href="algrthms2.html">here</a> to proceed to the description |
| 502 | of the Viterbi decoding algorithm itself... | 502 | of the Viterbi decoding algorithm itself... |
| 503 | <p>Or click on one of the links below to go to the beginning of that section: | 503 | <p>Or click on one of the links below to go to the beginning of that section: |
| 504 | <p> <a href="tutorial.html">Introduction</a> | 504 | <p> <a href="tutorial.html">Introduction</a> |
| 505 | <br> <a href="algrthms2.html">Description of the Algorithms | 505 | <br> <a href="algrthms2.html">Description of the Algorithms |
| 506 | (Part 2)</a> | 506 | (Part 2)</a> |
| 507 | <br> <a href="examples.html">Simulation Source Code Examples</a> | 507 | <br> <a href="examples.html">Simulation Source Code Examples</a> |
| 508 | <br> <a href="simrslts.html">Example Simulation Results</a> | 508 | <br> <a href="simrslts.html">Example Simulation Results</a> |
| 509 | <br> <a href="fecbiblio.html">Bibliography</a> | 509 | <br> <a href="fecbiblio.html">Bibliography</a> |
| 510 | <br> <a href="tutorial.html#specapps">About Spectrum Applications...</a> | 510 | <br> <a href="tutorial.html#specapps">About Spectrum Applications...</a> |
| 511 | <br> | 511 | <br> |
| 512 | <br> | 512 | <br> |
| 513 | <br> | 513 | <br> |
| 514 | <br> | 514 | <br> |
| 515 | <center> | 515 | <center> |
| 516 | <p><img SRC="figs/stripe.gif" height=6 width=600></center> | 516 | <p><img SRC="figs/stripe.gif" height=6 width=600></center> |
| 517 | 517 | ||
| 518 | </body> | 518 | </body> |
| 519 | </html> | 519 | </html> |