上記のFFTが使用できるように信号長を2のべき乗とします。len(y))となるような最小の2のべき乗Nを求めます。文字列を信号列に変換します。yのdigitsをLSBから詰めていきます。...,2*N-1には0を入れます。x_t[]、y_t[]を長さ2*Nの信号としてフーリエ変換します。z_t[]を逆フーリエ変換します。z_t[]はx*yと一致しています。繰り上がりの処理を忘れずに。Multiplicationを解きました。アルゴリズム2011年8月9日火曜日サルでも分かるFFT(3)ようやくFFTが分かった。普通のO(n^2)のDFTを行列表現で書いてみます。このとき、eのべき乗のところを式で書くとイメージが大変なので、極座標系の矢印で書いてあげると分かりやすいです。この式をじっくり見ると、「サルでも分かるFFT(2)」で紹介したk成分と(N-k)成分の対称性が見えます。visualizerがはき出した極座標系の周波数スペクトラムとの対比がよく分かると思います。FFTですが、まず偶数番と奇数番の周波数成分に分けます。数番成分に注目すると、と書けますが、矢印の部分の4*8の行列は真ん中を中心に対象であることが分かります。よってこれは、と書けます。この時点で演算数が半分になりました。N)まで落とせそうです。同様に、奇数番のものは以下のように表すことができます。これをゴリゴリやり続けると、最終的に以下の要素に辿り着きます。なるたみ氏)に当てはめればいいです。左側のx[i]の並びですが、ビット逆転(ビット列に直して、reverseをする)が使われています。これは何故?と思いましたが、偶数と奇数の成分に逐次分けていったことを思い出せば理解できます。その中の上半分の2個は、4で割れる数(下二桁のビットが00のもの)です。逆に下半分の2個は、ビットが10のものです。これを再帰的に考えていけば、LSBとMSBの関係が逆転していることが分かります。それでビット逆転を使うと都合がいいわけです。ほんで、C++のソース。最初pythonで書こうとしていましたが、C++のcomplexライブラリの方が使いやすかったので、C++で書きました。FFTは、非常に似た処理を行うので、共通部分はgenFFT()にまとめています。ソースのコンパクトさよりも分かりやすさを追求したので、比較的読みやすい(はず?)です。除算をFFTで高速化する」でFFTシリーズをシメたいと思います。アルゴリズム2011年8月7日日曜日サルでも分かるFFT(2)ふーむ、前回の「サルでも分かるFFT(1)」から時間が空きましたが、第2弾。(※サルは無知な自分のこと。)結局のところ、DFTでやるのは、単なる一次変換なので、実装するのはそんなに難しくないです。行列の積と、複素数の扱いくらいが書ければ、簡単にできます。(難しいのは、えられた結果の物理的か解釈だと思います。)また、FFTは、DFTを高速に実施するための一手法であると、前回書きました。前回の疑問点が解決したので、それを書きます。連続信号を離散でとっているので、周波数成分分解のパターンはいくつか存在するはず。DFTでは、解が一意に求まるが、どんな解が選ばれてるの?これは、実際にvisualizingするツールを作っているときにいろいろ気付きました。DFTによってえられる周波数成分は、以下の2式の条件を満たしています。1つ目の式は、周波数スペクトラムが、ある周波数を中心に左右対称になっていることを表しています。2つ目の式は、中心周波数から同じ距離にある対象な周波数成分は、反対の位相を持っているということを意味します。Chromeでの閲覧推奨)が吐き出した周波数スペクトラムです。極座標系にプロットしているので、これを見ると、式の意味が一目瞭然です。F[i]のiって何?F[1]は周波数が1っていうのは分かるけど、これは1[Hz]?それともサンプリング間隔に対して、1倍の周波数を持っているという意味?これは、サンプリング間隔に対する周波数です。実際の物理的な時間単位とは違います。すべてのサンプリングをとるのに要した時間を1[s]と考えたときに、F[i]は、i[Hz]の周波数成分となっています。N.)を実際の物理的な波に変換するときどうすればいいか?F[i]に対応する正弦波は以下の式で表されます。記事のタイトルが「サルでも分かるFFT」なので、FFTをやらないといけません。FFTの効果を実感したいなら、サンプル数が10^5とか10^6とかないといけません。)音楽CDのデータをとってきてそれにDFTかけてみる。チャレンジしようと思いましたが、データの抽出に時間がかかりそうなので、「FFTを利用した多倍長整数乗算の高速化」にトライしようかと思います。Postsmemset()とmemcpy()恥ずかしながら、Cのmemset()とmemcpy()を今まで使ったことがなかった。みたいな話を聞いたことがあったので、「あーじゃ要らない機能なんだー。editorialに投稿された解答がmems...便利なPythonライブラリ(5)retryデコレータつけるだけで、リトライしてくれるという便利ライブラリ。失敗するかもしれない不安定な関数に@retryをつけると成功するまで実行してくれる。ret...S3のファイルを一般公開するAWSのS3のファイルを一般公開する方法について説明します。2つの場合に分けて説明します。本番中ゴリ押し解を思いつくには思いついたのだが、C++でマルチスレッドの処理を書いたことが無くて、ごにょごにょやってるうちにタイムアップとなってしまった。C++...C#入門(9)Action、Func、Predicateの違いAction、Func、Predicateについて簡単に整理しておく。メソッドへのDelegate。メソッドへのDelegate。スライド区間に対するクエリ処理の種類とそれに対するアルゴリズムをいくつか紹介します。「スライド区間」の定義ですが、窓関数のようなものを想像してください。まではコンピュータの力を使って正多面体をt色以下で塗るパターン数を数えていました。今回は手計算で計算してみようと思います。そのためにはまず回転を表す対称群をうまく列挙するために回転軸について考える必要があります。見聞きする木の用語を整理しておく。節点vから最も離れた節点をwとする。w)の長さをvの離心数と呼ぶ。記号で表すときは、ε(v)と書く。使って遊んでみました。いった便利な機能を提供してくれるテストフレームワークです。repor...キャッシュヒット率の測定perfというツールを使ってキャッシュヒット率を測定してみた。キャッシュの影響なんてたかが知れていると甘くみていたら、痛い目るので要注意。知らない用語がちらほらあったので、簡単にまとめておく。