複素数による周波数変換後の出力波形。Tektronix2432A
ディジタルオシロ使用
[Tektronix2432A、例によって、ヤフーオークションで購入。保証はなかったが、完動(感動)品です。
波形が止まってみえるのは、初めてですねん、便利。66,000円也。
10年来使っているTektronix TAS465も愛用してます。]
74HC04 x2と、抵抗によるラダー回路です。(H8の時、使ったものを10ビットに拡張した。)
これだと、クロックが不要です、これがいいわ。
シンプルで、壊れても、すぐ作り直せるし、
出力電圧も、電源電圧5V、目一杯に、スイングできるし
入力電圧と、同じ大きさなんですから、わかりやすい。
(その昔、ある車に乗ってた時、エンジンルームが、すかすかで、地面が見えた!...
それ位、シンプルが、丁度ええですねん。)
今回は、重要な部分をクローズアップするために、
プログラムで、ごちゃごちゃした所を、すっきりさせました。
start.hなるヘッダーファイル(実は、start.cと書いたほうが正しい)を、インクルードするようにしました。
これを使うと、こんな感じです。
int main(void)
{
InitSH();
unsigned int i=0;
while(1)
{
if (AD0_READY) //#define AD0_READY AD0.ADCSR.BIT.ADFで置き換えただけ。
{
data=getAD();
data -=512; //10ビットの中点は、理論上511、又は513に採るべきなので。(実際は、517,520位になったのですが)
kakunou(i,data,N);
data_chukan=macw( (data_up+N-1-i),fir);
data=data_chukan>>15; //理論上、Q15だから。
moto_data=data_up[N-1-i+(N-1)/2];
data=(i%2) ? moto_data : data;
data +=512; //出力も理論上、中点に採るべきだから。
putDA(data);
i++;
if( i==N) i=0;
}
}
return 1;
}
putDAも、単なる置き換えです。
inline void putDA(short data)
{
PE.DRL.WORD =~data;
AD0.ADCSR.BIT.ADF=0;
AD0.ADCR.BIT.ADST=1;
}
同、
inline short getAD(void)
{
AD0.ADCR.BIT.ADST=0;
unsigned short moto_data;
moto_data=AD0.ADDR0.WORD;
return (moto_data>>6);
}
ただ、見やすくしただけ、なんですわ。
漸化式によるsin波形の発生と、ヒルベルト変換して、虚部を作ったものを下図に載せます。
これは、例によって、実部と虚部を交互に出力したものです。
ディジタルオシロだと、信号を交互に出力してるのが、はっきり出すぎますが...
今回、実部と虚部の振幅も、同じくらいに、なってくれました、有り難や、有り難や。
90度の位相差も、これで、確認しただけなのですが...
アルゴリズムは、以前と全く同じなのですが...
何で前回は、アカンかったのか、いっこうに解りません...はて?
プログラムは、ここです。
start.hをインクルードしています。
それでも、やっぱり、ゴチャゴチャしてしまった...
漸化式による局発のsinの発生なのですが、
実験によると、サンプリング周波数の1/10の周波数位までが、正常に発振する限度のようです。
ここを上げれば、高調波を取り出す時、楽だと思うのですが。
ヒルベルト変換フィルタは、応援団長様ご指摘のように、14に採りました。
充分だと思います。もっと、下げれます。
そうやっ!。
SH7047FのADコンバータは、ぎょうさん余ってるんやから、
外部で発振させて、AD変換してhilbertフィルタ通す手も、ありますね。
それと、特性を、もっとリファインする事も、必要ですね。
何とか、又、ハッピーになれました。
IIRのオールパスも興味あるし、解析信号を使った復調、FFTも興味あり。
やることが多くて、長いこと、楽しめそうな気がします、hi。
応援団長様、皆様、ご支援、御礼申し上げます。 m(_ _)m
H.16.3.25
This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.