只、単に信号を複素化して、掛け合わせるだけでは、上図のように
適切な信号が生成されないことがわかりました。
理論的には、一転の曇りもありません、明白です。
及び、これより導かれる計算式も、正当です。
入力信号と、漸化式によるsin波の、振幅の割合を工夫するしかありません。
これは、残念ながら、
今の所、実験で試行錯誤的に求めるしか、思いつきません...
これが、疲れるのですわ...
比較的よい結果が出たのに、データー消失したりして... (T_T)
プログラムは、ここです。
振幅の大きさを変えれる所は、4箇所ありますが、
漸化式によるsin波の大きさは、定義の部分の所(120が振幅の大きさを決める所)
だけ、触ります。
//************************************************************
const int sinw=9069/120 ;//Q15 a1=sinw 1KHz sampling 22.405Hz
const int const1_cosd=5120; //Q17 b0=1-cosd
//************************************************************
入力信号の大きさは、以下で決めます。
//AD変換の結果をhilbert変換器に通す---------------------------------------------------------------------
//*****************************************************************
kakunou(i,data,N);
data_chukan=macw( (data_up+N-1-i),fir);
//data=data_chukan>>15;
data=data_chukan>>14;
moto_data=data_up[N-1-i+(N-1)/2];//N-1-iから40ポイント前の点=中点
moto_data = moto_data*66/50; //振幅のスケーリング。 * 0.65と小数点にすると、極端に遅くなるので注意!
//*****************************************************************
理由は、よくわかりませんが、
和と差の周波数の振幅の比は
この部分で、かなり改善されます。
(moto_data*real_y*3の部分です。3を掛ける事で、随分変わる。)
//実部、虚部同士の積を計算する
//****************************************
output=moto_data*real_y*3 - data*imag_y;
output +=200000;
output =output>>9;
//****************************************
この数字の「3」ですが、偶然見つけました。
「2.8」でも、「3.2」でも、結果は、「3」より悪いです。
この、「偶然」言うのが、疲れるのですわ...
「1234」やったら、よう見つけんわ...
今の所、これが、最高のパフォーマンスです。
内部の漸化式によるsin波、元信号の1.5KHzは、
発生した高調波を採用すれば、関係なくなりますから、
これで、一気に、高い周波数まで、持っていけます。
その代り、サンプリング周波数の倍の高調波のサイドに、エリアスが出現するのですが...
製作した hilbert変換器は、10.9KHzまで、平坦なのですから
漸化式によるsin波そのものを、もっと、高い周波数に持っていく事を試しているのですが
どうも、桁あふれが出て、NGです...
H.16.3.9
This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.