• ベストアンサー

不規則なデータのfft処理

データサンプリングが不規則なのですが、ExcelでMacroを使って中間値を補間してフーリエ変換FFT処理する方法をお教え頂けないでしょうか? またできればExcelはFFTできる最大が4096ですがMacro処理でそれ以上の数でできるようになりませんか?フリーソフトでも構いません。切り貼りは致します。 両方の質問共にでなくても、片側だけでも良いので、お手数おかけしますが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Glory_777
  • ベストアンサー率50% (105/208)
回答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と同様の処理をする。  この場合サンプリングレートは半分になります。また完全な復元ではありません。  大雑把に復元できた気分になります。 以上ご参考になれば。

ji-young
質問者

お礼

非常に丁寧に教えて頂きありがとうございます。 ただ時間ステップが不規則なものに対してどうやって適用できるのか、直ぐには理解できず、また元のデータで例2の処理ができないのです。一応ネット検索してみたのですが、時間ステップが一定なものに対するDFTしかなく、一度DFTを勉強してみたいと思います。

関連するQ&A

  • FFTによるフィルタの可能性について

    はじめまして、信号処理については初心者です。教えていただけると幸いです。 ソフト処理でディジタルフィルタを作成したいと思っています。 リアルタイム処理が最終目標です。 IIRとかFIRとかの手法がありますが、FFTによるフィルタリングの可能性はあるのか知りたいです。 エクセルを用いて、模擬的に作った方形波をFFT演算して、 その結果の高い周波数部分を0にして逆FFTすると、綺麗に高調波が除去されていました。 この方法でのフィルタリングは実現可能なものと考えてよいのでしょうか? FFT処理では、エクセルの結果を見る限り、(当たり前ですが)遮断周波数でスパッと切れた波形が得られています(遮断周波数以上の振幅は0になる)。 一方、フィルタの本などでは、振幅減衰は1次で-20dB/dec、2次で-40dB/decと書かれており、 物理法則上そうなるものと思っていました。 FFTを利用したフィルタリング(遮断周波数以上の振幅は0)というのは、 何か原理的に(物の理として)おかしいところはないのか、不安に思っています。 また、電気系の雑誌にはIIRフィルタ等の使用について書かれている記事を見受けますが、 FFTフィルタリングが可能だとすれば、こちらの方が理想的なフィルタが得られることになります。 何か問題があってFFTフィルタリングが採用されていないと思いますが、どのような問題を秘めているのでしょうか。 (FFTフィルタが理想なのに、IIRフィルタが使用される理由は?) 上にも記載しましたが、将来的には高速マイコン(DSP,FPU付き)を使用してリアルタイム的な処理を行いたいと考えています(サンプリング周波数は16kHz程度です)。 FFTフィルタリングの設計の肝、IIR(FIR)フィルタとの使い分けについても、ご教示いただけると幸いです。 どうぞよろしくお願いいたします。

  • 信号処理でのサンプリング誤差について

    添付の図のような、ガウス関数の二次微分のフィルタ(LOG)を 離散的な入力データ列に畳みこもうと思っています。 空間的な畳込を行う場合、LOGフィルタもサンプリングして 計算すると思いますが、-2,-1,0,1,2で間引くと、 もとの形状とはかなり違ったフィルタをかけることになると思います。 そこで、 ・LOGフィルタのフーリエ変換した解析式を使ってFFTをかける。 ・入力データを補間拡大してフィルタをかける を考えていますが、これは正しい方法でしょうか。 このようにスケールが小さい場合での高精度なフィルタ処理方法を ご存知でしたらご教授下さい。

  • エクセルでのフーリエ解析について

    ある実験データをエクセルのフーリエ解析ツールで解析したのですが、 出てきた複素数の値をどのような式にあてはめれば、 フーリエ級数を求められるのでしょうか? ※FFTでフーリエ級数を求めて、データ間の補間に使用したいと考えています。参考書などを見ても、パワースペクトルを求めるところまでしか書ていないので・・・

  • 周波数帯域のある信号をFFTに掛ける場合、処理結果はどうなるのでしょう

    周波数帯域のある信号をFFTに掛ける場合、処理結果はどうなるのでしょうか? 私は周波数帯域が100~10,000HZのマイクを使い録音し、そのデータを取り出し、 自作したプログラムを用いて、サンプリング周波数32768HzでFFTを掛けて、 信号の周波数特性を調べています。 ただ、FFTの処理結果によると、周波数帯域外の100HZ以下の領域に、周波数帯域内 と比べて大きな特徴が見られました。 そこで質問なのですが、この場合、自作したプログラムにミスがあるのか、 周波数帯域外の信号を録音してしまっているのか、それとも両方なのか、 それ以外にも理由があるのか、その辺りについて教えて頂ければと思います。 周波数解析の分野の理解が浅いため、酷く初歩的な質問であるかもしれませんが、 どうかよろしくお願いします。

  • フーリエ変換のデータ点数を増やしたい

    現在はエクセルでフーリエ変換・逆フーリエ変換を行っていますが、最大で4096点までしか扱えないそうです。 都合上、16384点のデータをフーリエ変換・逆フーリエ変換を行いたいと思っています。そこで、フリーソフトのFFT君を試してみたのですが、逆フーリエ変換の際に1つのデータしか変換できないみたいです。つまり、複素数の実部・虚部の2つのデータを一度に逆フーリエ変換したいということです。 何かよい方法がありましたら教えていただけないでしょうか。よろしくお願いします。

  • フーリエ変換の最大周波数

    5kHzでAD変換した信号があり、解析したい成分は0~1kHzに含まれています。 上記の前提で、256点で128点オーバーラップしながらFFT処理を行った場合、FFTを行うデータ数をN、サンプリング間隔Δt(1/5kHz=0.0002sec)とした時、 分解能 Δf=1/N*Δt=19.53 最大周波数 Fmax=(N/2NΔt)-(1-Δf)=2480.47 という計算式をインターネット上で見つけました。つまり0~2480Hzまで20Hzごとのパワースペクトル時間変化が128点データが並ぶということになると思うのですが・・・・ 一方、最大周波数はFFTデータ数の半分だという記載も見つけました。すると、最大周波数は半分も128Hzだと思うのですが、どちらが正しいのでしょうか?

  • エクセルの入力規則の設定について

    エクセルの入力規則の設定方法で質問があります。 入力値の種類は整数です。 入力する値は、決められた範囲内で重複しない物にしたいのです。 たとえば、A列の入るデータの条件として、 1 決められた範囲(たとえば2~20までの整数) 2 前にA列に入力されている値より大きな値。 です。   A  1 2  2 3  3 4  4 6  5 ? となっている場合、A5は1~20の間で7以上の値に制限したいのです。 どこかにダミーのセルを作ってA列の最大値を求めておけば可能だと思うのですが、入力規則だけで処理したいのです。 よろしくお願いします。

  • レコードの分割処理

    お世話になります 現在、レコード長70000バイト (50000-70000バイトの不定長) のテキストファイルがあります この長さだと他のソフト(エクセルなど)で 処理が不可の場合が多いということもありますので レコード長を分割して5000バイトぐらいにして 最大14レコードを作成したいと思います vb6ランタイムはあるのですが プログラムの作成とその起動処理がわかりません お手数ですがよろしくお願い致します それと、そのようなことができるフリーソフトが あればよろしくお願い致します WINDOWS98SEです

  • VBSとエクセルVBAの連携

    一定の処理を自動化したいと考えております 以下が現在の構成 main.vbs       メインの処理を実行 Master.xls (Macro1) マクロを記述してあるエクセル A.xls マクロを実行したいエクセル 現状はmain.vbsの処理を終了後に手動でアクティブウィンドウをA.xlsにしてMacro1を実行しています。 (エクセルファイルは両方開きっぱなしです) これをmain.vbsの処理の中に組み込み main.vbsの処理終了後に自動的に実行するようにしたいと考えています。 1.既に開いてあるエクセルファイルをアクティブにする処理が分かりません。 2.アクティブなエクセルファイルから別のエクセルファイルのマクロを実行する方法がわかりません。 初心者の質問で理解に苦しむかと思われますがご教授よろしくお願いいたします。

  • MRI画像再構成でのフーリエ変換

    excelでMRIの画像再構成が2次元フーリエ変換を使ってできるのですが、MRI画像再構成では象限の入れ替えという過程があります。これは画像の中央部の行と列を残して残りを第1象限と第4象限、第2象限と第3象限を入れ替えるものです。 これを行うためには中央部にあたる行と列がなければならないので、データ数は縦横共に奇数でなければいけないです。 しかし、excelでFFTを行う際にはデータ数は2のべき乗、つまり偶数個ないといけなくなってしまいます。 どうやってこの矛盾を解決できるのでしょうか。 また、もし何らかの方法で2のべき乗個に増やす、または減らすことができた場合、中心にあたる行と列がなくなってしまうので象限を入れ替える際はどこの行・列を中心部にして行えばよいのでしょうか。 よろしくお願いします。 補足:カテゴリーがよく分からなかったので、フーリエ変換ということで数学分野にしました。

専門家に質問してみよう