アプリ版:「スタンプのみでお礼する」機能のリリースについて

メーカ勤務の会社員です。
フーリエ変換後の振幅スペクトル算出に負の周波数成分を加える方法について有識者の方々にご助言いただきたく、宜しくお願いいたします。

<質問の経緯>
時間軸のある信号f(t)の周波数成分を知りたい場合、f(t)を単純にフーリエ変換すると、正と負の周波数成分に分かれてしまい、片側の振幅スペクトルだけでは値が小さくなり、人に説明し辛い為。

例えば、
f(t)=A・cos(2πf0t)(A:一定の振幅、f0:一定の周波数)とした場合、「f(t)の周波数成分は周波数f0の振幅Aだけです」と説明したいところですが、実際にフーリエ変換するとF(f)=A/2(δ(f-f0)+δ(f+f0)) になり、振幅スペクトルが-f0でA/2、f0でA/2 と正負の周波数に分かれてしまい、f0の振幅スペクトルがAとお話できません・・・。

上記解決の為、
負の周波数成分を正の周波数成分と合せる方法や、フーリエ級数の式からフーリエ変換の式を導出する際に周波数を-∞〜∞ではなく0〜∞にする方法・・・等々を模索中なのですがよく分からず、また既存の理論も見付からず、悩んでいます。(信号の周波数成分に対する振幅スペクトルの把握は意外と身近な話なだけに、分かれば助かる人は多いと思っています)

質問者からの補足コメント

  • 解決策は「フーリエ変換は通常どおり行った後、正負の周波数-fとfの実部と虚部をそれぞれ加算し、そこから振幅スペクトル√((実部)^2+(虚部)^2) を求める」ではないかと思っています。A・sin(2πf0t)やA・cos(2πf0t)ならそれで解決できそうですので。
    熟考は無論大切だと思いますが、こんな常用的な話の答えが何故見付からないのか?ということも疑問に思います・・・。

      補足日時:2022/09/03 15:39

A 回答 (4件)

>  ある信号データから 1024点サンプリングして離散フーリエ変換を実行する


> と、原点を中心に1024個の振幅データ|ck|が得られるが、k番目と-k番目の
> |ck|はまったく同じである。

 これ、ちょっと不正確だった(笑)。
 離散フーリエ変換は

  Ck = (1/N)∑[m=0→N-1] F[m]e^(-jkmωD) (k = 0, 1, 2, …… , N-1)

のように表すので、離散フーリエ変換の周波数領域に負の領域はない。複素フーリエ級数の負の領域を、離散フーリエ変換では正の数で表す。詳細は信号処理の本を参照されたい。
 1024 点サンプリングして離散フーリエ変換を実行すると、0 番目の C[0] にいわゆる直流成分(複素フーリエ級数では原点のデータ)が来て、以下
  C[1] = C[1023]
  C[2] = C[1022]
  C[3] = C[1021]
……
  C[510] = C[514]
  C[511] = C[513]
  C[512]
の合計512個の周波数成分が得られる。
    • good
    • 0
この回答へのお礼

貴重なコメントをありがとうございます。

離散フーリエ変換は未だ未だ理解が浅いですが、
今後の理解に役立てようと思っています。

色々コメント頂き、ありがとうございました。

お礼日時:2022/09/07 07:53

[1] 実数上で定義されたどんな関数p(x)も、偶関数g(x)と奇関数h(x)の和に分解できます。

実際、
  g(x) = (p(x) + p(-x))/2
  h(x) = (p(x) - p(-x))/2
によって
  p(x) = g(x) + h(x)
  g(x) = g(-x)
  h(x) = -h(-x)
となるからです。
 p(x)が複素数値関数の場合、その実部をr(x)、虚部をs(x)と書くことにします:
  p(x) = r(x) + i s(x)
すると、r(x)も偶関数rg(x)と奇関数rh(x)の和に分解でき、s(x)も偶関数sg(x)と奇関数sh(x)の和に分解できるから
  p(x) = (rg(x) + rh(x)) + i (sg(x) + sh(x))
(rg, rh, sg, shはどれも実数値関数であることに注意。)

[2] Fourier変換は分野によって「どこに定数係数を入れるか」について流儀が違いますが、この場で式を書くためにはどうするかを決めておかないと不便かな。「周波数f」とお書きであるところを見ると、電気工学系でよく使われる
  P(f) = ∫{-∞~∞} p(t) exp(-2iπ f t) dt
なのかな、と思います。ま、どんな流儀でも本質は全く同じです。expは指数関数です。
  exp(i θ) = cosθ + i sinθ
は当然ご承知とします。

[3] 偶関数・奇関数とFourier変換とを組み合わせますと、
  実数値偶関数 rg(t) のFourier変換は実数値偶関数
  実数値奇関数 rh(t) のFourier変換は純虚数値奇関数
  純虚数値偶関数 i sg(t) のFourier変換は純虚数値奇関数
  純虚数値奇関数 i sh(t) のFourier変換は実数値偶関数
であるということは、上記の式に代入してちょっと整理すればすぐわかります。たとえば p(t) = i sh(t) の場合、sh(t) = -sh(-t)を使って
  P(t) = ∫{-∞~∞} i sh(t) exp(-2iπ f t) dt
  = i( ∫{0~∞} sh(t) exp(-2iπ f t) dt + ∫{-∞~0} sh(t) exp(-2iπ f t) dt)
  = i( ∫{0~∞} sh(t) exp(-2iπ f t) dt - ∫{∞~0} sh(-t) exp(2iπ f t) dt)
  = i( ∫{0~∞} sh(t) exp(-2iπ f t) dt + ∫{∞~0} sh(t) exp(2iπ f t) dt)
  = i( ∫{0~∞} sh(t) exp(-2iπ f t) dt - ∫{0~∞} sh(t) exp(2iπ f t) dt)
  = i∫{0~∞} sh(t) (exp(-2iπ f t) - exp(2iπ f t))) dt
  = 2i ∫{0~∞} sh(t) (-i sin(2 π f t))dt
  = 2 ∫{0~∞} sh(t) sin(2 π f t)dt
だからP(t)は実数だし、P(f) = -P(-f)であって、P(t)が実数値奇関数だとわかります。最後の式はFourier sine変換の形になっていることにご注意。Fourier変換はFourier sine変換とFourier cosine変換をまとめてやっているんですね。

> -∞~∞ではなく0~∞にする方法

 以上でもうお分かりかと思いますが、これはFourier変換をFourier sine変換、Fourier cosine変換の和に書き換える、ということに他なりません。
(大抵の場合、やみくもにそんなことやっても、却って見通しが悪くなるだけ。むしろ0~∞だというものを-∞~∞に拡張するために使うことの方が多いのですが。)

[4] ご質問の場合:
> F(f)=A/2(δ(f-f0)+δ(f+f0))

とお書きなのは、おそらく
  F(f)=(A/2)(δ(f-f0)+δ(f+f0))
という意味でしょうかね。これは 実数値偶関数
  p(t) = A cos(2πf0 t)
をFourier変換した結果でしょう。
  A cos(2πf0 t) =(A/2)( (cos(2πf0 t) + i sin(2πf0 t)) + (cos(2πf0 t) - i sin(2πf0 t)) )
  =(A/2)( exp( 2iπf0 t)) + exp( -2iπ f0 t))
なので、複素Fourier変換でδ(f-f0) と δ(f+f0)の和に化けた。言い換えれば、δ(f-f0) とδ(f+f0)がcosineの振幅の半分ずつを担っている。なので両者の和がその成分全体に当たるわけです。

これが仮に
  p(t) = A cos(2πf0 t) + B sin(2πf0 t)
だったとしますと、p(t)の振幅はご承知の通り√(A^2 + B^2) である。なお、この「振幅」というのは、実数値関数について、位相を無視し(つまりcosine も sineも区別せず)、また正負の符号も区別しないということですね。
 さて、cosineは偶関数、sineは奇関数ですから、
  P(f) = R(f) + i S(f)
  R(f) = (A/2)(δ(f-f0)+δ(f+f0))
  S(f) = (B/2)(δ(f-f0) - δ(f+f0))
この場合、cosineは上記と同じことだけれども、sineについては(δ(f-f0) とδ(f+f0)が振幅の半分ずつを担っているのではなくて、)δ(f-f0) と- δ(f+f0)が振幅の半分ずつを担っている。結局、振幅は |P(f) + P*(f)| だということです。[3]の話と突き合わせて考えてみてください。
    • good
    • 0
この回答へのお礼

貴重なコメントの数々ありがとうございます。

コメント頂いてから2日考えていて、
●複素フーリエ変換からフーリエ変換へ代わる時に係数の虚数成分が正負逆になのを見落としていたことに気付いたり、
●奇関数と遇関数とフーリエ変換との関係が計算の過程で明確になったり、
●共役複素数の話とフーリエ変換の振幅スペクトルの話が繋がったり、
・・・等々、お話を全て受け取れていないまでも色々と気付くことができました。

>結局、振幅は |P(f) + P*(f)| だということです

フーリエ変換して正の周波数毎の振幅スペクトルを算出する時、単純に2倍すれば正常な周波数成分の振幅になる理由と理解しました。

フーリエ変換以前に周波数軸の値を突き付けられ、分析を求められる工学系の人達には大変貴重な内容だと思いました。(工学系には相対値の分析だけでは済まされないのです・・・)

色々とありがとうございました。

お礼日時:2022/09/07 07:48

うーんと。

質問の意図をこちらが勘違いしているかもしれないので、以下はさらりと読んでほしい(笑)。

 実際に PC などである信号の周波数成分を計算してチェックしたいというのなら、それはフーリエ変換ではなくて、離散フーリエ変換の出番である。離散フーリエ変換は実質的には複素フーリエ級数展開の離散化版だから、複素フーリエ級数展開の性格をほぼそのまま引き継いでいる。

 実フーリエ級数
 x(t) = a0/2 + ∑[k=1→∞] ( ak*cos(kωt) + bk*sin(kωt) )
のk番の振幅の大きさは
  √( (ak)^2+(bk)^2 )
 当然これは複素フーリエ級数(離散フーリエ変換)でも成り立たねばならない。

 複素フーリエ級数
  x(t) = ∑[k=-∞→∞]Ck*e^(jkωt)
の ck と 実フーリエ級数の ak、bk との関係式は
  ck = (ak-jbk)/2
であることはどんな本にも載っている。したがって
  |ck| = √( (ak)^2+(bk)^2 )/2
  ∴√( (ak)^2+(bk)^2 ) = 2|ck|
となる。つまり、複素フーリエ級数展開で得られたk番の周波数の振幅の大きさは、|ck|を2倍する必要がある。

 ある信号データから 1024点サンプリングして離散フーリエ変換を実行すると、原点を中心に1024個の振幅データ|ck|が得られるが、k番目と-k番目の|ck|はまったく同じである。つまり、1024点サンプリングしても得られる周波数成分は512個である。だから元の信号がどんな周波数に分解されたかをチェックするだけならマイナス領域の|ck|は不要である。しかし、k番目の周波数の大きさをきちんと計算したいのなら、-k番目の|ck|を上乗せしなければならない。これが
  √( (ak)^2+(bk)^2 ) = 2|ck|
となる理由である。
    • good
    • 0
この回答へのお礼

貴重なご意見ありがとうございます。
ご意見を読んだ後、フーリエ級数の式から複素フーリエ級数の式へ変化する過程を追ってみると、フーリエ級数の式にオイラーの式を代入する時点で「-n」が生まれてそれが「負の周波数の元」になり、但し「n」「-n」の項の係数はどちらも同じan/2、bn/2になることに気付きました。(※)

(※)煩雑ですがフーリエ級数にオイラーを入れただけの
  n=1〜∞の項だけ示すと、
  
 an/2・(e^(j・n・2πf・t)+e^(j・-n・2πf・t))
 +bn/2・(e^(j・n・2πf・t)ーe^(j・-n・2πf・t))
(★「n」「-n」どちらの係数an/2、bn/2も同じ値、
 ★且つ1/2ずつになっている)

この式から判断すれば、純粋に正負の周波数に1/2ずつ振幅スペクトルが分かれた・・・つまり、「周波数0以外の周波数成分の振幅スペクトルは単純に2倍すれば良い」と言えそうです。

やや乱暴な結論かも知れませんが、振幅スペクトルが減少してしまう理由について、腑に落ちた理解ができた気がしています。
ありがとうございました。

お礼日時:2022/09/04 06:31

フーリエ変換は複素数で表現することが前提なので、フーリエ変換の前に実フーリエ級数展開から複素フーリエ級数展開を導出する過程(とくに振幅スペクトルの表現方法)を本でじっくり学べばいい。

最初は数学者の書いたフーリエ解析の本を辞書代わりにしながら、工学者の書いた信号処理の本とじっくり取り組む方がいいと思う。
「フーリエ変換後の負の周波数成分の扱いにつ」の回答画像1
    • good
    • 0
この回答へのお礼

ご回答と貴重な図をありがとうございます。
確かに複素フーリエ級数の時点で負の周波数は生まれ振幅スペクトルは減少しますね。(フーリエ変換の結果ばかりに気を取られていました)
既存の答えはある気もしますが、もう少し熟考してみます。
ありがとうございました。

お礼日時:2022/09/03 12:10

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A