バタフライ演算を用いた音の空気減衰の畳み込みについて

このQ&Aのポイント
  • バタフライ演算によるFFTおよびIFFTのプログラムを用いて、音の空気減衰の理論式を畳み込みたいと考えています。
  • FFTで原信号を周波数領域に変換し、減衰量をパーセンテージに変換して、理論式を乗算する手法を試していますが、うまくいきません。
  • 虚数の値が0ではない数になる原因は、FFTによって得られた値のサンプリング周波数と、理論式の周波数軸が一致していないためと考えられます。具体的な解決方法は不明です。
回答を見る
  • ベストアンサー

バタフライ演算を用いたフィルタ(数式)の畳み込みについて

現在、バタフライ演算によるFFTおよびIFFTのプログラムを用いて、 音の空気減衰の理論式を畳み込みたいと考えています。 理論式は横軸が周波数、縦軸が音圧レベルの減衰量のグラフで表されるもので、周波数の関数になっています。 そこで、FFTで原信号を周波数領域に変換し、この理論式を適用してIFFTしたらどうかと考え、減衰量をパーセンテージ(減衰量が6dBなら50%)に変換して、FFT結果の各値に周波数ごとの減衰量を乗算する、等を行っているのですがうまくいきません。 IFFTを行うと、虚数の値が0ではない数になってしまっています。 おそらく、FFTにより得られた値のサンプリング周波数と、減衰の理論式の周波数軸が一致していないためと考えられますが、具体的な手法が分かりません。 なお、入力している原信号のサンプリング周波数は44100Hzです。 どうかよろしくお願いいたします。

  • 科学
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

>IFFTを行うと、虚数の値が0ではない数になってしまっています。 もっとも考えられる原因は、全ての周波数範囲にわたって演算してしまっているということでしょうか。サンプリング周期がT0のとき、ナイキスト周波数1/(2T0) より上のデータは演算してはいけません。 正確に言うと、実数列をFFTすると、ナイキスト周波数(1/2T0)より低い周波数の成分と、ナイキスト周波数以上の成分は、ちょうど真ん中で折り返した形で複素共役になります。 で、 >周波数ごとの減衰量を乗算する、 という処理をしたいのであれば、ナイキスト周波数(1/2T0)以下の部分についてのみ行って、それ以上は、折り返して複素共役になるようにします。そうしておけば、IFFTしても実数列が得られるはずです。 ただ、 >理論式は横軸が周波数、縦軸が音圧レベルの減衰量のグラフで表されるもので、周波数の関数になっています。 とのことですが、群遅延(位相)は周波数にかかわらず一定ということでしょうか。そうでないならば、ゲインだけ合わせても、時間波形としては実際と合わないことになってしまいます。(ある程度の傾向くらいはつかめるかもしれませんが) http://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B の「実数列のDFT」ってところなどを参照

sityoukaku
質問者

お礼

>全ての周波数範囲にわたって演算してしまっているということでしょうか。 周波数を折り返して演算してみたところ、 虚数項がうまく0になり、出力信号も期待されるものが得られました。 的確なアドバイス、ありがとうございました!

関連するQ&A

  • FFT/スペクトルに関して

    エクセルにてFFTを勉強しているのですが、FFT後に出てくる縦軸のスペクトルとは何でしょうか? 時間軸×音圧 ⇒ 周波数×音圧に変換したんですが、この縦軸は音圧ではなくスペクトルというものだと理解しています。このスペクトルが示すものは単にその周波数の成分が強い傾向にあるというのを示しているだけで、その周波数の音圧がいくらというのを示しているのではないのでしょうか? 現在、訳あってその周波数の絶対量を使用したいのですが、その数字に意味はないのか教えてください。

  • MATLABによるFFTと位相スペクトルについて

    純粋な正弦波信号 y=sin2πft ただし周波数f=500MHz をサンプリング周波数2.5GHz,サンプリング数128,256,512,1024の四パターンMATLABでFFTし、パワースペクトルと位相スペクトルを求めました。 結果、パワースペクトルは予想通り500MHzでピーク値をとったのですが、位相スペクトルは各サンプリング数ごとに全く違う値を取りました。 というわけで、 (1)理論上、正弦波の位相スペクトルはどのような値になるのか (2)なぜサンプリング数ごとに位相スペクトルの結果が大きく変わったのか この二点をご教授ください。よろしくおねがいします。

  • デジタルフィルタのフィルタ設計

    デジタルフィルタを設計するとき、乗算することでカットオフ周波数が制御できるのですが、最初に指定した、カットオフ周波数と測定結果のカットオフ周波数が違うのですが、何が原因かわかりません。 例えばカットオフ周波数100Hzで、サンプリング周波数が1kHzで、 計算方法が、Ωc=fc/fs h0=2Ωc hk=2Ωc*(sin2πkΩc)/2πkΩc で信号に乗算してカットオフ周波数が調節できます。測定結果が、カットオフ周波数が80Hzとかになるんですけど、どうしてでしょうか?

  • 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を使って実現しようとしているのですが、うまくいきません。 現時点で作った方法では、 (1)FFTする。結果は配列x_re[NFFT]、x_im[NFFT]に格納。(x_re:実数部 x_im:虚数部 NFFT:ポイント数、配列の内容としては周波数の低い順に結果データが並んでいる) (2) x_re,x_imの内容をずらす。(例えば以下のように配列内容を1つずらせばIFFTをした時周波数が高くなるはず) for(i=0;i<NFFT-1;i++){ x_re[i+1]=x_re[i]; x_im[i+1]=x_im[i]; } (3)配列x_re[NFFT]、x_im[NFFT]に対しIFFTする。 FFT・IFFTが正しく動作するのは確認しています。 (動作実績も結構あります。(2)を省略し(1)(3)だけとすれば出力結果は入力結果と同じ(出力音声を聴いた感じで)になるので、正しく動作していると思います。) よって(2)が間違っていると思います。 (2)をどのようにすれば周波数変換できるのか教えてください。また今の所FFTを使おうとしているのですが、別に入力信号を周波数変換できればOK(周波数を上げたり下げたりしたい)なので、その方法があれば教えてください(><)

  • 畳み込み

    質問です。信号a(t)がb(t)(200Hz)とc(t)(500Hz)の畳み込みで表わされる場合のサンプリング周波数はどのようになるのでしょうか?

  • AD変換について教えてください。

    最高周波数成分が100Hzである生体信号をAD変換するのに、理論上使うことができるサンプリング周波数の下限はどれか? (1)10 (2)50 (3)100 (4)200 (5)500 宜しくお願いします。

  • RCフィルタについて

    ローパスフィルタはなぜ、遮断周波数以下の周波数の信号だけを通過させ,遮断周波数以上の周波数の信号を減衰させるのですか? 教えてくださいよろしくお願いします。

  • C言語FFTからのパワースペクトル表示の質問

    手元にはC言語で作成したFFT/IFFTの処理を行うプログラムがあります。FFT,IFFTともに1次元です。 それを使って、図の信号をフーリエ変換し、パワースペクトルを図示できません。 どうすればいいでしょうか? できたら、結果も含めて教えてください。 詳細は画像を張ります。

  • 周波数帯域のある信号をFFTに掛ける場合、処理結果はどうなるのでしょう

    周波数帯域のある信号をFFTに掛ける場合、処理結果はどうなるのでしょうか? 私は周波数帯域が100~10,000HZのマイクを使い録音し、そのデータを取り出し、 自作したプログラムを用いて、サンプリング周波数32768HzでFFTを掛けて、 信号の周波数特性を調べています。 ただ、FFTの処理結果によると、周波数帯域外の100HZ以下の領域に、周波数帯域内 と比べて大きな特徴が見られました。 そこで質問なのですが、この場合、自作したプログラムにミスがあるのか、 周波数帯域外の信号を録音してしまっているのか、それとも両方なのか、 それ以外にも理由があるのか、その辺りについて教えて頂ければと思います。 周波数解析の分野の理解が浅いため、酷く初歩的な質問であるかもしれませんが、 どうかよろしくお願いします。