R8C/15でフィルタータイプSSBのまとめ、完結編

[追加記事] 

0.これで、設計は、御仕舞い

10bits 80taps 通過帯域 300Hz-2800HzのSSB発生器

2KHz入力

もう、これ以上、PWMの、サンプリング周波数は、下げれません。(Fs/4 = 3870Hz

サンプリング周波数が、下がってきたので、4次のバターワースでは、取れ切れませんで

最大値になって、しもうた...

手動で、sweep して、Peak値を、赤線で追いました。

黒線は、300Hz出力です。

設計値と、大体、合っています。

 

sweepすると、peekだけが描かれるので、

Fs/4以上の周波数で、ノイズフロアが上がっているように、見えます。

そんで、実際は、緑色で書きましたような、特性であると思います。

辛めに見て

    キャリアサプレッション、不要側波帯サプレッション共に、50dB 

と、します。

最終プログラムは、これです。

例によって、6.5MHzに変換したDSBの音を、トランシーバーで録音しました、これです。

 

こうも、サンプリング周波数が下がってくると、ローパスフィルタも、チェビシェフに、したくなってきますね。

トラ技オリジナル、no.9「実験研究 アナログフィルタ回路の誕生 CQ出版 1992」に

計算のしかた、書いてあったけんど、便利なソフト、あります。

マイクロチップ社の、フリーの、Filter.labです。

マイクロチップ社に、御礼申し上げます。

追加記事は、ここまで。

--------------------------------------------------------------------------------------------------------------

1.最終の形は。

入力は、2KHz サイン波。

AD変換は、10ビット。

キャリアサプレッションは -60dB

不要側波帯サプレッション は -45dB 位

---------------------------------------------------------------------------------------------

前節では、これは、PWMの限界か....と、あきらめ掛けていたのですが....

何とか、満足すべき結果が出ました、ありがとー。

 

2.きっかけは?

 PWMによるSSBを、あきらめて、デシメーションって何だ?、と、調べ始めた時です。

タイマーCでは、tm0と、tm1が、大きな意味を持ちますが

このtm1が、サンプリング周期を決定する事に、気づきました。( 当たり前なんですがね...(^_^;;  )

スループログラムの、割り込みの所

#pragma interrupt comp1_int (vect=16)


void comp1_int(void)
{
while(adst==1);

tm0 =ad; //タイマC TM1カウンタの値をセット
adst=1;

}

ここで、AD変換した値を、1つ間引くには

#pragma interrupt comp1_int (vect=16)


void comp1_int(void)
{
while(adst==1);
if( ++i%2 )
tm0 =ad; //タイマC TM1カウンタの値をセット
adst=1;

}

と、します。

結果は、

                                       上: 1つ間引いた     下:スルー

ですので、1つ間引くと、

丁度、サンプリング周波数が、半分になったのと、同じ結果に、なります。

更に、3つ間引くと

void comp1_int(void)
{
while(adst==1);
if( ++i%4 )
tm0 =ad; //タイマC TM1カウンタの値をセット
adst=1;

}

                                       上: 3つ間引いた     下:スルー

サンプリング周波数が、丁度、1/4になったのと、同じです。

これが、そうなるのは、スルーのプログラムで、

割り込みを使って、元のサンプリング周期を、一定にしているからです。

割り込みの中に、記述した部分

while(adst==1);
if( ++i%4 )
tm0 =ad; //タイマC TM1カウンタの値をセット
adst=1;

が、割り込み周期より、短い時間で済む処理だからです。

 

SSBの生成の時に、おかしな周波数成分が、出てくるのは

積和に要する時間が、割り込みの周期より、長くて、割り込み周期の間に、収まらないから

ややこしい周波数成分が、出てくるのです。

割り込み処理をしている間に、新たな、同じ割り込みが入ってきたら、どうなるか?

調べてみましたら

割り込み処理の最中に、新たな、同じ割り込みが入ってきても

割り込み要求は、発生しません。

しかも、TCC0(タイマーCカウント開始ビット)は、1に設定されているのですから

タイマーCは、動き続けているのです。

Iフラグが、ゼロで、

割り込み中は、同じ割り込みの要求は、発生しない。

そこで、

tm1が、タイマーCのサンプリング周期を、決めているのですから

これを触って、周波数成分が、綺麗になれば、ハッピーです。

 

3.実際には、どうしたのか?

無入力の時、10ビットでのAD変換値は、0x202でした。

それで、サンプリング周期を決める、tm1の値を

tm1=0x404;(=1028d)

に、採りました。

結果 (2KHz入力)

さっぱりですわ....

色々な値を、入れて見ましたら

tm1=0x442;(=1090d)   (厳密に、この値で、なくてもよい、この近辺。)

の時、きれいになりました....超ハッピー!

結果(同、2KHz入力)

------------------------------------------------------------------------------------------------

その後、tm1が、この値より、大きければ、大体、いい結果が出る事が、解りました。

例 tm1=1180 の時の、ツートーン入力結果

多分、サンプリング周期が、積和にかかる時間を、上回ったせいだと、思います。

最適値は、まだ、解っていません。

--------------------------------------−----------------------------------------------------------

最終の,10ビットADCを使ったプログラムは、ここです。

このプログラムを使って、SSB化した音を、6.5MHzに変換して、トランシーバーで、聞いてみました、これです。

雑音が多くて、恐縮です。

firの帯域を調べてみると、狭すぎたようですが...

心なしか、音が澄んだ気がします...

 

H17.8.17