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