
No.1ベストアンサー
- 回答日時:
マクロが組めるならば、無理にFFTをせずに、DFT(離散フーリエ変換)で良いのかと思います。
また、かなり誤解がある(一般にそうだろうと思いますが)ようなので、
少し難しくなりますが、頑張って読んでください。
FFTと言う名前は有名ですが、DFTと演算結果は同じです。
DFTの演算量を減らして高速化したものがFFTです。
DFTは非常に簡単なループ処理で演算できます。
FFTは結構面倒なので、一からプログラムすると大変です。
私はFFTのサンプルを手に入れるのが面倒なので、
必要に迫られたときネットで検索してDFTの数式を見つけて毎回プログラムしてます。
【これを知っておくと、C言語だろうが、Javaだろうが、エクセルだろうが、何でも移植できる】
プログラムも総ライン数で10行くらいでしょうか。
デジタルデータの周波数変換に関してFFTを頼る必要は全く無いですよ。
【DFTで検索。Σ式がすぐ出てきます。つまり数列の和ですね。表計算で簡単に出力できるでしょう】
FFTは今から相当昔に開発された手法ですが、コンピュータが遅い時代に重宝しました。
しかし、当時のマイコンでもDFTで充分なスピードでしたよ。
今のパソコンのスピードは、当時の1000倍くらいです。
定義をおさらいします。
(1)フーリエ変換
無限数列を前提に処理するもの。周波数変換。
(2)DFT
サンプリングされたデータを擬似的に周波数変換するもの。厳密に周波数変換ではない。
(3)FFT
DFTと演算結果が同じになるように開発された高速演算アルゴリズム。
アルゴリズム名であり、変換としての用語ではない。直交変換としてはDFTが正しい説明。
DFTの演算結果を見ると、周期的に、実数と虚数の絶対値が同じものが現れたりする事に着眼。
最初のほうだけDFTを行い、途中から虚実を入れ替えたり、符号を変えたりして、
残りの演算結果を生成してしまう手法。
FFTが有難いとされていたのは、(3)の説明で分かると思いますが、浮動小数点演算よりも、
符号の入れ替えや、実数部と虚数部の入れ替えの方が早いとされていた時代の話です。
3Dポリゴンのゲームなどは、浮動小数点を使った行列演算を物凄いスピードでやっております。
と言うことは、DFTとFFTの違いにこだわる必要もなくなってきたわけです。
その上で、DFTは普通の人でもプログラムできます。正に初心者向け。
次にサンプリング周期が不規則とありますが、これはディジタル信号処理の感覚ではNGです。
せめてサンプリングレートを落として、一定周期でサンプリングされていることを保障しましょう。
サンプリングしたタイミングがズレると、歪みの様なノイズが重畳されます。(変調がおきる)
さらに、通常のFFTの使い方は、周波数積でのフィルタリングです。
この用途の一つとしてデータ補完があります。
インターポレーションというテクニックです。
これにより粗いサンプリングをしたデータの中間値を補完する事ができます。
これは直線補完や二次補完よりも滑らかな補完になり、自然に見える効果があります。
アニメやイラスト画像には向いていませんので、スプラインとか色んな補完が使われます。
しかし、音声や自然画像(写真)の補完では周波数をつかった補完が効果的で重宝されます。
JPEGやMPEGなどで使われるDCTもこれと似た考え方をしています。
つまり、一度圧縮でデータを削っておいて、補完によって復元するわけです。
そのため、
【FFTする前に別のアルゴリズムで中間値を補完してしまったら、意味が無いです】
中間値を直線的に案分して補完したり、投影法により補完していたのは相当昔(40年以上前)
の話であり、今はDFTを使って補完するほう普通です。(特性が良い)
また、
DFTでは少ないサンプルデータでも大雑把に周波数のカーブを見せてくれるので便利なのです。
例1)サンプルデータは5個しかないが、周波数データは1024サンプル欲しい。
【1024の配列を用意し、先頭5個にサンプルデータを代入。残りに0を入れてDFTをする】
これでOKです。
例2)データサンプルを補完を使って増やしたい(インターポレーション)
元データ:A、B、C、D、 の4サンプルを例に、データを2倍に増やす方法を説明します。
手順1) A、0、B、0、C、0、D、0 と言う0(ゼロ)を間に挿入したデータを作る。
手順2)DFTをかける
手順3)DFTデータを見ると、周期的に同じデータ出てくるので2周期目を虚数部含めて
0(ゼロ)で消す
a,b,a,b,b,a,b,a 見たいな感じに成るので、a,b,0,0,0,0,b,a に作り直す
手順4)IDFT(DFTの逆変換)をする。これも式が違うだけでDFTとほぼ同じ演算方法です。
手順5)IDFT結果を見て、元のデータと似たような変化を持つ数列になっていることを確認する。
例3)歯抜けデータを補完する
歯抜けになった部分を0として例2と同様の処理をする。
この場合サンプリングレートは半分になります。また完全な復元ではありません。
大雑把に復元できた気分になります。
以上ご参考になれば。
非常に丁寧に教えて頂きありがとうございます。
ただ時間ステップが不規則なものに対してどうやって適用できるのか、直ぐには理解できず、また元のデータで例2の処理ができないのです。一応ネット検索してみたのですが、時間ステップが一定なものに対するDFTしかなく、一度DFTを勉強してみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセル 2つの列にある値の完全一致を抜き出すVBA 15 2022/12/15 03:22
- 数学 「FFTの基本は、DFTはサンプル数Nが偶数なら 2つのDFTに分解できるということ。 分解するとD 3 2022/03/31 21:01
- その他(IT・Webサービス) 高速処理可能な表計算ソフトについて ExcelやGoogleスプレッドシートのような表計算ソフトで、 2 2023/04/29 16:06
- 物理学 フーリエ級数展開をExcelのFFTでシミュレートする 5 2023/07/03 22:02
- Excel(エクセル) Excel ドロップダウンリスト(入力規則)に関してです データの入力規則で元データ79000行のド 3 2023/07/17 10:06
- Visual Basic(VBA) ExcelVBAの複数指定範囲の構文 2 2022/05/26 22:39
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- 会計ソフト・業務用ソフト Excelで売上げデータの中の任意の商品の合計を出したい 3 2023/01/18 18:19
- Excel(エクセル) Excelに関して質問があります。 写真のようなことが起こりました。 解決方法が分かりません。 どな 2 2023/05/30 05:54
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
matlabでの標高断面図の作成
-
特定のデータの抽出方法を教え...
-
cakePHPでバルクインサートする...
-
クレジットカードの磁気データ...
-
VBA セルに入っている値数挿入...
-
TBWに達するまで後5GBの時に100...
-
標準ブラウザ情報の取得
-
VBでデータ量を指定してPingす...
-
リングバッファって何ですか
-
多量のSUMIF式を軽くしたい
-
エクセルで2つの時系列のデー...
-
SASの時間比較
-
マクロを使って「円」を消すのは
-
圧縮プログラミング
-
Fortran カンマを含む数値デー...
-
モジュラス103の算出方法について
-
SpreadのデータをCSVに出力する...
-
VBA 空白セルを削除ではない方...
-
フォートランでの相互相関関数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
VBA 空白セルを削除ではない方...
-
メモ帳(テキストデータ)をExc...
-
EXCELVBAでSQLserverからデータ...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
CString型の文字列連結について
-
ACCESSからEXCELに出力する際、...
-
ユーザーフォームのテキストボ...
-
エクセルで2つの時系列のデー...
-
C# でDataTableの更新を高速化...
-
特定のデータの抽出方法を教え...
-
C# ソケット通信でデータ受信時...
-
二分探索の平均探索回数
-
Excel VBAでのオートフィルター...
-
ブレーカー落ちで壊れたりしな...
-
Accessで該当データにフラグを...
-
VBAを使ってOutlookメール本文...
おすすめ情報