OSDN Git Service

Merge branch 'suikan_experimental2' into develop
[trx-305dsp/dsp.git] / hirado / demodulator.c
1 /*
2  * demodulator.c
3  *
4  *  Created on: 2015/03/10
5  *      Author: takemasa
6  */
7
8 #ifndef _DEMODULATOR_H_
9 #define _DEMODULATOR_H_
10
11 #include "framework.h"
12 #include <math.h>
13
14 void init_demodulator(void)
15 {
16     /*
17      * 復調アルゴリズムの初期化はここで行う。
18      */
19
20 }
21
22 void radio_demodulate_wide_FM( short idata[], short qdata[], short* left, short* right )
23 {
24     /*
25      * ワイドFMの復調アルゴリズムを実行する。
26      *
27      * 受信IFデータは複素情報となっており、それぞれidata[], qdata[]引数として渡される。
28      * いずれの引数も[-1..1) の閾値を取る。なお、それぞれの配列要素数は WIDE_FM_OVERSAMPE 個である。
29      *
30      * 復調オーディオデータはステレオであり、左右データをそれぞれ*left, *right引数に返す。
31      * いずれの引数も[-1..1) の閾値を取る。
32      *
33      * IFはオーバーサンプルされているがオーディオはされていないので、1/WIDE_FM_OVERSAMPEの
34      * デシメーション処理をしなければならない。
35      *
36      */
37
38     *left = *right = 0;
39
40 }
41
42 void radio_demodulate_non_wide_FM( int idata, int qdata, short* left, short* right )
43 {
44
45     *left = *right = 0;
46         /*
47          * 現在の復調モードを取得し、そのモードに応じて適切なアルゴリズムを実行する。
48          * 以下のコードはスケルトンなので、適切なアルゴリズムを実装すること。
49          *
50          * 受信IFデータは複素情報となっており、それぞれidata, qdata引数として渡される。
51          * いずれの引数も[-1..1) の閾値を取る。
52          *
53          * 復調オーディオデータはステレオであり、左右データをそれぞれ*left, *right引数に返す。
54          * いずれの引数も[-1..1) の閾値を取る。
55          *
56          */
57     switch (radio_api_getARM_mode()){
58     case radio_mode_NFM :   // ナローFM復調
59         break;
60
61     case radio_mode_AM :    // AM復調
62         {
63                 // テスト用の複素包絡線検波
64             float i, q;
65
66             q = qdata;
67             i = idata;
68
69             *left = *right = sqrtf( q*q + i*i )/65536;
70
71         }
72         break;
73     case radio_mode_SAM :   // 同期AM復調
74            // 動作テスト用880Hz生成プログラム。
75            // 実アルゴリズムで置き換えること
76         {
77             float f;
78             static short phase = 0;
79
80             f = sinf( 2 * 3.14 * phase / 32768 ) * 32767 * 0.999;
81             phase += 880 ;
82
83             * right = *left = f;
84         }
85         break;
86
87     case radio_mode_USB :   // USB復調
88         break;
89
90     case radio_mode_LSB :   // LSB復調
91         break;
92
93     case radio_mode_CW :    // CW復調
94         break;
95     }
96
97
98
99
100 }
101
102
103 #endif /* _DEMODULATOR_H_ */