- ベストアンサー
フーリエ変換(DFT)
現在、音響関係興味をもち、いろいろと勉強してるのですが、 フーリエ変換(DFT)を用いて、100Hzのsin波を1KHzでサンプリングするとは どういう意味なんでしょうか?どなたか教えて頂けませんか?
- みんなの回答 (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]; } } }
その他の回答 (7)
- republiky
- ベストアンサー率50% (7/14)
FFTのプログラムは少々面倒ですが、DFTのプログラム は非常に簡単です。わずか数行で出来てしまいますの で、難しいことはありません(定義式をそのまま計算 すればいいのです)。ぜひ、トライしてください。 Cでは複素数の変数型はありませんので、実部と虚部に 分けて計算する(つまり、実部の実数型変数、虚部の 実数型変数、二つの変数を定義してそれぞれ計算す る)ことに注意してください。つまり、 exp(jx) = cos(x) + j*sin(x) と分解して考えましょう。Σの計算はforループを使え ば良いのです。その結果、nobouさんの計算どおり、 デルタ関数のピークが出てきます。 スペクトルの結果を表示する際は、振幅と位相にわけ てグラフを表示すると見やすくなります。 目盛りの読み方も大事なので、ここで書きたいところ ですが、説明が長くなってしまいますので、割愛しま す。とりあえずプログラムを作ってみて、結果を考察 してみてはいかがでしょう?
お礼
ありがとうございました。 プログラムを組んでみたら、案外、簡単に作ることができました。
- nubou
- ベストアンサー率22% (116/506)
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ =(δ(f-f0)-δ(f+f0))・A/2/j ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ =Σ(-∞<k<∞)・ (δ(f-k・fs-f0)-δ(f-k・fs+f0))・fs・A/2/j
お礼
詳しい計算ありがとうございます。 この計算をもとにDFTのプログラムを組んで見ます。
- nubou
- ベストアンサー率22% (116/506)
一応FTを計算しておきましょう g(t)のフーリエ変換をG(f)とすると G(f)≡∫(-∞<t<∞)dt・g(t)・exp(-j・2・π・f・t) です g(t)=A・sin(2・π・f0・t) であれば G(f)≡∫(-∞<t<∞)dt・g(t)・exp(-j・2・π・f・t) =∫(-∞<t<∞)dt・A・sin(2・π・f0・t)・exp(-j・2・π・f・t) =∫(-∞<t<∞)dt・ A・(exp(-j・2・π・(f-f0)・t)-exp(-j・2・π・(f+f0)・t))/2/j =(δ(f-f0)+δ(f+f0))・A/2/j 次に gs(t)=Σ(-∞<n<∞)・g(t)・δ(t-n/fs) としgs(t)のフーリエ変換をGs(f)とすると Gs(f)≡∫(-∞<t<∞)dt・gs(t)・exp(-j・2・π・f・t) =Σ(-∞<n<∞)・g(n/fs)・exp(-j・2・π・f・n/fs) =fs・Σ(-∞<k<∞)・G(f-k・fs) =Σ(-∞<k<∞)・ (δ(f-k・fs-f0)+δ(f-k・fs+f0))・fs・A/2/j です
- republiky
- ベストアンサー率50% (7/14)
さらにかいつまんで。 ・「100Hzのsin波」とは、1秒間で100周期の正弦波。 ・「1kHzでサンプリング」とは、一秒あたり1000個の 点で波形を表す(近似する?)こと。 もともとの正弦波をx(t)=sin(2*PI*f*t)とします。 それをT=1/1000秒ごとに正弦波の値を拾っていきま す。当然ながら、Tの値が小さいほど(サンプリング 周波数が高いほど)正弦波を正しく表すことができ ます。 式で表すと、時刻がt=n*T (n=1,2,..,N-1)のときに xの値を拾っていきます。 したがって正弦波は、x(n*T)=sin(2*PI*f*n*T), n=0,1,2,3,...,N-1というN個の値で表されます。 たとえば、2秒間計測するのであればN=2000、10秒間 計測するのであればN=10000となります。逆にN=1024 として計測するのであれば、時間は1.024秒かかりま す。 このx(n*T)をDFTのアルゴリズムで計算すると(離散) スペクトルが得られます。 すでに回答がありましたが、x(t)のスペクトルを得る のは、通常いわれているフーリエ変換(フーリエ積分) です。これはあくまで理想的な変換式なので、コンピ ュータでは計算できません。そこで、DFTが誕生したわ けです。 蛇足ですが、DFTのアルゴリズムに工夫を加えて計算速 度を上げたものをFFT(高速フーリエ変換)といいま す。計算結果はどちらも同じです。 かいつまんで書くつもりが長くなってしまいました…
補足
とても詳しい説明ありがとうございます。 勉強になりました。 このような計算(サンプリング周波数は1KHzとして、100Hzのsin波をフーリエ変換DFTする。 )をC言語で計算することは可能でしょうか? また、どんなプログラムを組むと、計算できるのでしょうか? いろいろと質問してしまって申し訳ないですが、よろしくお願いいたします。
- ymmasayan
- ベストアンサー率30% (2593/8599)
すでに、お答えは出ているようですが、かいつまんで。 質問に対する回答は、「離散フーリエ変換(DFT)を用いる際、100Hzのsin波を1KHzでサンプリングした」と言うことだと思います。 フーリエ変換は時間変化の波形を周波数分析する事ですが、アナログ的にやるのがフーリエ変換、ディジタル的にやるのが離散フーリエ変換です。 参考URLにもあるとおり、「分析したい波に含まれる最高周波数の2倍以上の周波数でサンプリングすれば、もとの波は完全に再現できる」(シャノンのサンプリング定理)ということを利用してディジタル的に行なっているのが離散フーリエ変換です。100Hzのsin波が純粋なものか歪波なのか判りませんが、400Hzまでの高調波が含まれていても再現可能であるといえます。(500Hzは限界で微妙)
- nubou
- ベストアンサー率22% (116/506)
DFTは離散フーリエ変換でありフーリエ変換ではない フーリエ変換はFTである 振幅A周波数f0の正弦波は g(t)=A・sin(2・π・f0・t) である これを周波数fsのサンプリング周波数でサンプリングした信号は gs(t)=Σ(-∞<n<∞)・g(t)・δ(t-n/fs+τ) である t=0をづらしてτは扱いやすいように0にすることが多い すなわち gs(t)=Σ(-∞<n<∞)・g(t)・δ(t-n/fs) 質問ではf0=100[Hz],fs=1[kHz]である なおデルタ関数に当惑されるかも知れないがこれは連続時間信号と離散時間信号を扱いやすいようにするために現れたものである 要するにサンプリングとは ・・・,f(-3/fs),f(-2/fs),f(-1/fs),f(0/fs),f(1/fs),f(2/fs),f(3/fs),・・・ 以外の関数値を捨てるということである
- wolv
- ベストアンサー率37% (376/1001)
「フーリエ変換(DFT)を用いて、100Hzのsin波を1KHzでサンプリングする」とは 「100Hzのsin波を1KHzでサンプリングして,フーリエ変換(DFT)する」 という意味だと思います.言い換えると, 「ある波(実は100Hzのsin波)をフーリエ変換(DFT)する. その際の,サンプリング周波数は1KHzとする.」 ですね. -------------------------------- たぶん,上のような回答を求めているのではないですね. フーリエ変換の意味は知っていますか? 100Hz,1KHzなどのあらわす意味は知っていますか? サンプリングの意味は知っていますか? DFTの意味は知っていますか? はじめの二つは調べればわかる,または,知っていると仮定すると……. -------------------------------- サンプリングの意味 この場合,「1KHz(1秒に1000回)入力値を測定して, DFTに用いる」という意味になります. DFTの意味 Dは離散(descrete)のDです. フーリエ変換自体は「連続関数を積分を用いて変換するもの」(やや自信なし) ですが,DFTでは「微小時間ごとの関数の値」という離散的な値を使って 和(Σ)によって変換します. サンプリングの例 周波数1/16 (波長16)の波 (を周波数1で 周波数1/2で… 周波数1/17で… サンプリング) -----*-----00 -----*-----00 -----*-----000 -----+*----01 -----+-*---02 -----+*----017 -----+-*---02 -----+--*--04 -----+-*---034 -----+--*--03 -----+-*---06 -----+--*--051 -----+--*--04 -----*-----08 -----+--*--058 -----+--*--05 ---*-+-----00 -----+--*--075 -----+-*---06 --*--+-----12 -----+-*---092 -----+*----07 ---*-+-----14 -----+*----099 -----*-----08 -----*-----16 -----*-----116 ----*+-----09 -----+-*---18 ----*+-----133 ---*-+-----10 -----+--*--20 ---*-+-----130 --*--+-----11 -----+-*---22 --*--+-----157 --*--+-----12 -----*-----24 --*--+-----174 --*--+-----13 ---*-+-----26 --*--+-----191 ---*-+-----14 --*--+-----28 ---*-+-----198 ----*+-----15 ---*-+-----30 ----*+-----215 -----*-----16 -----*-----32 -----*-----232 サンプリング周波数が大きければ大きいほど, 元の音のデータを多く使うので, 元のデータをよく表す変換後のデータが得られます. ただし,データ数が多いので,計算が大変になります. 逆に, サンプリングレートがもとの波の周波数よりもだいぶ小さい場合 (元の波の1/2波長よりも波長が長くなる場合)(図右), 元の波を再現することはできなくなります. (やや自信なし) 図右はじの例では,波長232(周波数1/232)の波に対応する 変換結果が得られてしまいます. この辺のことから感覚的にわからないでしょうか. -------------------------------- 系統だった勉強をしたり,誰かに教えてもらったわけではないので, 説明するのは下手なようです……. どこがわからないのかわからないと,説明が難しい.
お礼
わからなかった事が大体理解することができました。 ありがとうございます。
補足
そうです、100Hzのsin波をフーリエ変換(DFT)する. その際の,サンプリング周波数は1KHzとする. 言いたかったことは、まさにそういうことです。 説明が悪くてすみません。
お礼
ありがとうございます。 wolvさんに教えて頂いたプログラムを参考に組んでみると 予想通りの結果になりました。