OSDN Git Service

165c469f1f844b2cc41ba3b7a53f2db6ec551b1e
[trx-305dsp/dsp.git] / hirado / demodulator.h
1 /**
2  * \file demodulator.h
3  * \date 2015/03/10
4  * \brief 復調器関連インクルードファイル
5  */
6
7 #ifndef DEMODULATOR_H_
8 #define DEMODULATOR_H_
9
10
11 #ifndef _MACRO_ONLY
12 /**
13  * \defgroup radioAPI ラジオAPI
14  * \brief 復調器がTRX-305の制御部と情報の授受を行うためのAPI群
15  * \details
16  * このモジュールに含まれるAPIは、復調器の中でユーザー復調アルゴリズムが使うために
17  * 公開されている。制御情報取得用APIはTRX-305からの制御情報を受け取るためのものである。
18  *
19  * 制御情報は周期的に送られてくるため、必ずしも即座に反応する必要はない。具体的には
20  * TRX-305からは16種類の情報が16周期で送られてくる。これらは情報の中身に変更がない場合も
21  * かわらない。
22  */
23 /*@{*/
24
25 /**
26  * \defgroup getInfo 制御情報取得API
27  * \brief 復調器がTRX-305から受け取る制御情報取得用のAPI
28  * \details
29  * ここに列挙されるAPIは、いずれも復調器内のユーザーアルゴリズムから自由に使ってよい。
30  *
31  * TRX-305から送られてくる制御情報は、ほとんどの場合TRX-305A基板にシリアルポートから
32  * 送られてくるコマンドに対応している。コマンドの一覧に関しては、トランジスタ技術誌
33  * 2014年11月号208ページの表を参照。なお、同記事のコマンドはTRX-305AのSHマイコンで
34  * 解釈後にDSPに送られるため、ここで使える命令とは必ずしも一対一対応していない。
35  *
36  * TRX-305Aが受け取るシリアル命令は、SHマイコンにより解釈されたあとにFPGA内部に
37  * 貯めこまれ、繰り返し送り出される。DSPはこの命令を受信し、制御情報として内部に
38  * さらに蓄える。
39  *
40  * なお、これらのAPIが返すのは、あくまで解釈のない「マイコンから送られてきた値」である。
41  * その値の物理的な解釈については、本プロジェクトは最小限に留める。言い換えると、
42  * ここに書いていない解釈は行わない。
43  *
44  * 命令に関してはすべて実際に解析したものであり、参考とした文献は存在しない。
45  * 命令の解析は framework.h の DEBUG_COMMAND のコメントアウトを外すことによって、
46  * DSPからのシリアル出力を監視しながらSHにシリアルコマンドを投入して行う。
47  *
48  *
49  */
50 /*@{*/
51
52     // Following mode macro can be used only the demodulator
53
54     /** \brief 受信機はワイドFMモードである */
55 #define radio_mode_WFM  2
56     /** \brief 受信機はナローFMモードである */
57 #define radio_mode_NFM  4
58     /** \brief 受信機は振幅変調モードである */
59 #define radio_mode_AM   5
60     /** \brief 受信機は振幅変調モードの同期復調モードである */
61 #define radio_mode_SAM  6
62     /** \brief 受信機はLSB復調モードである */
63 #define radio_mode_LSB  7
64     /** \brief 受信機はUSB復調モードである */
65 #define radio_mode_USB  8
66     /** \brief 受信機はCW復調モードである */
67 #define radio_mode_CW   9
68
69     // These APIs are published for the demodulator programmer
70     /**
71      * \brief 受信モードの取得
72      * \details
73      * このAPIは現在の受信モード(復調モード)を返す。シリアルコマンドARMに対応する。
74      * 復調モードは整数である。
75      * ユーザーに公開されているAPIであるが、2つの理由から使用を推奨しない。
76      *
77      * まず、復調器hののモード管理は radio_demodulate_wide_FM() および
78      * radio_demodulate_wide_FM() がフレームワークと強調する管理で行っており、
79      * プログラマは復調器がどのモードにあるかひと目でわかるようになっている。
80      * そのため、モード管理にこの関数を呼ぶ必要はない。
81      *
82      * また、USBとLSBの復調を概ね共用する場合も、radio_api_is_USB() を呼べば
83      * 事が足りる。したがって、この関数を呼ぶ必要はない。
84      *
85      * どうしてもこのAPIを呼び出すときには、 radio_mode_WFM() をはじめとする専用
86      * 定数と比較してモードを調べること。SHマイコンは外部のシリアルから与えられた
87      * パラメータと違う値を送ってくるため、この注意が必要となる。
88      */
89 #define radio_api_getARM_mode() (radio.comdata[1])
90
91     /**
92      * \brief IFシフト量の取得
93      * \details
94      * シリアルコマンドのAIS命令に対応する。
95      * 16bitの符号付き整数でシフト量を返す。
96      */
97 #define radio_api_getAIS_if_shift() (signed short)(radio.comdata[2])
98
99     /**
100      * \brief AGCアタック値の取得
101      * \details
102      * シリアルコマンドのAAT命令に対応する。
103      * 16bitの符号無し整数でアタック値を返す。
104      */
105 #define radio_api_getAAT_attack() (radio.comdata[3])
106
107     /**
108      * \brief AGCフェード値の取得
109      * \details
110      * シリアルコマンドのAAT命令に対応する。
111      * 16bitの符号無し整数でフェード値を返す。
112      */
113 #define radio_api_getAFA_fade() (radio.comdata[4])
114
115     /**
116      * \brief AGCフェード値の取得
117      * \details
118      * シリアルコマンドのAAT命令に対応する。
119      * 16bitの符号無し整数でフェード値を返す。
120      */
121 #define radio_api_getAST_noise_squelch_level() (radio.comdata[5])
122
123     /**
124      * \brief 再生トーンピッチの取得
125      * \details
126      * シリアルコマンドのACP命令に対応する。
127      *
128      * SHマイコンはシリアルコマンド ACP hhhh (hは16進数)に対して、
129      * hhhhを十進数xに変換し x*16916/4096 の値をDSPに送り込む。
130      * このAPIが返すのは送り込まれてきた変換後の値である。
131      *
132      * 16bitの符号付き整数でピッチ値を返す。
133      */
134 #define radio_api_getACP_cw_pitch()  (signed short)(radio.comdata[6])
135
136     /**
137      * \brief デノイザー値の取得
138      * \details
139      * シリアルコマンドADN命令に対応する。
140      * 16bitの符号無し整数でデノイザー値を返す。
141      */
142 #define radio_api_getADN_denoiser() (radio.comdata[7])
143
144 /**
145      * \brief オートノッチ値の取得
146      * \details
147      * シリアルコマンドAAN命令に対応する。
148      * 16bitの符号無し整数でオートノッチ値を返す。
149      */
150 #define radio_api_getAAN_auto_notch() (radio.comdata[8])
151
152 /**
153      * \brief ゲインレベル値の取得
154      * \details
155      * シリアルコマンドAGL命令に対応する。
156      * 16bitの符号無し整数でゲインレベル値を返す。
157      */
158 #define radio_api_getAGL_gain_level() (radio.comdata[11])
159 // Flag 0
160 /**
161      * \brief IFフィルタ値の取得
162      * \details
163      * シリアルコマンドAIF命令に対応する。
164      * 16bitの符号無し整数でフィルタ情報を返す。値の範囲は0から6である。
165      *
166      * (この情報がDSPへの命令なのか通知情報なのかは、現時点では不明である)
167      */
168 #define radio_api_getAIF_filter() ((radio.comdata[0]>>1)&0x7)
169
170 /**
171      * \brief ノイズブランカ制御命令の取得
172      * \details
173      * シリアルコマンドABN命令に対応する。
174      * 16bitの符号無し整数でノイズブランカ制御値値を返す。
175      * 0 : オン
176      *
177      * 1 : オフ
178      */
179 #define radio_api_getABN_noise_blanker_on() ((~radio.comdata[0]>>11)&0x1)
180
181
182 /**
183      * \brief AGC制御情報の取得
184      * \details
185      * シリアルコマンドARG命令に対応する。
186      * 16bitの符号無し整数でAGC制御情報値を返す。
187      *
188      * 0 : オン
189      *
190      * 1 : オフ
191      */
192 #define radio_api_getARG_agc_on() (~(radio.comdata[0]>>13)&0x1)
193
194 /**
195      * \brief 復調モード情報の取得
196      * \details
197      * SSB復調時に必要に応じて参照する。。
198      * 16bitの符号無し整数でSSBのモードを返す。
199      *
200      * 0 : LSB
201      *
202      * 非0 : USB
203      */
204 #define radio_api_is_USB()  ((radio.comdata[0]>>6)&0x1)     // 1 if USB
205
206 // Flag10
207 /**
208      * \brief ノイズスケルチ制御情報の取得
209      * \details
210      * シリアルコマンドNE命令に対応する。
211      * 16bitの符号無し整数でスケルチ制御情報値を返す。
212      *
213      * 1 : オン
214      *
215      * 0 : オフ
216      *
217      * なお、以上の設定はトランジスタ技術誌の2014年11月号の表に基づくが、
218      * この表には混乱があり、反転している可能性もある。
219      */
220 #define radio_api_getANE_noise_squelch_on() ((radio.comdata[10]>>1)&0x1)
221
222
223 /**
224      * \brief オーディオHPF情報の取得
225      * \details
226      * シリアルコマンドAAF nm命令のnに対応する。
227      * 16bitの符号無し整数でオーディオHPF制御情報値を返す。
228      *
229      * 値の範囲は0-2
230      */
231 #define radio_api_getAAF_hpf() ((radio.comdata[10]>>4)&0x3)
232
233 /**
234      * \brief オーディオLPF情報の取得
235      * \details
236      * シリアルコマンドAAF nm命令のmに対応する。
237      * 16bitの符号無し整数でオーディオLPF制御情報値を返す。
238      *
239      * 値の範囲は0-2
240      */
241 #define radio_api_getAAF_lpf() ((radio.comdata[10]>>2)&0x3)
242
243 // Flag 12
244 /**
245      * \brief ボイススケルチ値の取得
246      * \details
247      * シリアルコマンドAVP命令に対応する。
248      * 16bitの符号無し整数でボイススケルチ値を返す。
249      * 値の範囲は0-127
250      *
251      * シリアルコマンドAVPの引数は0000-FFFF (65556)までの値をとるが、
252      * DSPに渡される値はbit7がAVSによって破壊される。したがって、
253      * AVPコマンドに渡す値は 0000から 007Fに制限すべきである。
254      */
255 #define radio_api_getAVP_voice_squelch_level() ((radio.comdata[12])&0x3F)
256
257 /**
258      * \brief ボイススケルチ情報の取得
259      * \details
260      * シリアルコマンドAVS命令に対応する。
261      * 16bitの符号無し整数でボイススケルチ制御情報値を返す。
262      *
263      * 0 : オン
264      *
265      * 1 : オフ
266      */
267
268 #define radio_api_getAVS_voice_squelch_on() ((~radio.comdata[12]>>7)&0x1)
269 /*@}*/
270 /*  end of defgroup getInfo */
271
272 /**
273  * \defgroup setStat 状態報告API
274  */
275 /*@{*/
276
277 // Set S meter
278 #define radio_api_set_S_meter(s) radio.smeter = s
279
280 /*@}*/
281 /*  end of defgroup setStat */
282
283 /*@}*/
284 /*  end of defgroup radioAPI */
285
286
287 /**
288  * \brief 復調アルゴリズム初期化関数
289  *
290  */
291 void init_demodulator(void);
292 void radio_demodulate_wide_FM( short idata[], short qdata[], short* left, short* right );
293 void radio_demodulate_non_wide_FM( int idata, int qdata, short* left, short* right );
294
295 #endif /* _MACRO_ONLY */
296
297 #endif /* DEMODULATOR_H_ */