• ベストアンサー

フーリエ変換(DFT)

wolvの回答

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.8

「回答No4.」の「回答に対する補足」に対する回答: 今適当に作ったので,積分範囲と積分の刻み幅は まちがっているかもしれませんが, だいたいこんな感じになります.(よね?) データは配列として用意してください. なお,見易さ優先で行頭に全角の空白を使っているので, このままコンパイルするとエラーが出るかもしれません. ------------------------------------------------------------ /* 入力:data[i], i=0..(n-1) 出力:ws[f], wc[f] */ dft(int n, float *data, float *ws, float *wc){   int f, t;   for(f=0;f<=n;f++){     ws[i] = wc[i] = 0     for(t=0;t<n;t++){       ws[i] += sin(2*PI*f*t) * data[t];       wc[i] += cos(2*PI*f*t) * data[t];     }   } }

makayuki
質問者

お礼

ありがとうございます。 wolvさんに教えて頂いたプログラムを参考に組んでみると 予想通りの結果になりました。

関連するQ&A

  • フーリエ変換のスペクトルについて

    趣味で音の勉強をしている高校2年です。 離散化されたサンプル数Nの音データ(サンプリング周波数はkHz)をフーリエ変換(DFT)すると、N個のデータが取れると聞きました。 このN個のデータをスペクトルとして表示する場合、横軸はどのような値になるのですか? 0(Hz)~N(Hz)になるのでしょうか。

  • 離散フーリエ変換(DFT)について。

    離散フーリエ変換(DFT)について。 次の有限長N=4のディジタル信号の離散フーリエ変換(DFT)の周波数スペクトルを求めよ。[F[0],F[1],F[2],F[3]]=[-1,1,-1,2] について。 算出した所、 DFTは F[0]=1 F[1]=j F[2]=-5 F[3]=-jと算出できましたが正解でしょうか。 よろしくお願いいたします。

  • CUDAでの離散フーリエ変換(DFT)を教えてください。

    CUDAでの離散フーリエ変換(DFT)を教えてください。

  • フーリエ変換を用いた画像処理_DFT,FFT

    こんにちは,私は現在フーリエ変換を勉強しておりまして,2次元高速フーリエ変換のプログラムを作成してみました.確認のため,フーリエ変換後のデータを逆変換して,元データの再構成を試みたところ,データが上下左右反転していることがわかりました.とあるネット上の解説では,「DFTを行うと上下左右が反転することがある…」と見かけたのですが,その情報も少なく,こちらとしては納得のいく解釈にはつながりません.どなたかなぜ逆変換時のデータが上下左右反転してしまっているのかわかる方はいらっしゃいませんか.

  • フーリエ変換の振幅について教えてください。

    エクセルアドインを使って下記サイン波をフーリエ変換しました。 振幅3mm、周波数4Hz、サンプリング周波数256Hzの波形であり、 つまり、フーリエ変換したい波形は3×SIN(2×PI()×4)です。 アドインでフーリエ変換を行い、出てきた複素数の絶対値つまり√(実部^2+虚部^2)を計算すると3を示すと思っていたのですが、実際は周波数4Hzで384 という値になりました。 周波数分析して周波数4Hz時の振幅が3となるようにするには振幅はどう計算すればよいのでしょうか?またいろいろな振幅や周波数の混ざったランダム波でも各周波数での振幅を求めるにはどう計算したらよいのでしょうか?素人ですが教えてください。

  • サンプリングを高くするほどフーリエ変換値がずれる?

    ある周波数解析ソフトで「フーリエ変換」釦があるのですが、サンプリング周波数を高くするほど、フーリエ変換値がずれてしまいます。 (例)60Hzの正弦波のみの1s間の波形を「フーリエ変換」釦を押すと、 (1)サンプリング周期(10ms)→ 50.5Hz、 52.5Hz、 76.5Hz、の順でピーク点 (2)   〃    (1.0ms)→ 62.5Hz がピーク点。 (3)   〃    (0.1ms)→ 98.5Hz が 〃 (4)   〃   (0.001ms)→  0.0Hz が 〃 となり、周波数ピーク点が60Hzに合いません。このように大きくずれてしまうものでしょうか? なお、同ソフトで「フーリエ級数展開」釦では特定区間指定でき、60Hzの「1次」のみに表示されるのですが、「フーリエ変換」機能には、区間指定釦がありません。 詳しい説明書きはないのですが、通常そのような使い方となるものでしょうか?

  • 高速フーリエ変換の標本点数について教えてください

    最近フーリエ変換を勉強し始めた者です。 自分の理解が合っているのかとても不安なので、ぜひともお知恵を頂戴したくお願いいたします。 CDのようにサンプリング周波数が44100Hzの場合、フーリエ変換の際の標本点数(データ数)が4096だと、4096 / 44100 = 0.1秒弱分しかそのCDの曲をフーリエ変換できないという理解で合っているのでしょうか。 合っている場合、たとえば5分程度の曲をフーリエ変換するためには、 5min * 60s * 44100Hz = 13,230,000点の標本点数についてフーリエ変換しなければならないという理解で合っているでしょうか。 恐れ入りますが、よろしくお願いいたします。

  • Sin波をAD変換ボードを通してAD変換したときの波形図。

    Sin波をAD変換ボードを通してAD変換したときの波形図。 AD変換ボードの操作に慣れようと思って、周波数発信機を用いて60Hz、600Hz、6kHz、60kHz、600kHzのsin波を測定しているのですが、60Hz、6kHzのときは、きれいなsin波が測定できるのですが、それ以外の周波数の場合には、sin波が測定できません。一応サンプリング周波数を変えてやってみたのですが、それでもダメでした。60Hzと6kHzの測定はサンプリング周波数1000Hzで取ることができました。こんな現象が起きるのにはサンプリング周波数以外にも何か理由があるのでしょうか? なお、供給する電圧は、2~3V程度の信号を使用しています。 使用しているAD変換ボード:分解能16bit、最高サンプリング速度100kSPS、バイポーラ:±10V 添付図は、電圧は違いますが同じ回路を使用した場合の60Hzと600Hzの波形です。

  • 離散フーリエ変換

    フーリエ変換を計算機で扱う場合について聞きたいです。 ある関数(例えばsin(x))を離散フーリエ変換しようとして、まずxを0.1ずつ増やしながらsin(x)をサンプリングします。これを虚部を0として複素数にします。 この後、複素数のフーリエ変換を行い結果が得られます。 と、ここまでは正しいと思うのですが、 その後が分かりません。 文献などに載っているフーリエ変換後のグラフは、横軸が周波数νで、縦軸がf(ν)です。 このグラフと合うようにするには 横軸・縦軸には何をとればいいのでしょうか? 横軸が周波数って言うのは、この場合は1/0.1のことでしょうか? 教えて頂きたいです。お願いします。

  • ある時間関数を離散フーリエ変換して得られるフーリエスペクトルの振幅値に

    ある時間関数を離散フーリエ変換して得られるフーリエスペクトルの振幅値について教えて下さい。 今想定している離散フーリエ変換の式は一般的なもので Σ(k=0~N-1) f(k)exp(-2πkni/N) を考えています。 また、離散フーリエ変換して得られるスペクトルは √(Re^2+Im^2) で計算します。 離散フーリエ変換を適用する関数を、 振幅1の直流、及び振幅1で周波数5[Hz]の正弦波とします。 (この2つの信号は別々の信号で合成されていません。) サンプリング周波数を20[Hz]とした場合、サンプリングして得られるデータ列はそれぞれ、 直流: 「1, 1, 1, 1」 正弦波: 「0, 1, 0, -1」 となると想定されます。 (正弦波をサンプリングする場合は位相が関わってきますが、今回は気にしないで下さい。) このデータ列に対して上記の離散フーリエ変換を適用した場合、 得られるフーリエスペクトルの振幅値はそれぞれ、 直流: 「4」(直流のフーリエスペクトルの振幅値値) 正弦波: 「2」(5[Hz]のフーリエスペクトルの振幅値) となります。 (データ点数は上の通り4点) ここで質問なのですが、 離散フーリエ変換して得られるスペクトルの振幅値から元の関数の振幅値を求める場合、 フーリエスペクトルをサンプリングの総データ点数で割ることは数学的に納得できます。 しかしこの例の場合、フーリエスペクトルを総データ点数で割ると、 直流: 「4 -> 1」 正弦波: 「2 -> 0.5」 となってしまい、直流は正しいのですが、正弦波の元の振幅値を正確に求めることは出来ません。 この例の場合、フーリエスペクトルの振幅値から正弦波の振幅値を正しく求めるには、 「フーリエスペクトルの振幅値*2/データ点数」 としてやらなければいけません。 上記のことに関して、なぜこのようになるのかを(2をかける理由を)教えて頂けないでしょうか。 当方、数学についてはあまり詳しくないため、簡単に説明して頂けると幸いです。