• ベストアンサー

高速フーリエ変換(FFT)による方法について

電気化学インピーダンス法の本の一文についての質問です. FFTでは,サンプリング数2^n (nは自然数)の時系列データを用いて演算を行う.例えば,サンプリング数1024点でサンプリング時間を10msとした場合,測定時間は約10sとなる.この測定で“基本周波数100mHz(10sの逆数)とその第512番目までの高調波(1024点の半分) までの電気化学インピーダンス”をFFTによる計算と式の割り算で一度の求めることができる.すなわち基本周波数により測定時間が決定される. “ ”の部分の理由がどうしてもわかりません. 回答お願いします.

  • irsc
  • お礼率83% (5/6)
  • 化学
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • MOMON12345
  • ベストアンサー率32% (1125/3490)
回答No.1

測定時間が10秒なので最小測定周波数はその1/xになりますよね。 測定時間内に1サイクル以上が入らないと測定できませんので。 最大周波数の方は、正弦波をサンプリングする場合正弦波の1サイクルの中に2つのサンプリングポイントが必要です。 つまりサンプリング周波数の半分の周波数までしか測定できません。 サンプリングが10mS(100Hz)なので最大計測周波数は20mS周期の正弦波(50Hz)という事になります。(ナイキスト周波数) http://www009.upp.so-net.ne.jp/hachinami/note004/index.htm

irsc
質問者

お礼

ありがとうございます. 勉強になりました

関連するQ&A

  • FFT(高速フーリエ変換)の考え方

    ///////////質問(1)//////////////////// 離散フーリエ変換が以下の式で表せることは理解できます。      N-1       nk          -2πi / N A =  Σ  a   W ,   W = e    n   k=0   k                 n:基本周波数のn倍 N:データ数 ここで、実際のプログラム上では、 (1)akに サンプリングしたデータとサンプリング周期を掛けたもの を入れ、 (2)それをWと掛けあわせて行くと思います。 では、Wには何を代入すればいいのでしょうか? Wを実部・虚部にわける、もしくは、 絶対値・位相にわけて計算する方法で あっているのでしょうか? Anは周波数n成分の面積を表していると思うのですが、面積に虚数概念がで てくるのも変な話なような気がして、質問させていただきました。 ///////////質問(2)////////////////////    N/2-1    2nk   n N/2-1     2nk A = Σ a  W + W  Σ  a  W  n  k=0  2k        k=0  2k+1 Cooley-Tukey 型 FFTは質問(1)の式を上記のように2項に分解することで、 計算を減らすことができるとのことです。 しかし、私には理解できません。 左側の項でN/2回の掛け算を行い、右側の項でもN/2回の掛け算を行うのでは、 結局式を分解しただけで、何も変わっていないように思えます。 どのように考えればいいのでしょうか? アドバイスよろしくお願いします。

  • FFT フーリエ変換 について

    FFTについて質問があります。 あるシミュレーションのために ・サンプリング周波数48kHz ・量子化24ビット ・1kHzのサイン波 のデータを作って、それをFFTにかけてみると 裾野が広がり、フロアの高いスペクトラム となってしまいました。(データは4096ポイント、Hanning窓) ポイント数が少ないことによる劣化だと考え、データポイントを 65536ポイントで取ってみると綺麗なスペクトラムとなっており、 データの作り方としては間違っていないのではないかと考えています。 一般的にFFTはデータポイントが多い方が、FFTをとったときに、 裾野広がらず、シャープなスペクトルを得ることはわかっています。 が、そこを何とか少ないポイント数で綺麗なFFTを得られるような 入力データは作れないものでしょうか? 出所は不明ですが、私の持っている別のデータを入力として用いると 少ないポイントでも綺麗なFFTを得ることが出来ているので、 何かデータを作るコツのようなものがあると思って投稿させて いただきました。 どなたか詳しい方がいらっしゃいましたら、ご教授お願いします。

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

    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だと思うのですが、どちらが正しいのでしょうか?

  • 離散フーリエ変換

    サンプリング周波数1000Hzとしてデータ数をnとすると、周波数はどうやってもとめることができるのでしょうか?サンプリング周波数は1秒間に取得するデータでですので、n/1000=t(時間)となって、f=1/tの公式に当てはめることで求めることはできますか? よろしくお願いします。

  • 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)フィルタとの使い分けについても、ご教示いただけると幸いです。 どうぞよろしくお願いいたします。

  • エクセルでのFFTについて

    今圧電ブザーを発振回路につないで発振させて,その出力をエクセルでFFTを行って共振周波数を調べています。ここで圧電ブザーにペンキを薄く塗って質量が増大することで共振周波数が下がると考えて実際に行ってみたら変化が見られませんでした。自分としては機械的には共振周波数が下がっていると思うのですが、それが検出できませんでした。これは何が原因でしょうか?数Hz程度の小さい変化だとしたらFFTでは分からないものなのでしょうか? ちなみにサンプリング時間は5.12msで、サンプリング周期は0.01msです。この二つの意味もよく分かりません。 あまりうまく質問できてないかもしれませんがどなたかお答えください。よろしくお願いします。

  • フーリエ変換について

    これから、FFTのプログラムを組んでみようと思います。 音楽ファイルを読み込もうと思いますが、 音楽ファイルは、不連続信号だと思うのですが、 音声は、44100Hzだから、必要な区間は、44100*2=88200点で、 0-88199,88200-176399,176400-264599,... という区間ごとに読み込んでいけばいいのでしょうか? その際は、窓関数の、ハニング窓:Wk=0.5-0.5*cos(2πk/L)を(最初は、方形窓でするつもりですが、)データに掛けて、 その値をFFTしてやればいいのでしょうか? 88200点の近似点は、2の16乗(65536)か2の17乗(131072)なので、 こちらのデータ区間を使えばいいのでしょうか? それとも、実際は、20000Hzしか使っていないので、44100点近くで、サンプリングす ればいいのでしょうか? また、区間ごとに得られた周波数を、区間ごとに処理していけばいいのでしょうか? すみませんが、よろしくお願いします。

  • FFTでの分解能について

    FFTをするときに、その分解能はサンプリング時間とデータの数で決まってしまうと思うのですが、この二つを変えずに周波数分解能をあげることは可能でしょうか?また、データ数を補間する等して無理やり多くすると問題があるでしょうか?すいません、どなたかお答え下さい。

  • FFTを使って異なるサンプリング周波数での周波数強度について

    100Hzのsin波に対してFFTを行い周波数スペクトルを出したときのことです。 解析条件 サンプリング周波数・・・・44.1kHz , 22.1kHz FFTの点数・・・32768点 窓関数・・・ハニング窓関数 まず、サンプリング周波数44.1kHzで解析を行い、100Hzにメインローブが現れていました。 次に、サンプリング周波数22.1kHz以外は同様の解析条件で解析を行ったのですが、サンプリング周波数44.1kHzに比べて、100Hzのスペクトル強度が下がっていました。また、サイドローブは44.1kHzに比べて上がっていました。 スペクトル強度がサンプリング周波数によって変化するというのはありえるのでしょうか? それとも、私の組んでいるプログラムが間違っているという事なのでしょうか?どなたかご教授下さい。よろしくお願いします。

  • Cプログラムによる画像の高速フーリエ変換FFT

    Cプログラムにる画像処理について教えてください。逆高速フーリエ変換(IFFT)によって周波数領域から実空間領域に変換する際、周波数帯域を(低周波数領域に)制限してIFFTを実行できるという文献があるのですが可能でしょうか?通常の逆離散フーリエ変換(IDFT)では可能でした。 以下のコードの修正で可能でしょうか? 例) 512*512の空間周波数領域データを212*212(仮に)の低周波数領域に帯域制限してIFFTで画像に戻したいのです。 以下の以下の一次元FFTコードを用いてX方向とY方向にIFFTしたいと考えています。 void FFT(int ir, int nx, float *xr, float *xi, float *si, float *co, unsigned short *brv) // 1次元フーリエ変換 // int ir; 順変換(1)と逆変換(-1) // int nx; 1次元FFTのデータ数 // float *xr; 実部のデータ xr[nx] // float *xi; 虚部のデータ xi[nx] // float *si; FFT用のサインデータ si[nx/2] // float *co; FFT用のコサインデータ co[nx/2] // unsigned short *brv; FFT用の入れ替えデータ brv[nx] { int i, j, n1, n2=nx, j3, j4, k, l, ll, d=1, g; float a, b, c, s; for(l = 1; l <= nx/2; l *= 2, d += d) { g = 0; ll = n2; n2 /= 2; for(k = 1; k <= n2; k++) { n1 = k-ll; c = co[g]; s = -ir*si[g]; g += d; for(j = ll; j <= nx; j += ll) { j3 = j+n1-1; j4 = j3+n2; a = xr[j3]-xr[j4]; b = xi[j3]-xi[j4]; xr[j3] += xr[j4]; xi[j3] += xi[j4]; xr[j4] = c*a+s*b; xi[j4] = c*b-s*a; } } } 通常のDFTでの帯域制限はこのように行い可能でした。 void fourier1d(int ir, float *fr, float *fi, int nx) { int i, j, n = 1; float *gr, *gi; double u, x; gr = (float *)malloc((unsigned long)nx*sizeof(float)); gi = (float *)malloc((unsigned long)nx*sizeof(float)); for(i = 0 ; i < nx ; i++) { u = i-nx/2; gr[i] = gi[i] = 0; for(j = 150 ; j < 362 ; j++) { x = j-nx/2; gr[i] += (float)( fr[j]*cos(2*PI*u*x/nx)+ir*fi[j]*sin(2*PI*u*x/nx)); gi[i] += (float)(-ir*fr[j]*sin(2*PI*u*x/nx)+fi[j]*cos(2*PI*u*x/nx)); } } if(ir == -1) n = 212; // 逆変換はデータ数で割る for(i = 0 ; i < nx ; i++) { fr[i] = gr[i]/n; fi[i] = gi[i]/n; } free(gr); free(gi); }