« PICOのPIOを使った指定周期DMAによるシリアラル信号出力プログラムについて | トップページ | APRSでのNRZIについて備忘録 »

2022年12月31日 (土)

pico_tnc 2200Hz(Space)でPhaseをずらす件の備忘録

GitHubからダウンロードしたpico_tncのsend.cのsend_byte()についての考察記録

なぜ、mark_tabのサイズは121なのか,、そしてspace_tabのサイズは96なのか。

wave_table.h
#define PHASE_CYCLE 6
#define MARK_TAB_LEN 121 // 66 * 5/6 + 66
#define SPACE_TAB_LEN 96 // 36 * 5/6 + 66
mark_tab[MARK_TAB_LEN]={.....  1200Hz正弦波
space_tab[SPACE_TAB_LEN]={....     2200Hz正弦波
phase_tabは、spaceは6サンプリング周期ごと、markは11サンプリングごとに区切られ、6区画で1波形となる。
つまり、1波形を6等分したもの=60度分。
1200baudでは66サンプリングで1サイクル=360度となる。
static const uint32_t *phase_tab[2][PHASE_CYCLE] = {
{ &space_tab[0], &space_tab[6], &space_tab[12], &space_tab[18], &space_tab[24], &space_tab[30], },
{ &mark_tab[0], &mark_tab[11], &mark_tab[22], &mark_tab[33], &mark_tab[44], &mark_tab[55], },
};
phase_tabには1波形分のサンプリングを6等分(60度分)した数の波形データが入れられており、最終エントリーの先頭から66サンプリング分(360度=1DMA分)が設定されている。つまり、どのエントリーからDMAを始めても1DMA分のデータは揃っていることになる。
send.c
dma_handler()
....
データの1bit単位で波形を1サイクル分設定する
phase_tabから取り出すポインターから66サンプリング分(360度分)がdma_blockに格納される。
   tp->dma_blocks[next][idx++] = phase_tab[level][phase]; // 0: space, 1:mark
仮にlevel=1, phase=5の場合、phase_tab[1][5], つまり mark_tab[55](300度)から66サンプリング(6phase分=360度分)が取り出されることになる。
したがってサンプリングテーブル(mark_tab)はその長さ分(66x5/6=300度)が1波形分(66=360度)よりも余分に必要となる(合計 66x5/6 + 66=121)。
level=0, つまりspaceだったら次回の生成波形は60度(6サンプリング分)波形を前にずらす。
   if (!level) { // need adjust phase if space (2200Hz)
      if (--phase < 0) phase = PHASE_CYCLE - 1;
   }
減算する前のphaseが0、つまり先頭だったら最後尾にする。
なぜspace (2200Hz)だと1波形ごとに6サンプリング分前にずらすのか。
1200Hzで1サイクルが完結する時間スロットでは2200Hzでは2200/1200=11/6サイクル発生することになる。
つまり、サイクル完結に1/6(60度)足りない。仮にこの時間スロットの開始点で2200Nz波形を連続して生成する場合、その波形は前回の開始点波形にたいして1/6サイクル分(60度)後戻りした時点の波形から始まらないと連続性が保てない。
1200Hz波形は2200Hz波形を11/6倍だけ時間方向に引き伸ばしたものと考えることができる。よって2200Hzの後に1200Hz波形を同じタイムスロットで連続性を保って生成するには11サンプル分(60度)後戻りした時点の波形から始めると波形の連続性が保てることになる。
この様子を図示すると以下となる。Markが1サイクルする時間間隔ではSpaceは出力ゼロになるまで60度足りない。次の波形を連続させるには次の波形を―60度ポイントから波形生成を始める必要があるわけだ。
Photo_20221231131001
そもそも、1200Hzと2200Hzでのビット表現となるとどうしても波形は不連続になるが、その事は問題なのだろうか。
この波形不連続は、1200Hzと2200Hz以外の非常に多くの周波数成分を発生してしまうようだ。このノイズ成分により、信号復調率が落ちるのだろう(多分)。

« PICOのPIOを使った指定周期DMAによるシリアラル信号出力プログラムについて | トップページ | APRSでのNRZIについて備忘録 »

ラズパイ日記」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« PICOのPIOを使った指定周期DMAによるシリアラル信号出力プログラムについて | トップページ | APRSでのNRZIについて備忘録 »

フォト
無料ブログはココログ
2024年5月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31