• 締切済み

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

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

みんなの回答

noname#65504
noname#65504
回答No.4

>0.1秒弱分しかそのCDの曲をフーリエ変換できないという理解で合っているのでしょうか。 >たとえば5分程度の曲をフーリエ変換するためには、 5min * 60s * 44100Hz = 13,230,000点の標本点数についてフーリエ変換しなければならないという理解で合っているでしょうか。 そうですね。 でもフーリエ変換は周波数領域の大きさを求める物ですから、1曲全部フーリエ変換することにどんな意味があるのでしょうか? 他の曲との比較ですか? >窓関数の物理的意味と フーリエ変換の前提に切り取ったデータが繰り返し行われるという物があります。 いわば、1曲終わったらまた同じ曲が続けられるという状況が前提にあるのです。 自然現象ではノイズも含めると、全く同じ音が繰り返し起こるとはまずないです。そのためサンプリングしたデータは前提条件を満たしません。 前提条件にある、同じことが繰り返し行われるということは一番最後のデータの後に一番最初のデータが続くということです。 しかし一般に完全に同じ状態が続くことはないので、サンプリングしたデータは不連続になり、それが解析結果に影響を及ぼします(リンク効果)。 それを防ぐための工夫として窓関数を用います。 質問者が補足を要求している、#2さんの書かれていることは、1曲全部をフーリエ変換するのではなく、曲を分割して何回もフーリエ変換をするということを意味しています。 1曲全部をフーリエ変換することによりその曲の周波数特性が出ますが、曲を分割していくということは、1つの曲の分割したパートごとの周波数特性を求めることになります。

araigoro
質問者

補足

semi-zzzさん、はじめまして。 詳しく教えて下さって、ありがとうございます。 曲をフーリエ変換するというのは、私にとって思いつきやすい例えですので、それ自体に何か意味があるわけではないのですが、確かに仰られるとおり、一曲をフーリエ変換したその結果と他の曲のフーリエ変換の結果が異なることを確かめてみたいという気持ちはあります。 相変わらずよくわかっていないのですが、曲とフーリエ変換の結果は必ず1対1になるので他の曲のフーリエ変換の結果とは絶対に異なるということを想像しており、それを確かめてみたいという気持ちです。 窓関数をなぜ使うのかという点につきましては、semi-zzzさんや他の皆様のアドバイスのおかげで理解することができました。 ありがとうございます。 ここまで皆様からお教え頂いた内容を自分の中で整理していたのですが、おそらく次は、曲を分割する際にFFTの式の中でどの変数がどういう役割になり、窓関数はどういうタイミングで使うのかという点になると思います。 いきなり質問してしまっては勉強にならないと思いますので、自分でもう少し理解できるように努力してから、わからない点をまたここで質問させていただきたいと思っております。 それにしても難しいものですね。。。

  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.3

全体をフーリエ変換できれば一番いいのですが、量的に大変な場合、小区画に区切ってフーリエ変換します。 そうすると区画の継ぎ目でノイズが発生するので、それを防ぐために継ぎ目を滑らかにする必要があります。 そのために、各区画ごとに窓関数と呼ばれる関数を掛けます。 窓関数は多種ありますが、基本的には中央で1、両端で0に近い値を持ったなだらかな関数です。

araigoro
質問者

補足

SortaNerdさん、はじめまして。 お教え下さり、ありがとうございます。 例えば曲を一曲フーリエ変換する場合に、一曲をいくつかの小区画に区切ってフーリエ変換することを繰り返していけば良いが、その場合に各区画のつなぎ目でノイズが発生するのでそれを防ぐために窓関数を使うということですね。 すごくよく理解できました。 きっとこれぐらいのことはわかっていなければならないことなのだと思うのですが、私にとってはとても本を読んだだけでは理解できないことでした。 毎度、曲の例で恐縮なのですが、小区画でFFTを行ってそれに窓関数をかける、ということを繰り返せばよいということでしょうか。 とんちんかんなことを言っていたら申し訳ございません。

noname#252164
noname#252164
回答No.2

窓関数って出てきましたか? フーリエ変換で「ある瞬間」の周波数分布を出したいわけですよね。 かつある瞬間を繰り返し演算して「連続した周波数分布」がほしいわけですよね? そうしたら、出したい周波数分布の下限の周波数から、必要な標本点数が割り出せて、次の演算をするときには、標本の一部を捨てて、新しいデータを突っ込んでFFTすればいいので、サンプルの総時間が変わってもFFT演算器に入っているサンプル数は変化しないと思うのですが...。

araigoro
質問者

補足

takkey-Tさん、はじめまして。 ご回答、ありがとうございます。 勉強している中で窓関数も出てきたのですが、 それがいったいどのように役立つのかについては 理解ができませんでした。 お手数でなければ、窓関数の物理的意味と 例として曲を一曲FFTする際の窓関数の果たす役割 の二点について、解説をお願いすることは可能でしょうか。 きっとそれが先ほどご回答くださった下記の部分のお話に つながってくるのだと思うのですが、情けないことにまだ そこまで理解が追いついていないというのが正直なところです。 >そうしたら、出したい周波数分布の下限の周波数から、必要な標本点数が >割り出せて、次の演算をするときには、標本の一部を捨てて、新しい >データを突っ込んでFFTすればいいので、サンプルの総時間が変わって >もFFT演算器に入っているサンプル数は変化しないと思うのです >が...。

  • tance
  • ベストアンサー率57% (402/704)
回答No.1

そのとおりです。 13,230,000という処理数はすごく多いと思うかもしれませんが、あくまでも 一秒間に44100サンプルさえし続ければ5分後にはそれだけサンプルした ことになります。 動画のFFTなどでは桁近いにサンプル数が増えます。

araigoro
質問者

お礼

tanceさん、はじめまして。 ご回答、ありがとうございました。 まだ勉強を始めたばかりでわからないことが多いので とんちんかんなことを言っていたかもしれませんが、 快くお教えくださって感謝しております。 動画のFFTになると音楽とは桁違いの演算量になるのですね。 確かにFFT3回するわけなのでそうですね。 私など、音楽1320万回の時点でメモリ問題に直面しそうです。 Cでかいているのですが、すでにそんな気配です。。

araigoro
質問者

補足

tanceさん、はじめまして。 お教えいただいてありがとうございます。 >13,230,000という処理数はすごく多いと思うかもしれませんが、あくまでも >一秒間に44100サンプルさえし続ければ5分後にはそれだけサンプルした >ことになります。 でもかなりの計算量になりますね。。 1000万回を超える演算プログラムは未経験なのですが、メモリも大変なことになりそうな。。

関連するQ&A

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

    ある周波数解析ソフトで「フーリエ変換」釦があるのですが、サンプリング周波数を高くするほど、フーリエ変換値がずれてしまいます。 (例)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次」のみに表示されるのですが、「フーリエ変換」機能には、区間指定釦がありません。 詳しい説明書きはないのですが、通常そのような使い方となるものでしょうか?

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

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

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

    ある時間関数を離散フーリエ変換して得られるフーリエスペクトルの振幅値について教えて下さい。 今想定している離散フーリエ変換の式は一般的なもので Σ(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をかける理由を)教えて頂けないでしょうか。 当方、数学についてはあまり詳しくないため、簡単に説明して頂けると幸いです。

  • フーリエスペクトルの振幅について

    ある時間関数を離散フーリエ変換して得られるフーリエスペクトルの 振幅値について教えて下さい。 今想定している離散フーリエ変換の式は一般的なもので Σ(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をかける理由を)教えて頂けないでしょうか。

  • 離散フーリエ変換

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

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

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

  • 離散フーリエ変換

    今、離散フーリエ変換の値が求まっています。 これから、振幅の値を出すのは、どうしたらいいのでしょうか? 自分で調べたところ、離散フーリエ変換の値に標本化関数のフーリエ変換をかけて、サンプリングの間隔で割ればいいのでは、と考えているのですが、標本化関数というものがよくわかりません。このやり方で良いのかもわかりません。 アドバイスお願いします。

  • アナログ信号とフーリエ変換

    デジタル信号の周波数分析として離散フーリエ変換があります。そして、アナログ信号の周波数分析としてフーリエ変換と考えていました。またアナログ信号を離散フーリエ変換で考える方法もあり、アナログ信号をサンプリングすることで離散フーリエ変換で考えることが出来ると考えています。 ですが、「アナログ信号の周波数分析にフーリエ変換を使うと定義されている」という考え方は間違いであると言われました。 何が違うのか分かりません。よく分からないので詳しく教えてください。

  • フーリエ変換について

    画像をフーリエ変換後にフーリエスペクトルを得て、 高周波数とか低周波数というのは見て分かるのですが、 具体的な周波数の値は分からないのでしょうか。 断面を調べれば分かるのでしょうか。 お願いします。

  • 標本化における高調波とは?

    標本化の際に現れる高調波とは何でしょうか? ある任意の信号をサンプリングしてからフーリエ変換すると、 基本波と同じ形のものがサンプリング周波数の整数倍ごとに現れますよね? 高調波の正体も、 サンプリングした電圧を一度コンデンサに充電しそれを一気に放電する、 ということを繰り返すがために起きます。 ただここで疑問なのが、 サンプリング(充電)して後に放電するわけですが、 サンプリングした値って毎回変わるものではないのでしょうか? それなのに高調波の振幅は基本派と同じと言うのはなぜなのでしょうか? 充電された値が違うのに放電されるのは同じと言うのはなぜですか? もしかしたら根本から間違っているかもしれませんが教えてください。