前節で、ヒルベルト変換を調べました。
その前は、漸化式による正弦波の発生も、できました。
そこで、今回は、このふたつを組み合わせて
信号の複素化による、周波数変換に、トライしてみましたが
思ったほど、簡単では、ありませんでした....
まだ、完成してないんです...(T_T)
これは、以下の式で、実現できます。
ですので、
この積の、実部を計算すれば、一発で、周波数変換ができます。
逆サイドバンドも発生しません...従って、逆サイドバンド除去の為の、firフィルタも不要です。
すんばらしい!
ヒルベルト変換器の設計は
// 次数=40 タップ数=41 Q15
// サンプリング= 32KHz
// 帯域端周波数 = 0.5 KHz
で、行いました。
次数を40と、下げたのは、入力信号と、漸化式によるsinのふたつを
ヒルベルト変換器に、通さねばならないからです。
この設計で作ったプログラムの、サンプリング周波数は、約25KHzになりました。
(まだ、CPUのクロックを半分にしています。 )
実は、CPUを、SH7047Fに換えてから、ずっと、そうなんです。
92.実際にやってみましょう、ヒルベルト変換 その2(改その2)
91.実際にやってみましょう、ヒルベルト変換
90.ヒルベルト変換は、どんなん?
89.「信号の複素化」の門を叩く
88.SH7047Fでfirフィルタを作成する(最終訂正版)
87.SH7047Fで DSB
86.SH7047Fで、 AD_DAスループログラム等(改)
以上のプログラムを、参照下さい。
全て、メイン関数の所で、記述しています。
AD_DAスループログラムですと
void main(void)
{
InitSH();
while(1)
{
PE.DRL.BIT.B12=1;
if(AD0.ADCSR.BIT.ADF)
{
AD0.ADCR.BIT.ADST=0;
data=AD0.ADDR0.WORD;
data=data>>6; //1024の範囲に入るように調節する
data +=0x8300; //AD無入力時の値を足す
PE.DRL.WORD =data;
AD0.ADCSR.BIT.ADF=0;
AD0.ADCR.BIT.ADST=1;
}
PE.DRL.BIT.B12=0;
}
}
そうなんです...AD_DAスルーがメインなので、メイン関数の所に、書いています。
勿論
InitSH()の中で
MST.CR2.BIT._AD0=0;//これがないと、AD変換器は動かない
と、宣言して、AD変換器を動作させています。
この 方法ですと、割り込みのプライオリティを設定する必要が、ありません。
割り込むための、メインプログラムは、ないのですから...
実は、最初は、無意識で、やっていました。
うまく、動作するもので、違和感も覚えずに...hi (^_^;
今回のプログラムは、ここ です。
(製作途中なので、汚いです、ごめんなさい。)
漸化式によるsin波の発生は、今の実験段階で、約1.2KHzです。(サンプリング周波数から、正確に計算して、決定 すべき)
振幅を合わせる為には、やはり、htermが必要なので、再び、HEW3を使っています。(もうすぐ、試用の命が尽きる...)
(リードアウトは、10倍する事が必要)
漸化式によるsin波の実部と虚部
入力信号の実部と虚部
漸化式によるsin波と、入力信号は、振幅のレベルが、ちょっと、違ってますが
そんなことは、実際に、マイクで音声を入力すれば、当然なので、このままにしました。
漸化式によるsin波の周波数と、入力周波数が同じであれば
正しく周波数変換されます。
しかし、周波数が異なれば、メタメタです。
入力信号は、2KHzで、漸化式によるsin波は、1.2KHzなので、
3.2KHzの周波数成分が見えるのですが
漸化式によるsin波、1.2KHzのキャリアが、大きな値(変調信号と、ほとんど変わらない)なのです...
入力信号と、漸化式によるsin波も、同じ振幅レベルでないと、あかんのでしょうか? そんなアホな...
今、考えている所です。
原因が少し、解りました。
GCC developer Liteでは、正常に働いていたHilbert変換器が
殆ど同じプログラムであるにも拘らず、
HEW3を使うと、hilbert変換器として、正常に動作しないんです、ムムムのム...
そう言えば、HEW3付属のSH7047のヘッダーファイルは、少し変なので
ルネサス社から、7047S.Hを引っ張って来たんでした...
H.16.2.6
This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.