Hirado
0.9.1
|
フレームワークが復調ように呼び出すコールバック関数群 More...
Functions | |
void | init_demodulator (void) |
復調器の初期化 More... | |
void | radio_demodulate_wide_FM (short idata[], short qdata[], short *left, short *right) |
ワイドFMの復調コールバック関数 More... | |
void | radio_demodulate_non_wide_FM (int idata, int qdata, short *left, short *right) |
ワイドFM以外の復調コールバック関数 More... | |
フレームワークが復調ように呼び出すコールバック関数群
復調器のためにフレームワークから呼び出すコールバック関数。復調アルゴリズムは全てこの中に記述する。
関数は大きく分けて2種類に分けられる。ひとつは初期化関数で init_demodulator() がこれである。 その他の関数は実際の復調を行う関数である。
void init_demodulator | ( | void | ) |
復調器の初期化
復調アルゴリズムの初期化を行う。アルゴリズムが変数を初期化しなければならないようなときには、 この関数の中に初期化プログラムを書く。
この関数は、radio_demodulate_wide_FM() や radio_demodulate_non_wide_FM() が 呼ばれる前に一度だけ呼ばれる。
void radio_demodulate_non_wide_FM | ( | int | idata, |
int | qdata, | ||
short * | left, | ||
short * | right | ||
) |
ワイドFM以外の復調コールバック関数
idata | 受信IFのI(in phase)データ。32bit符号付き固定小数点数。フォーマットはQ1.31 |
qdata | 受信IFのQ(Quadratural phase)データ。32bit符号付き固定小数点数。フォーマットはQ1.31 |
left | 復調オーディオ信号の左チャンネルデータ。16bit符号付き固定小数点数。フォーマットはQ1.15 |
right | 復調オーディオ信号の右チャンネルデータ。16bit符号付き固定小数点数。フォーマットはQ1.15 |
ワイドFM以外の信号を復調するために呼ばれるコールバック関数。この関数と radio_demodulate_wide_FM() の 切り替えはフレームワークが自動的に行うため、ユーザー側は気にしなくていい。
非ワイドFM以外のモードにはAM, SAM, LSB, USB, Narrow FM, CW の受信モードがある。これらの受信モードの 検出は、コールバック関数内部のスケルトンが自動的に切り分けているので、それぞれの場合ごとに復調アルゴリズムを 書けばよい。
LSBとUSBの復調コードの大半を共有したい場合には、一部でLSB/USBの判断を行われなければならない。この場合は radio_api_is_USB() APIを使うことで判別を行う。
なお、ワイドFMモードから非ワイドFMモードへの切り替えがSHマイコンから出された場合、実際のFMモードからの 復調器の切り替えは二段階になりうる。最初の段階では radio_demodulate_wide_FM() の呼び出しが終了し、 radio_demodulate_non_wide_FM() の呼び出しへと切り替わる。次の段階では、radio_demodulate_non_wide_FM() の中で正しい復調モードが検出され、スケルトンの動作が切り替わる。
この二段階切り替えは必ず起こるというわけではなく、FPGAの実装形態に依存する。単にフレームワークは二段階切り替えにも 対応できるということである。
IF入力(idata, qdata)、AF出力(*left, *right)ともFsは31.7kHzである(トランジスタ技術誌2015年5月号pp183)。 1サンプル毎に呼び出されるので、このコールバックは1秒間に31,700回呼び出される。
IF入力データとAF出力データの語長が違うことに注意。データのパック形式は固定小数点型であるため、いずれも データの値の範囲は[-1,1)となる。しかし、C言語としての取り扱いは整数なので、それぞれの最大値は異なる(IFデータの 最大値はAFデータの65536倍)。
void radio_demodulate_wide_FM | ( | short | idata[], |
short | qdata[], | ||
short * | left, | ||
short * | right | ||
) |
ワイドFMの復調コールバック関数
idata | 受信IFのI(in phase)データ配列。32bit符号付き固定小数点数。フォーマットはQ1.31 |
qdata | 受信IFのQ(Quadratural phase)データ配列。32bit符号付き固定小数点数。フォーマットはQ1.31 |
left | 復調オーディオ信号の左チャンネルデータ。16bit符号付き固定小数点数。フォーマットはQ1.15 |
right | 復調オーディオ信号の右チャンネルデータ。16bit符号付き固定小数点数。フォーマットはQ1.15 |
ワイドFM以外の信号を復調するために呼ばれるコールバック関数。この関数と radio_demodulate_non_wide_FM() の 切り替えはフレームワークが自動的に行うため、ユーザー側は気にしなくていい。
IF入力(idata[], qdata[])、AF出力(*left, *right)ともFsは31.7kHzである(トランジスタ技術誌2015年5月号pp183)。 1サンプル毎に呼び出されるので、このコールバックは1秒間に31,700回呼び出される。
IF入力はワイドFMではオーバーサンプルされた値が入力する。そのため、1サンプルあたりのデータ数は1ではない。 具体的なオーバーサンプル値は、マクロ WIDE_FM_OVERSAMPE で知ることができる。まとめると、この関数の中では idata/qdataそれぞれ WIDE_FM_OVERSAMPE 個のデータを復調処理して、1個のleft/right データを生成する。
IF入力データとAF出力データの語長が違うことに注意。データのパック形式は固定小数点型であるため、いずれも データの値の範囲は[-1,1)となる。しかし、C言語としての取り扱いは整数なので、それぞれの最大値は異なる(IFデータの 最大値はAFデータの65536倍)。