2019年11月09日

FFTの次の一歩とか・・・・しーーん

今までは教科書通りの話。入力信号としても正弦波とか、矩形波とかも教科書通りの話。そこで違う事をやってみる。
N = 128 で入力信号は

sin(2.0*M_PI*10*n/N)  -----  10Hzである。
image

FFT結果は 10Hzが出ている。sin()なので虚数部で奇関数で、絶対値も表示しているのでこうなる。
image

これに対して10.5Hz を与えてみる。
image

FFTは、あら不思議なデザインが(笑)絶対値は消してみよう
image
 

    なんじゃこりゃーーー!! 

image

FFTは繰り返し波形があるという想定なので繰り返し点で不連続点があると良くない・・・という話があって、窓関数というものが登場するわけだが。

やっとFFTのアルゴリズムの次に進みましたね。次は窓関数についてのお勉強だぉ。
今まではFFTのアルゴリズムの理解が目的だったので与える信号周波数は整数ばかりでしたよってに繰り返しが生ずる場合にも不連続点は生じなかったんだぉ。
いや、これに窓関数をかけるとどうなるってのよーーー・・・・ってあたりからトライだなあ。

拡大してみた 10Hz, 11Hzがピークだが他の成分もある。とっとと学習をすすめたまへ!!
image

  その後、考えて気づいたが窓関数とは関係ない話である。そもそも横軸は整数なのでして。信号と回転子の相関がジャストな値になるのは sin( a)×sin( b)の周期積分平均が値を持つのはね、a = b の時でしたね。ここでは分解能は1Hzなんで、そこに10.5Hzを放り込んで10.5Hz成分が表示されるわけがない。10.5Hzの回転子はないのだし。
で、上のようになったのだが、表示されている値は正しいのだろかね。これはFFTではなくてDFTでゆっくりと計算して確認してみようっと。

posted by toinohni at 10:06| 東京 ☁| Comment(0) | ソフト系雑学 | このブログの読者になる | 更新情報をチェックする

FFTというのが・・・・そればっかーーー

  Cによる科学技術計算 小池・CQ出版 1990年頃 にあったFFTの解説記事とC言語によるプログラムを学習した次第である。
  基数2のFFTのアルゴリズムの理屈に関しても数式で説明していてヨロシイ。∑が連なる例の奴ね。
で、FFTのプログラムは写経して動作確認に加えてグラフ化。gnuplot使った。データはファイル化。それでデータ数65536で実行して時間見たり。まー他の本のと似たような結果であった。うむうむ。
N = 1024で次の入力信号をFFT。

x[n] = sin(2.0*M_PI*10*n/N) + cos(2.0*M_PI*20*n/N) ;

image

FFTの結果 sin()の10Hzは奇関数なので中央での折返しは奇関数の特徴。cos()の20Hzは偶関数なので正に出ている。中央での折返しは負の周波数が出ていると解釈できる。うむうむ。
image

逆FFT   IFFTにして戻す
image

  入力信号に関してはn = 0の時は数式では1になるはずである。グラフは1より大きい感じがする。これは気のせいである(笑) この部分を拡大すると次のようになっているので納得するのである。gnuplotにZoom機能があったのである。
image

C言語のソースを写経し、さらにファイル化し、gnuplotで表示し、というとプログラムを少しは書いた気がするのであるが、実はコピペぱかりである。グラフ化するところは一つのファイルに書いたら他のファイルではコピペである。せいぜいテキストファイル名を変えるぐらいである。
VScode使っているので入力補完機能があり、コードを書くという場合もスペルミスは心配しないである。写経も楽であるぞな。やっぱ、写経だわ。出版社からソースコードをダウンロードできる場合が多々あるが、そういうものはVscodeで開いてクリック、クリックで動作するからアタマに染み込むものがないのである。
自分でキーボード叩くのである。写経こそが初学者の原点である。テキトーである。

  えーと、ちなみに上の本だが誤記がありまして、というか、ふざけてんのかって感じの間違いがあってワロタ。初版ではなく第2版になる。30年ぐらい昔の本である。Lattice Cを使っていたのである。パソコンはPC-98かPC-286であろう。たぶん。その頃のパソコンと今のパソコンは・・・・・・いいや、べつに。

posted by toinohni at 09:07| 東京 ☁| Comment(0) | ソフト系雑学 | このブログの読者になる | 更新情報をチェックする

インテルドライバーサポートってのがおせっかいな

一件の更新が可能です、ってのが出てくるので更新すると途中で、あなたのコンピュータは更新可能ではありません、と出てパソコンメーカーに聞けなんて出てくる。
更新可能ではない・・・という情報がフィードバック不可なんだろけ。月に1,2回出てくるぞ。このバカアシスタント!!  
中古PCであり元はWin 7だったと思う。それをWin 10にしているわけだが。Win 10用のドライバーをメーカーが提供してないってか。
メーカーってインテルではないのか・・・・グラフィクスの話だけど。

まーしかし、インテルってロバート・ノイス創業の半導体メーカーだよね、TIのキルビーとICの発明を争ったんだったな。50年ぐらい昔の話か。
半導体の半世紀・・・なんちったりして。

posted by toinohni at 08:18| 東京 ☁| Comment(0) | ソフト系雑学 | このブログの読者になる | 更新情報をチェックする

素粒子ってものがあるらしい・・・ふーーん

そもそもクォーク仮説が登場したのは加速器・衝突実験装置の性能向上によって新たな粒子が何百と発見されたからである。1940 -60年代で発見された粒子は数百もある。
物理学者はそれらをバリオン、メソンと分類した。レプトンは別枠としておく。
そのバリオン、メソンを眺めて規則性を探して・。。という模索のうちに、一つ階層を下げて考えるとうまくいくのではないか、と感づいた物理学者がいた。ツヴァイクとゲルマンである。クォークは二人の物理学者が独立して同時に提唱した。その後にクォーク理論は発展し1980年頃には素粒子の標準模型が出来たのだった。

だが、言いたいことはそこではない。加速器等で作られる新たな粒子とは何か?  バリオンの数々、メソンの数々。。。。 しかも寿命は極めて短い。直ぐに崩壊して終いには安定な陽子、中性子、電子、光子などに変わる・・・らしい。
で、例えば陽子を加速して高エネルギーにして資料にぶつける。資料が炭素だったとして炭素の原子核にぶつかり壊す。その際にいろいろな粒子が飛び出す・・・・という場合に、それらの粒子は原子核内に潜んでいたのか?   違う。潜んでいたのではなく、生まれたのだ?  いや、そうだとして種はどこにあつたのか?  種がないと生まれない。種がないと芽が出ない。
そこで想像するのが衝突時の高エネルギー状態の一部が物質化したのではないか? という妄想だ。
ここで特殊相対論が出てくるのか?  数々のバリオンやメソンは高エネルギーの一部が物質化したものなのか。エネルギーと質量は等価だ!!  ってか。
そうだとすると高エネルギーになればなるほど新たな粒子が出てくる気がするなあ。そうなのか。
だが、高エネルギーの一部が物質化したとして、どうして安定しないのだ? いや、バリオンである陽子や中性子は安定しているぞ、なんでだ? 
レプトンでも電子は安定しているがミュー、タウは安定してないぞ。すぐに崩壊するぞ。なんでだ?  

さてと、ここらを分かりやすく解説した入門書を探すか。
バリオンの数々、メソンの数々はどこから生まれるんじゃー?  種はどこにあるんじゃー?  生まれたら育てよ、成長しろよ、消えるなよ!! 
「クォーク2」南部、KBB 1998年って本が本棚にある。だが、あれは素粒子の動物園みたいなものの解説であってオレの疑問に対する回答はなかった気がする。
図書館で他のも探すとしようっと。

posted by toinohni at 08:08| 東京 ☁| Comment(0) | 物理科学雑学 | このブログの読者になる | 更新情報をチェックする

FFTというものがありましてん・・・・かーーそればっかーーー

FFTというものはね、DFTを高速化するアルゴリズムの事なんですわ。決して字句通りの高速フーリエ変換ではないのだよ。 なんちて。
というわけで古い教科書・参考書を持ち出し、図書館から借り、Amazonで351円で購入し、精読した結果、分かったことがある。
オレは一度もFFTを理解したことはなかった・・・その前にDFTを理解したこともなかった。。。それどころかフーリエ級数も理解してなかった・・・ようするに、何も分かってなかった (笑) 稲 草 竹
30年ぐらい前にC言語でプログラムを写経して動作させて、なんとか理解した気になったのだが、何も理解してなかったようだ。まー仕事と関係ないからいいけどね。

そして今、オレは理解した・・・気分になっている。以前はシグナルフローをプログラム化したもの、そのプログラムを読んで、ああシグナルフローの通りになっとるわ、このプログラムは、と納得したのだった。ところが、肝心のシグナルフローの導出が出来ない。
ディジタル信号処理の教科書でもくくらを詳しく書く本は少なくて(2,3冊しか読んでないけど)、DFTの数式を行列表現し、その行列を分解していくと最小はバタフライ演算になる。そういう説明はあるのだが、行列の分解に関して根拠は何よ?   そこがわからなかったのだ。だが本に書いてあるように分解した行列を計算すると元のDFTの数式になるのは確認した。
では、行列の分解の根拠はなんぞや。それは基数2のFFTのアルゴリズムをキチンと説明する本を探せ。それだけだった。
それ、∑がたくさん出てくるので数学が得意でないと・・・と言うほどの数学ではないな。
ただ、その場合でもデータ数が8とか16ぐらいだと図もあって分かるのだが、そこから一般化しようとすると数式に慣れてない場合には無理だろ。

まーそのような数式の解説のある本を読んでC言語でFFTのプログラムも書いてあるので読んで、FFTのアルゴリズムは一つではないので数種類を眺めて。
で、おや、と思ったのはC言語の事。
30年ぐらい前の本であり、Lattice C 3を使っているとか書いてあった。それを今のgccでコンパイルする。C++はCもカバーするから属性をcppにしてg++でコンパイルだー・・・。
するとエラーが出る場合と出ない場合がある。エラーが出るのはCとC++との違いだろよさ。

うーむ。しかし、オレとしてはOpenCVが既にCでのインターフェースは提供してないのでCを使う理由はないのだ。C++だ。C++/CLIってのも使うぞ。趣味で。
というわけで、hagahage.c という例題は hagahage.cppとrenameしてg++を使うことにしている。それでエラー出たら修正する。

そして肝心のFFTのアルゴリズムだが、基数2のFFTのアルゴリズムの一般化はやっぱり難しい。回転子の指数 p の値を決めるのが理解困難だ。ただ、列の値によって決まるのは分かっても自分でプログラム書けるほどの理解には至らぬ。なむ。

まーそういうわけで、あと一踏ん張りね。
基数4のFFTもあるぞ。それで爆速になる!!  わけではないらしい。基数8のFFTというのもあるぞ。ただ効果の程はないみたい。
で、データ数が32ぐらいであればFFTとDFTで時間差は大差はない。じゃあ、DFTでいいじゃんってか(笑)

蛇足だがFFTを使うのは・・・趣味の話で。。。LTSpiceという回路シミュレータにFFT機能があるので使う場合がある。タダのソフトである。
PCアプリで音源ボードを入力としてオーディオ帯域でのオシロ機能を実現するソフトがあるが、それにFFT機能も付いている。無償アプリである。
スマホでもそういうアプリがあるなあ。ただのが。
ようするにFFTなんて簡単なプログラムなんだよ。せいぜい20-30行だしよ・・・ってか。

FFTアルゴリズムを開発したクーリー・チューキーの両氏に感謝 しますですね。m(_ _)m

posted by toinohni at 07:55| 東京 ☁| Comment(0) | ソフト系雑学 | このブログの読者になる | 更新情報をチェックする