OSDN Git Service

テストプログラムの問題を修正することで、amの包絡線検波ができるようになった。
[trx-305dsp/dsp.git] / trx305 / framework.c
index 6e5a840..3a244d4 100644 (file)
@@ -343,7 +343,7 @@ static void pack_af_sample( short left, short right, unsigned int * pri_ch, unsi
     }
 
         // プライマリ・チャンネルの組み立て
-    *pri_ch = (right << 16) | left;
+    *pri_ch = ((unsigned int)right << 16) | (unsigned short)left;
 
 
     framework.index = ! framework.index;  // indexの論理反転
@@ -359,13 +359,28 @@ static void pack_af_sample( short left, short right, unsigned int * pri_ch, unsi
  */
 static void unpack_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata )
 {
-    int command, data;
+    int command, data, exp, i, q;
 
 
         // iデータとqデータを抽出する。両者とも16bitで、bit14からbit29に格納されている
-    *idata = ( pri_ch << 2 ) & 0xFFFF0000;
-    *qdata = ( sec_ch << 2 ) & 0xFFFF0000;
+    i = ( pri_ch << 2 ) & 0xFFFF0000;
+    q = ( sec_ch << 2 ) & 0xFFFF0000;
 
+        // ブロック浮動小数点処理。expでスケーリングする。
+    exp = ( pri_ch >> 10 ) & 0x0F;
+    *idata = i >> exp;
+    *qdata = q >> exp;
+
+#ifdef DEBUG_BLOCK_FLOAT
+    {
+        static int tested = 0;
+        if ( (i & 0x80000000) && ! tested )
+        {
+            tested = 1;
+            syslog( LOG_NOTICE, "i: %8x, exp: %d, idata:%8x", i, exp, *idata);
+        }
+    }
+#endif
         // パラメータ・データを配列に格納する。
         // 配列インデックスは comaddr、データはcomdataから。
         // comdataはpri/secに分散している。
@@ -388,7 +403,7 @@ static void unpack_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idat
  * \param sec_ch セカンダリ・チャンネルからのデータ
  * \param idata 抽出したIデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
  * \param qdata 抽出したQデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
- * \param valid_iq IQデータが有効の時真、向こうの時は偽
+ * \param valid_iq IQデータが有効の時真、無効の時は偽
  * \detail
  */
 
@@ -398,7 +413,7 @@ static void unpack_non_wide_fm(  unsigned int pri_ch, unsigned int sec_ch, int*
     if ( sec_ch & 0x02 )    // bit1が1ならindex = 1
     {
             // IQデータはbit[29:2]に格納されている
-        *idata = (pri_ch << 2);                 // プライマリ・チャンネルの場合はマスク不要
+        *idata = (pri_ch << 2) & 0xFFFFFFF0;
         *qdata = (sec_ch << 2) & 0xFFFFFFF0;
             // IQデータが有効であると通知する
         *valid_iq = TRUE;
@@ -422,11 +437,10 @@ static void unpack_non_wide_fm(  unsigned int pri_ch, unsigned int sec_ch, int*
 
 /**
  * \brief SHからのコマンドとパラメタを保存する
- * \param command
- * \param data
- * \details このルーチンはcfgファイルで宣言され、SPORT0 RX 割り込みハンドラとして登録される。
- * SPORT0 RX DMAがバッファの受信を終えるたびに呼び出される。
- * 割り込み専有時間を小さくするため、実際には、割り込みのクリアと受信タスクへの通知しかしていない。
+ * \param command コマンド種別
+ * \param data コマンドパラメータ
+ * \details このルーチンはSHからFPGA経由で受け取ったコマンドとそのデータを内部変数に格納する。
+ * 格納されたデータはユーザーが実装した復調アルゴリズムから、API経由で利用される。
  */
 static void set_command_data( unsigned int command, unsigned int data )
 {