プロが教える店舗&オフィスのセキュリティ対策術

フーリエ変換、FFT演算についてに教えてください。
フーリエ変換とは、不規則な波形を種類の違う周波数の正弦波に分解する変換と思います。

このフーリエ変換をFFT演算する方法について知りたいのですが、
よく、FFT演算命令で16ポイント、64ポイント、128ポイントなどあります。

例えば、16ポイントならば一度に16数値(上記不規則な波形の部分)を入れ込み一度に計算を
行うことになりますが、種類の違う周波数の正弦波ごとに波形でいく振幅が出されるのでしょうか?
FFT演算命令でどういった命令を入れ、どういった数値が結果出されるのかご教授願います。
そもそも、16個の数値を入れ各種周波数の正弦波ごとの振幅がだされるのであれば、
データ量は入力以上に増えるのでしょうか?

A 回答 (5件)

AN03です。



・サンプリングレートが入力の帯域の倍以上でなければいけない。
・出力のサンプリングレートの半分以上の周波数は使えないので、
結局FFTの出力の上半分は捨てないといけない。

DFTの常識ではありますが、ー応付け加えておきます。
    • good
    • 0

No.1のものですが、



FFT(DFT)した場合、データ点数は増えません。

解析したいデータが時系列にサンプリングされ以下のように並んでいるとします。

11.0、15.2、20.6、-18.0

つまり4点ですね。

これをFFTにかけますと、4つのデータが手に入ります。

しかし、この一つのデータは複素数です。実数部分と虚数部分で一つのデータになります。



解析したいデータは何かのアナログ信号をサンプリングしたもののはずです。

音声データならば、サンプリング周波数を指定しているはずです。

例えば、44.1KHzサンプリングならば、1秒間の録音により44100個のデジタル

データが取得できているはずです。

16ビットサンプリングならば、2バイトx44100=88200バイトです。

1分も録音すればかなり大きなファイルになるでしょう。

Wavファイルなどは、ヘッダ情報のあとに、このデータがそのまま記録されています。

FFTをかけるとき、FFTのサイズを指定するはずです。

FFTをかけてもデータ点数は変わりません。

ですので膨大なサンプリングデータのうち、FFTにかけられる部分は、ほんの一部です。

データ全体をFFTにかける場合は、データ点数分のFFTになります。

データが100万個あれば、100万点FFTとなるわけです。


次に変換後のデータについてです。

変換されたデータは、各周波数の振幅を現します。

100万個のデータをFFTにかけると、サンプリング周波数を100万刻みにして、

それぞれの周波数の振幅を調べられます。



FFTの場合は、変換されたデータが数列となって順に並びます。

データの最初は0Hzとなります。

データの最後のほうは、もとのデータのサンプリング周波数になります。

つまり、もとのデータのサンプリング周波数によるということです。

100万個のデータを使った場合は、100万分の1xサンプリング周波数刻みで増えていきます。

例えば、先頭から10番目のデータは、100万分の1xサンプリング周波数x10番目となります。

一番最後のデータの次が0Hzに戻るので、0Hzとサンプリング周波数は同じ値となります。


例えば、44.1KhzでサンプリングされたWavファイルから、1024点の任意のデータを選びFFT

をかけたとします。

その場合は1024個の周波数情報が手に入ります。

データの真ん中くらい500番目くらいは、

44100x500÷1024=21533Hz

です。

逆に、4KHzの振幅を調べたい場合は、

1024*4000/44100=92.8=93番目くらいを見ればよいとなります。


ここでお気づきだと思いますが、

サンプリング周波数が高い場合は、1024点程度のFFTでは元のデータのほんの一部しか解析

できません。

例えば、

44.1KHzで1024点と言うのは、0.023秒の期間です。

この刹那と呼べる瞬間の周波数を解析しても、意味があるのかわかりません。

そのため、

音楽のDTMなどでつかうMIX用のソフトでは、FFTをかける範囲を指定させます。

ユーザーが感覚的に「この範囲について調べたい」と指定できるわけです。

ソフト側は、ユーザーが指定した部分に対して、データ点数を調べます。

長い時間範囲を指定すれば、それだけ解析するデータが増えます。

ソフト側は、これを調べた後、FFTにかけるわけです。

このときに、データ点数が2の指数倍数になるように整えます。

100個のデータであったならば、28個の0値を後ろにつけて、128個にします。(2の7乗)

1000個のデータであったならば、24個の0値を後ろにつけて、1024個にするわけです。(2の10乗)

後ろに0値をつけても、周波数上では大きく変化がありません。

出力される周波数解析データは、128FFTの場合は128個です。

サンプリング周波数を128等分し、等間隔で刻んだ周波数成分について出力されます。

ですので、沢山のデータを指定すると細かく周波数を分解できます。


ところが、音声ファイルなどは、

一定の音が成っているのではなく、時間により音源が変化したり、増減したりしております。

なので、

データ全体をFFTで解析しても、ぼんやりとした全体像がつかめるだけで余り意味は無いです。

ですので耳で聞いたりしながら、

「ここの1秒くらいについて、どうなっているか知りたい」

と思って解析します。

私は、ミックスボイスといわれる声について調べるときにつかいました。

「あ、ここミックスボイスだな。この2秒をFFTしよう。」

見たいな感じです。



ご質問にお答えできているかわかりませんが、

まず、どうしてFFTに興味を持ったのか経緯などを教えていただければ、

それに添った形でお答えできるかと思います。


デジタルデータの加工には基礎的な知識が必要になります。

そのため、ソフトがサポートしているエフェクト処理以外をご自身でやろうとしますと、

高度な専門的知識が必要になります。


以上
    • good
    • 0
この回答へのお礼

今回も丁寧なご回答を頂きありがとうございました。
今回仕事で音声データの取得と解析する基板開発をすることになりおといいあわせさせていただきました。

現在の検討は膨大な音声データを512点などでFFT演算するのですが、
今回のお問い合わせよりサンプリングレートが高いため必要な期間繰り返し演算必要と考えました。

お礼日時:2015/09/23 10:52

まずDFTとFFTは分けて考えた方がよいと思いますよ。


FFTは計算の高速化の手法であって、出てくるものはDFTと同じ。

フーリエ変換とDFTの違いは、DFTはフーリエ変換の前に
信号をインパルス列との掛け算で前処理したものと考えれば
簡単です。

このあたりはDFTの教科書に詳しくのってます。
    • good
    • 0

あなたはフーリエ変換について全く分かって居ない、大学生なら「フーリエ変換演習」という類いの演習本を読みなさい。

    • good
    • 2

①正弦派毎の振幅が出されます。

(はずです)

 周波数幅は、サンプリング周波数のFFTデータ点数分の1が単位。
 最初のデータは0Hz=直流バイアス。
 次のデータは上記単位x1、以降この倍数です。
 100KHzでサンプリングしたデータを8点FFTをかけますと、
 変換後の各データは順に、0Hz、12.5KHz、25KHz・・
 87.5KHzとなります。(100KHz=0Hz)
 振幅は、元のソース中でその周波数が寄与している比率になります。
 変換後のデータは虚数を含むものになります。
 そのため実数分と虚数部分の比率によって角度が生じます。
 位相と呼ばれています。
 大きさだけを見たい場合は、これらの二乗和をとり、平方根
 によりエネルギーとして加工します。
 大概のFFTソフトはそこまでしてグラフ表示するはずです。
 また、正規化していない場合は、変換対象のエネルギーが反映
 されます。FFT変換したデータも比例して数値が大きくなります。
 大概のFFTソフトは正規化を行い、比率だけをだしている
 と思います。db表示を採用している場合もあります。

②16個いれれば16個のFFTデータが手に入ります。
 演算命令と言うのはありません。
 何かソフトまたは製品に特化されたコマンドでしょう。
 その場合はパラメータ仕様があるはずです。
 それらのパラメータ名から、FFT論理で使用する調整幅と
 して読み取り、値を入れるのが良いかと思います。
 ①で書いていますが、分析できる周波数は離散になります。
 最大周波数はサンプリング周波数で確定してしまいます。
 その間を細かく見たい場合は、FFTデータ点数を増やします。
 周波数領域ですらサンプリングされているわけです。
 もとのデータの性質は変わりません。
 なのでFFT点数が少なければ、荒く大雑把にわかる。
 多ければ細かく周波数を分解できる。というわけです。


読み物として解説文を書きます。

フーリエ変換に限らず、変換が多数存在します。

特にフーリエ変換は、対象となる元の信号

(関数の出力、または関数そのもの、またはデータ)

が連続して無限に続くものとしています。

例えば私たちが観測している信号があったとします。

この観測しているものが複雑に見えて意味が無いように感じることがあります。

ところがしばらく見ていると、

「あれ、この形はさっきみたぞ?」

と思うことがありませんか?

(というか有るんじゃないかと考えて見ましょう)

「まったく、適当に意味が無い物と思っていたが、

 だまされた。

 どんな規則があるんだ。気になる。」

と考えた人がいたとします。

人が観察して不規則に感じても、規則性があるってことですね。

フーリエ変換などの解析学はこうした用途で用いられます。

私たちが科学と呼ぶものの真髄でして、人が直感的に捉えられないものを

明らかにして利用するわけです。

人が認知できるものには限界があります。

何かの上達を目指したときは、

「上手くいったとき」

を何度も繰り返してコツを得ます。

この飲み込みが早い人を才があると言って賞賛します。

しかし、一回も上手くいかない人にとっては酷ですよね。

更に言うならば、人が不思議に思う現象は解明できません。

そこには法則があるわけですが、人の感覚では捉えられないからです。

そこで、こう思ったわけです。

「一見して意味が無い、価値を感じない、不規則に見えるものは、

 実は規則を含んでいて、これをコツとして利用できた人が天才とか

 言われてるんじゃないか?

 そうだとしてら、これを明らかにするための汎用的な方法を

 編み出してしまえばいい。

 人類は大きく進歩する。」

科学が魔法の領域に達するきっかけとなった学問です。

フーリエだけではなく、シャノンと言う数学者がさらに色々とやってます。

シャノンの成果は、コンピュータ、デジタル音声・映像など、

蒸気機関以後の全ての弱電気系世界をたった一人で生み出しています。

20世紀最大の天才ですね。


さて、デジタル信号処理と言う世界があります。

無限信号をサンプリングして、元の情報を失わないようにとっておけないか?

保存したデータから一定の情報を再現できないか?

という分野です。

フーリエ変換は元の無限信号を無限積分します。

そのため実際には利用できません。

そこで、無限信号の一部を切り取り、そこを保存したり再現したりする必要

があります。

ところが、データを切り取ると、切り取りの両端が不連続になります。

見た目切り取った部分は元と一致するので大丈夫だろうと思いがちです。

ところが元に戻してみると、がっかりするくらい誤差がでます。

ギブスノイズと言うエラーです。

初音ミクなどのソフトでも、ザラザラしたノイズがのることをご存知の方が

いると思います。

音声を切り取ってつなげてみても、ギブスと言うノイズの存在を想定しないと

聞き苦しいものになるんですよね。

デジタル信号処理は、こうした部分を数学的に解明して、

どの様にするとやりたいことに近づくのか?

と手順を検討しています。

先ほどのギブス対策は、窓関数というのを事前処理することで避けられます。

また、サンプリングするためには、サンプリングレート(保障最大周波数

の2倍の周波数)でサンプリングします。

これに対しても、事前処理として保障最大数より高い周波数をカットします。

ここでローパスフィルター(低域通過フィルター)が大事に成ります。

DTMといわれる音楽のデジタルミックスの世界は、

すべてこのデジタル信号処理の基本によって作られています。


FFTと言う言葉が一般に普及したのは、このジャンルが貢献していると思います。

(音楽や映像など以外では、他に地震波形の分析などにも使われていたそうです。)

この様な話をしたのは、FFTがプロ用(学者向け)のものであり、

数学的(もしくはデジタル信号処理的な)ノウハウを持つことを前提としてると

説明したかったんです。

本来のフーリエ変換を変えてしまったわけです。

この影響は細心の注意を払って除外しないといけません。

・元の信号を切り取る場合は、窓関数を使用していないといけない。
・元の信号をサンプリングする場合は、ローパスフィルタで帯域カットをする。

このように一般に知られている、サンプリング定理とは別のノウハウが登場します。

さらに、サンプリングされたデータをフーリエ変換するためにはどうするのか?

切り取ったために不連続な信号になっていますから、フーリエ変換できないんですよ。

またサンプリングしていますから、連続では有りません。

そこでこう考えています。

「今私がサンプリングしたデータは、周期信号(実際は違いますが)です。

 更に無限の倍周波数をもつため、データは離散なんですよ。

 元の周期信号の繰り返している部分のみを解析することにしたんです。

 勿論、無限の倍周波数部分も繰り返し(数学的にそうなる)になります。

 ですので、全部を見なくても、繰り返されている部分だけ見れば良いです。」

こうして、自分が見ているものが実際の信号ソースの擬似的な別のソースと

するわけです。

擬似化してでも解析して見てみたいとしたわけですから、

見た内容がそのまま正しいわけではありません。

この影響を知ってはじめて、利用できるわけです。

この擬似的なフーリエ変換を離散フーリエ変換。DFTと呼びます。

これが扱いやすいのは、元のサンプリングデータ数を処理するだけで、

元のサンプリング数と同数の周波数解析データが手に入ります。

この時点では2の倍数データでなくとも良いわけです。

数式も非常に簡単なので、C言語の初心者程度で30分も掛かりません。

行数で5行くらいでしょうか。

次にFFTですが、これは単なる高速演算方式にすぎません。

出力内容はDFTと全く同じです。

フーリエ変換の無限積分式では、マイナスと虚数を含む正弦波形の

繰り返しが暗示されています。

そのため、DFT処理をすると、実数部分と正数部部の符号が逆転

しているものが繰り返され、数値表示は似たモノが沢山出てきます。

有体に言うと、半分計算して、符号をかえたりするだけで、

本当に積分をしないでも良いって事になります。

さらにその半分を見てみると?

と言う具合に繰り返しのパターンを読みきって、

積分をつかわずに、一部の計算をしたら、それの符号変更を多用して

の頃にデータを作成するというのがFFT論理です。

この制約のため、データ処理点数は2の倍数である必要があります。

DFTには生じなかった、高速演算のための制約です。


FFTが発明された当時のコンピュータは非常に遅かったんですよ。

凄い評判になり、このFFTと言う演算が有名になりました。

FFT=フーリエ変換であるというくらいの誤解を生んでいます。

ところが、今のコンピュータはどのくらい早くなったんでしょう?

10万倍くらい早くなっていますよね。

つまり、FFTを使用する必要が本当にあるのか?

という疑問がわいてきます。

実際にFFTを使わずにDFTのプログラムを自分で作って処理しても、

まったく差がわかりません。



具体的な数値加工でご質問があればわかる範囲でお答えします。

以上、ご参考に成れば。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>具体的な数値加工でご質問があればわかる範囲でお答えします。
甘えて、追加質問をさせていただきます。(ご回答内容難しく90%レベルついていけていません)

>①正弦派毎の振幅が出されます。・・・

>100KHzでサンプリングしたデータを8点FFTをかけますと、
>  変換後の各データは順に、0Hz、12.5KHz、25KHz・・
> 87.5KHzとなります。(100KHz=0Hz)

 100KHzでサンプリングしたデータを8点・・・
 と 変換後の各データは順に、0Hz、12.5KHz、25KHz・・ と分けられる意味が分かりません。
 詳しく教えていただけないでしょうか?


>②16個いれれば16個のFFTデータが手に入ります。
>  演算命令と言うのはありません。・・・・

> ①で書いていますが、分析できる周波数は離散になります。
>  最大周波数はサンプリング周波数で確定してしまいます。
>  その間を細かく見たい場合は、FFTデータ点数を増やします。

 ここで出てくるサンプリング周波数と入力ポイント数は
 同一の意味でしょうか?

 サンプリング周波数と入力ポイント数それぞれ意味を教えてください。


繰り返し質問しますが、入力点数に対し出力結果は、入力より出力の
データは増えるのでしょうか?
それとも、サンプリング周波数次第ということでしょうか?

お手数かけますが、ご回答よろしくお願いいたします。

お礼日時:2015/09/22 23:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!