AD9857 IQ DDS Digital Up Converter Experiment using Nucleo F401

Dependencies:   mbed

Digital Signal Processing for IQ Quadradure Modulation DDS AD9857 using Nucleo F401.

see http://ttrftech.tumblr.com/post/114310226891/

Revision:
5:75c26157a53a
Parent:
4:dfd05c26edbe
Child:
6:ed82052bd505
--- a/dsp.cpp	Mon Mar 23 16:03:07 2015 +0000
+++ b/dsp.cpp	Mon Mar 23 21:43:29 2015 +0000
@@ -194,276 +194,276 @@
 }
 
 const int16_t cos_sin_table[257][4] = {
-    {     0,  402, -32767,    2 },
-    {   402,  402, -32765,    8 },
-    {   804,  402, -32757,   12 },
-    {  1206,  402, -32745,   17 },
-    {  1608,  401, -32728,   23 },
-    {  2009,  401, -32705,   27 },
-    {  2410,  401, -32678,   32 },
-    {  2811,  401, -32646,   37 },
-    {  3212,  400, -32609,   42 },
-    {  3612,  399, -32567,   46 },
-    {  4011,  399, -32521,   52 },
-    {  4410,  398, -32469,   57 },
-    {  4808,  397, -32412,   61 },
-    {  5205,  397, -32351,   66 },
-    {  5602,  396, -32285,   72 },
-    {  5998,  395, -32213,   76 },
-    {  6393,  393, -32137,   80 },
-    {  6786,  393, -32057,   86 },
-    {  7179,  392, -31971,   91 },
-    {  7571,  391, -31880,   95 },
-    {  7962,  389, -31785,  100 },
-    {  8351,  388, -31685,  105 },
-    {  8739,  387, -31580,  110 },
-    {  9126,  386, -31470,  114 },
-    {  9512,  384, -31356,  119 },
-    {  9896,  382, -31237,  124 },
-    { 10278,  381, -31113,  128 },
-    { 10659,  380, -30985,  133 },
-    { 11039,  378, -30852,  138 },
-    { 11417,  376, -30714,  143 },
-    { 11793,  374, -30571,  147 },
-    { 12167,  372, -30424,  151 },
-    { 12539,  371, -30273,  156 },
-    { 12910,  369, -30117,  161 },
-    { 13279,  366, -29956,  165 },
-    { 13645,  365, -29791,  170 },
-    { 14010,  362, -29621,  174 },
-    { 14372,  360, -29447,  179 },
-    { 14732,  358, -29268,  183 },
-    { 15090,  356, -29085,  187 },
-    { 15446,  354, -28898,  192 },
-    { 15800,  351, -28706,  196 },
-    { 16151,  348, -28510,  200 },
-    { 16499,  347, -28310,  205 },
-    { 16846,  343, -28105,  209 },
-    { 17189,  341, -27896,  213 },
-    { 17530,  339, -27683,  217 },
-    { 17869,  335, -27466,  221 },
-    { 18204,  333, -27245,  226 },
-    { 18537,  331, -27019,  229 },
-    { 18868,  327, -26790,  234 },
-    { 19195,  324, -26556,  237 },
-    { 19519,  322, -26319,  242 },
-    { 19841,  318, -26077,  245 },
-    { 20159,  316, -25832,  250 },
-    { 20475,  312, -25582,  253 },
-    { 20787,  309, -25329,  257 },
-    { 21096,  307, -25072,  261 },
-    { 21403,  302, -24811,  264 },
-    { 21705,  300, -24547,  268 },
-    { 22005,  296, -24279,  272 },
-    { 22301,  293, -24007,  276 },
-    { 22594,  290, -23731,  279 },
-    { 22884,  286, -23452,  282 },
-    { 23170,  282, -23170,  286 },
-    { 23452,  279, -22884,  290 },
-    { 23731,  276, -22594,  293 },
-    { 24007,  272, -22301,  296 },
-    { 24279,  268, -22005,  300 },
-    { 24547,  264, -21705,  302 },
-    { 24811,  261, -21403,  307 },
-    { 25072,  257, -21096,  309 },
-    { 25329,  253, -20787,  312 },
-    { 25582,  250, -20475,  316 },
-    { 25832,  245, -20159,  318 },
-    { 26077,  242, -19841,  322 },
-    { 26319,  237, -19519,  324 },
-    { 26556,  234, -19195,  327 },
-    { 26790,  229, -18868,  331 },
-    { 27019,  226, -18537,  333 },
-    { 27245,  221, -18204,  335 },
-    { 27466,  217, -17869,  339 },
-    { 27683,  213, -17530,  341 },
-    { 27896,  209, -17189,  343 },
-    { 28105,  205, -16846,  347 },
-    { 28310,  200, -16499,  348 },
-    { 28510,  196, -16151,  351 },
-    { 28706,  192, -15800,  354 },
-    { 28898,  187, -15446,  356 },
-    { 29085,  183, -15090,  358 },
-    { 29268,  179, -14732,  360 },
-    { 29447,  174, -14372,  362 },
-    { 29621,  170, -14010,  365 },
-    { 29791,  165, -13645,  366 },
-    { 29956,  161, -13279,  369 },
-    { 30117,  156, -12910,  371 },
-    { 30273,  151, -12539,  372 },
-    { 30424,  147, -12167,  374 },
-    { 30571,  143, -11793,  376 },
-    { 30714,  138, -11417,  378 },
-    { 30852,  133, -11039,  380 },
-    { 30985,  128, -10659,  381 },
-    { 31113,  124, -10278,  382 },
-    { 31237,  119,  -9896,  384 },
-    { 31356,  114,  -9512,  386 },
-    { 31470,  110,  -9126,  387 },
-    { 31580,  105,  -8739,  388 },
-    { 31685,  100,  -8351,  389 },
-    { 31785,   95,  -7962,  391 },
-    { 31880,   91,  -7571,  392 },
-    { 31971,   86,  -7179,  393 },
-    { 32057,   80,  -6786,  393 },
-    { 32137,   76,  -6393,  395 },
-    { 32213,   72,  -5998,  396 },
-    { 32285,   66,  -5602,  397 },
-    { 32351,   61,  -5205,  397 },
-    { 32412,   57,  -4808,  398 },
-    { 32469,   52,  -4410,  399 },
-    { 32521,   46,  -4011,  399 },
-    { 32567,   42,  -3612,  400 },
-    { 32609,   37,  -3212,  401 },
-    { 32646,   32,  -2811,  401 },
-    { 32678,   27,  -2410,  401 },
-    { 32705,   23,  -2009,  401 },
-    { 32728,   17,  -1608,  402 },
-    { 32745,   12,  -1206,  402 },
-    { 32757,    8,   -804,  402 },
-    { 32765,    2,   -402,  402 },
-    { 32767,   -2,      0,  402 },
-    { 32765,   -8,    402,  402 },
-    { 32757,  -12,    804,  402 },
-    { 32745,  -17,   1206,  402 },
-    { 32728,  -23,   1608,  401 },
-    { 32705,  -27,   2009,  401 },
-    { 32678,  -32,   2410,  401 },
-    { 32646,  -37,   2811,  401 },
-    { 32609,  -42,   3212,  400 },
-    { 32567,  -46,   3612,  399 },
-    { 32521,  -52,   4011,  399 },
-    { 32469,  -57,   4410,  398 },
-    { 32412,  -61,   4808,  397 },
-    { 32351,  -66,   5205,  397 },
-    { 32285,  -72,   5602,  396 },
-    { 32213,  -76,   5998,  395 },
-    { 32137,  -80,   6393,  393 },
-    { 32057,  -86,   6786,  393 },
-    { 31971,  -91,   7179,  392 },
-    { 31880,  -95,   7571,  391 },
-    { 31785, -100,   7962,  389 },
-    { 31685, -105,   8351,  388 },
-    { 31580, -110,   8739,  387 },
-    { 31470, -114,   9126,  386 },
-    { 31356, -119,   9512,  384 },
-    { 31237, -124,   9896,  382 },
-    { 31113, -128,  10278,  381 },
-    { 30985, -133,  10659,  380 },
-    { 30852, -138,  11039,  378 },
-    { 30714, -143,  11417,  376 },
-    { 30571, -147,  11793,  374 },
-    { 30424, -151,  12167,  372 },
-    { 30273, -156,  12539,  371 },
-    { 30117, -161,  12910,  369 },
-    { 29956, -165,  13279,  366 },
-    { 29791, -170,  13645,  365 },
-    { 29621, -174,  14010,  362 },
-    { 29447, -179,  14372,  360 },
-    { 29268, -183,  14732,  358 },
-    { 29085, -187,  15090,  356 },
-    { 28898, -192,  15446,  354 },
-    { 28706, -196,  15800,  351 },
-    { 28510, -200,  16151,  348 },
-    { 28310, -205,  16499,  347 },
-    { 28105, -209,  16846,  343 },
-    { 27896, -213,  17189,  341 },
-    { 27683, -217,  17530,  339 },
-    { 27466, -221,  17869,  335 },
-    { 27245, -226,  18204,  333 },
-    { 27019, -229,  18537,  331 },
-    { 26790, -234,  18868,  327 },
-    { 26556, -237,  19195,  324 },
-    { 26319, -242,  19519,  322 },
-    { 26077, -245,  19841,  318 },
-    { 25832, -250,  20159,  316 },
-    { 25582, -253,  20475,  312 },
-    { 25329, -257,  20787,  309 },
-    { 25072, -261,  21096,  307 },
-    { 24811, -264,  21403,  302 },
-    { 24547, -268,  21705,  300 },
-    { 24279, -272,  22005,  296 },
-    { 24007, -276,  22301,  293 },
-    { 23731, -279,  22594,  290 },
-    { 23452, -282,  22884,  286 },
-    { 23170, -286,  23170,  282 },
-    { 22884, -290,  23452,  279 },
-    { 22594, -293,  23731,  276 },
-    { 22301, -296,  24007,  272 },
-    { 22005, -300,  24279,  268 },
-    { 21705, -302,  24547,  264 },
-    { 21403, -307,  24811,  261 },
-    { 21096, -309,  25072,  257 },
-    { 20787, -312,  25329,  253 },
-    { 20475, -316,  25582,  250 },
-    { 20159, -318,  25832,  245 },
-    { 19841, -322,  26077,  242 },
-    { 19519, -324,  26319,  237 },
-    { 19195, -327,  26556,  234 },
-    { 18868, -331,  26790,  229 },
-    { 18537, -333,  27019,  226 },
-    { 18204, -335,  27245,  221 },
-    { 17869, -339,  27466,  217 },
-    { 17530, -341,  27683,  213 },
-    { 17189, -343,  27896,  209 },
-    { 16846, -347,  28105,  205 },
-    { 16499, -348,  28310,  200 },
-    { 16151, -351,  28510,  196 },
-    { 15800, -354,  28706,  192 },
-    { 15446, -356,  28898,  187 },
-    { 15090, -358,  29085,  183 },
-    { 14732, -360,  29268,  179 },
-    { 14372, -362,  29447,  174 },
-    { 14010, -365,  29621,  170 },
-    { 13645, -366,  29791,  165 },
-    { 13279, -369,  29956,  161 },
-    { 12910, -371,  30117,  156 },
-    { 12539, -372,  30273,  151 },
-    { 12167, -374,  30424,  147 },
-    { 11793, -376,  30571,  143 },
-    { 11417, -378,  30714,  138 },
-    { 11039, -380,  30852,  133 },
-    { 10659, -381,  30985,  128 },
-    { 10278, -382,  31113,  124 },
-    {  9896, -384,  31237,  119 },
-    {  9512, -386,  31356,  114 },
-    {  9126, -387,  31470,  110 },
-    {  8739, -388,  31580,  105 },
-    {  8351, -389,  31685,  100 },
-    {  7962, -391,  31785,   95 },
-    {  7571, -392,  31880,   91 },
-    {  7179, -393,  31971,   86 },
-    {  6786, -393,  32057,   80 },
-    {  6393, -395,  32137,   76 },
-    {  5998, -396,  32213,   72 },
-    {  5602, -397,  32285,   66 },
-    {  5205, -397,  32351,   61 },
-    {  4808, -398,  32412,   57 },
-    {  4410, -399,  32469,   52 },
-    {  4011, -399,  32521,   46 },
-    {  3612, -400,  32567,   42 },
-    {  3212, -401,  32609,   37 },
-    {  2811, -401,  32646,   32 },
-    {  2410, -401,  32678,   27 },
-    {  2009, -401,  32705,   23 },
-    {  1608, -402,  32728,   17 },
-    {  1206, -402,  32745,   12 },
-    {   804, -402,  32757,    8 },
-    {   402, -402,  32765,    2 },
-    {     0, -402,  32767,    0 }
+    { -32767,   10,      0, -804 },
+    { -32757,   29,   -804, -804 },
+    { -32728,   50,  -1608, -802 },
+    { -32678,   69,  -2410, -802 },
+    { -32609,   88,  -3212, -799 },
+    { -32521,  109,  -4011, -797 },
+    { -32412,  127,  -4808, -794 },
+    { -32285,  148,  -5602, -791 },
+    { -32137,  166,  -6393, -786 },
+    { -31971,  186,  -7179, -783 },
+    { -31785,  205,  -7962, -777 },
+    { -31580,  224,  -8739, -773 },
+    { -31356,  243,  -9512, -766 },
+    { -31113,  261, -10278, -761 },
+    { -30852,  281, -11039, -754 },
+    { -30571,  298, -11793, -746 },
+    { -30273,  317, -12539, -740 },
+    { -29956,  335, -13279, -731 },
+    { -29621,  353, -14010, -722 },
+    { -29268,  370, -14732, -714 },
+    { -28898,  388, -15446, -705 },
+    { -28510,  405, -16151, -695 },
+    { -28105,  422, -16846, -684 },
+    { -27683,  438, -17530, -674 },
+    { -27245,  455, -18204, -664 },
+    { -26790,  471, -18868, -651 },
+    { -26319,  487, -19519, -640 },
+    { -25832,  503, -20159, -628 },
+    { -25329,  518, -20787, -616 },
+    { -24811,  532, -21403, -602 },
+    { -24279,  548, -22005, -589 },
+    { -23731,  561, -22594, -576 },
+    { -23170,  576, -23170, -561 },
+    { -22594,  589, -23731, -548 },
+    { -22005,  602, -24279, -532 },
+    { -21403,  616, -24811, -518 },
+    { -20787,  628, -25329, -503 },
+    { -20159,  640, -25832, -487 },
+    { -19519,  651, -26319, -471 },
+    { -18868,  664, -26790, -455 },
+    { -18204,  674, -27245, -438 },
+    { -17530,  684, -27683, -422 },
+    { -16846,  695, -28105, -405 },
+    { -16151,  705, -28510, -388 },
+    { -15446,  714, -28898, -370 },
+    { -14732,  722, -29268, -353 },
+    { -14010,  731, -29621, -335 },
+    { -13279,  740, -29956, -317 },
+    { -12539,  746, -30273, -298 },
+    { -11793,  754, -30571, -281 },
+    { -11039,  761, -30852, -261 },
+    { -10278,  766, -31113, -243 },
+    { -9512,  773, -31356, -224 },
+    { -8739,  777, -31580, -205 },
+    { -7962,  783, -31785, -186 },
+    { -7179,  786, -31971, -166 },
+    { -6393,  791, -32137, -148 },
+    { -5602,  794, -32285, -127 },
+    { -4808,  797, -32412, -109 },
+    { -4011,  799, -32521,  -88 },
+    { -3212,  802, -32609,  -69 },
+    { -2410,  802, -32678,  -50 },
+    { -1608,  804, -32728,  -29 },
+    {  -804,  804, -32757,  -10 },
+    {     0,  804, -32767,   10 },
+    {   804,  804, -32757,   29 },
+    {  1608,  802, -32728,   50 },
+    {  2410,  802, -32678,   69 },
+    {  3212,  799, -32609,   88 },
+    {  4011,  797, -32521,  109 },
+    {  4808,  794, -32412,  127 },
+    {  5602,  791, -32285,  148 },
+    {  6393,  786, -32137,  166 },
+    {  7179,  783, -31971,  186 },
+    {  7962,  777, -31785,  205 },
+    {  8739,  773, -31580,  224 },
+    {  9512,  766, -31356,  243 },
+    { 10278,  761, -31113,  261 },
+    { 11039,  754, -30852,  281 },
+    { 11793,  746, -30571,  298 },
+    { 12539,  740, -30273,  317 },
+    { 13279,  731, -29956,  335 },
+    { 14010,  722, -29621,  353 },
+    { 14732,  714, -29268,  370 },
+    { 15446,  705, -28898,  388 },
+    { 16151,  695, -28510,  405 },
+    { 16846,  684, -28105,  422 },
+    { 17530,  674, -27683,  438 },
+    { 18204,  664, -27245,  455 },
+    { 18868,  651, -26790,  471 },
+    { 19519,  640, -26319,  487 },
+    { 20159,  628, -25832,  503 },
+    { 20787,  616, -25329,  518 },
+    { 21403,  602, -24811,  532 },
+    { 22005,  589, -24279,  548 },
+    { 22594,  576, -23731,  561 },
+    { 23170,  561, -23170,  576 },
+    { 23731,  548, -22594,  589 },
+    { 24279,  532, -22005,  602 },
+    { 24811,  518, -21403,  616 },
+    { 25329,  503, -20787,  628 },
+    { 25832,  487, -20159,  640 },
+    { 26319,  471, -19519,  651 },
+    { 26790,  455, -18868,  664 },
+    { 27245,  438, -18204,  674 },
+    { 27683,  422, -17530,  684 },
+    { 28105,  405, -16846,  695 },
+    { 28510,  388, -16151,  705 },
+    { 28898,  370, -15446,  714 },
+    { 29268,  353, -14732,  722 },
+    { 29621,  335, -14010,  731 },
+    { 29956,  317, -13279,  740 },
+    { 30273,  298, -12539,  746 },
+    { 30571,  281, -11793,  754 },
+    { 30852,  261, -11039,  761 },
+    { 31113,  243, -10278,  766 },
+    { 31356,  224,  -9512,  773 },
+    { 31580,  205,  -8739,  777 },
+    { 31785,  186,  -7962,  783 },
+    { 31971,  166,  -7179,  786 },
+    { 32137,  148,  -6393,  791 },
+    { 32285,  127,  -5602,  794 },
+    { 32412,  109,  -4808,  797 },
+    { 32521,   88,  -4011,  799 },
+    { 32609,   69,  -3212,  802 },
+    { 32678,   50,  -2410,  802 },
+    { 32728,   29,  -1608,  804 },
+    { 32757,   10,   -804,  804 },
+    { 32767,  -10,      0,  804 },
+    { 32757,  -29,    804,  804 },
+    { 32728,  -50,   1608,  802 },
+    { 32678,  -69,   2410,  802 },
+    { 32609,  -88,   3212,  799 },
+    { 32521, -109,   4011,  797 },
+    { 32412, -127,   4808,  794 },
+    { 32285, -148,   5602,  791 },
+    { 32137, -166,   6393,  786 },
+    { 31971, -186,   7179,  783 },
+    { 31785, -205,   7962,  777 },
+    { 31580, -224,   8739,  773 },
+    { 31356, -243,   9512,  766 },
+    { 31113, -261,  10278,  761 },
+    { 30852, -281,  11039,  754 },
+    { 30571, -298,  11793,  746 },
+    { 30273, -317,  12539,  740 },
+    { 29956, -335,  13279,  731 },
+    { 29621, -353,  14010,  722 },
+    { 29268, -370,  14732,  714 },
+    { 28898, -388,  15446,  705 },
+    { 28510, -405,  16151,  695 },
+    { 28105, -422,  16846,  684 },
+    { 27683, -438,  17530,  674 },
+    { 27245, -455,  18204,  664 },
+    { 26790, -471,  18868,  651 },
+    { 26319, -487,  19519,  640 },
+    { 25832, -503,  20159,  628 },
+    { 25329, -518,  20787,  616 },
+    { 24811, -532,  21403,  602 },
+    { 24279, -548,  22005,  589 },
+    { 23731, -561,  22594,  576 },
+    { 23170, -576,  23170,  561 },
+    { 22594, -589,  23731,  548 },
+    { 22005, -602,  24279,  532 },
+    { 21403, -616,  24811,  518 },
+    { 20787, -628,  25329,  503 },
+    { 20159, -640,  25832,  487 },
+    { 19519, -651,  26319,  471 },
+    { 18868, -664,  26790,  455 },
+    { 18204, -674,  27245,  438 },
+    { 17530, -684,  27683,  422 },
+    { 16846, -695,  28105,  405 },
+    { 16151, -705,  28510,  388 },
+    { 15446, -714,  28898,  370 },
+    { 14732, -722,  29268,  353 },
+    { 14010, -731,  29621,  335 },
+    { 13279, -740,  29956,  317 },
+    { 12539, -746,  30273,  298 },
+    { 11793, -754,  30571,  281 },
+    { 11039, -761,  30852,  261 },
+    { 10278, -766,  31113,  243 },
+    {  9512, -773,  31356,  224 },
+    {  8739, -777,  31580,  205 },
+    {  7962, -783,  31785,  186 },
+    {  7179, -786,  31971,  166 },
+    {  6393, -791,  32137,  148 },
+    {  5602, -794,  32285,  127 },
+    {  4808, -797,  32412,  109 },
+    {  4011, -799,  32521,   88 },
+    {  3212, -802,  32609,   69 },
+    {  2410, -802,  32678,   50 },
+    {  1608, -804,  32728,   29 },
+    {   804, -804,  32757,   10 },
+    {     0, -804,  32767,  -10 },
+    {  -804, -804,  32757,  -29 },
+    { -1608, -802,  32728,  -50 },
+    { -2410, -802,  32678,  -69 },
+    { -3212, -799,  32609,  -88 },
+    { -4011, -797,  32521, -109 },
+    { -4808, -794,  32412, -127 },
+    { -5602, -791,  32285, -148 },
+    { -6393, -786,  32137, -166 },
+    { -7179, -783,  31971, -186 },
+    { -7962, -777,  31785, -205 },
+    { -8739, -773,  31580, -224 },
+    { -9512, -766,  31356, -243 },
+    { -10278, -761,  31113, -261 },
+    { -11039, -754,  30852, -281 },
+    { -11793, -746,  30571, -298 },
+    { -12539, -740,  30273, -317 },
+    { -13279, -731,  29956, -335 },
+    { -14010, -722,  29621, -353 },
+    { -14732, -714,  29268, -370 },
+    { -15446, -705,  28898, -388 },
+    { -16151, -695,  28510, -405 },
+    { -16846, -684,  28105, -422 },
+    { -17530, -674,  27683, -438 },
+    { -18204, -664,  27245, -455 },
+    { -18868, -651,  26790, -471 },
+    { -19519, -640,  26319, -487 },
+    { -20159, -628,  25832, -503 },
+    { -20787, -616,  25329, -518 },
+    { -21403, -602,  24811, -532 },
+    { -22005, -589,  24279, -548 },
+    { -22594, -576,  23731, -561 },
+    { -23170, -561,  23170, -576 },
+    { -23731, -548,  22594, -589 },
+    { -24279, -532,  22005, -602 },
+    { -24811, -518,  21403, -616 },
+    { -25329, -503,  20787, -628 },
+    { -25832, -487,  20159, -640 },
+    { -26319, -471,  19519, -651 },
+    { -26790, -455,  18868, -664 },
+    { -27245, -438,  18204, -674 },
+    { -27683, -422,  17530, -684 },
+    { -28105, -405,  16846, -695 },
+    { -28510, -388,  16151, -705 },
+    { -28898, -370,  15446, -714 },
+    { -29268, -353,  14732, -722 },
+    { -29621, -335,  14010, -731 },
+    { -29956, -317,  13279, -740 },
+    { -30273, -298,  12539, -746 },
+    { -30571, -281,  11793, -754 },
+    { -30852, -261,  11039, -761 },
+    { -31113, -243,  10278, -766 },
+    { -31356, -224,   9512, -773 },
+    { -31580, -205,   8739, -777 },
+    { -31785, -186,   7962, -783 },
+    { -31971, -166,   7179, -786 },
+    { -32137, -148,   6393, -791 },
+    { -32285, -127,   5602, -794 },
+    { -32412, -109,   4808, -797 },
+    { -32521,  -88,   4011, -799 },
+    { -32609,  -69,   3212, -802 },
+    { -32678,  -50,   2410, -802 },
+    { -32728,  -29,   1608, -804 },
+    { -32757,  -10,    804, -804 },
+    { -32767,  -10,      0,    0 }
 };
 
 static inline 
 uint32_t cos_sin(int16_t x)
 {
-    int idx = x >> 8;
+    int idx = x / 256;
     int mod = x & 0xff;
-    int r = __PKHBT(0x00000100, mod, 16);
+    uint32_t r = __PKHBT(0x0100, mod, 16);
     uint32_t *e = (uint32_t *)&cos_sin_table[idx+128];
-    uint32_t c = e[0];
-    uint32_t s = e[1];
-    c = __SMUAD(r, c);
-    s = __SMUAD(r, s);
+    uint32_t cd = e[0];
+    uint32_t sd = e[1];
+    int32_t c = __SMUAD(r, cd);
+    int32_t s = __SMUAD(r, sd);
     c >>= 8;
     s >>= 8;
     return __PKHBT(s, c, 16);
@@ -486,21 +486,27 @@
         uint32_t s = *src++;
         // fetch only R-ch (top half of word)
         int16_t x = s >> 16;
-        uint32_t cs = cos_sin(x);
-        uint32_t real = __SMUSD(vec, cs);
-        uint32_t imag = __SMUADX(vec, cs);
+        uint32_t cs = cos_sin(x*5);
+        int32_t real = __SMUSD(vec, cs);
+        int32_t imag = __SMUADX(vec, cs);
         real >>= 15;
         imag >>= 15;
         vec = __PKHBT(imag, real, 16);
         *dst++ = vec;
     }
+#if 0
+    uint32_t mag = sqrt((float)__SMUAD(vec, vec));
+    int32_t veci = ((vec & 0xffff) << 16) / (int32_t)(mag<<1);
+    int32_t vecq = (vec & 0xffff0000) / (int32_t)(mag<<1);
+    vec = __PKHBT(veci, vecq, 16);
+#endif
 #if 1
     uint32_t mag = __SMUAD(vec, vec);
     if (mag < 0x10000) {
         // force initialize
         vec = 0x7fff0000;
     } else if (mag < 0x3ff00000) {
-        uint32_t d = __PKHBT((int16_t)(vec&0xffff) >> 12, vec >> 12, 0);
+        uint32_t d = __PKHBT((int16_t)(vec&0xffff) >> 12, (int32_t)vec >> 12, 0);
         vec = __QADD16(vec, d);
     }
 #endif
@@ -513,7 +519,7 @@
     int j;
     for (j = 0; j < dst_len; j++) {
         uint32_t s = *src++;
-        // fetch only R-ch (top half of word) and halving it
+        // fetch only R-ch (top half of word)
         int16_t x = s >> 16;
         // add DC and set zero at quadrature
         x = __SSAT(x + 0x3800, 16);