フーリエ級数でホワイトノイズを表現する

このQ&Aのポイント
  • フーリエ変換では時系列をcos, sinで分解してその係数を求めることになります。
  • ホワイトノイズは各周波数成分のパワーが均等になっているものです。
  • 乱数を使ってフーリエ級数を表現しようとしていますが、いくつかの点が疑問です。
回答を見る
  • ベストアンサー

フーリエ級数でホワイトノイズを表現する

フーリエ変換では例えば時系列をcos, sinで分解してその係数をa0,a1,a2...., b1,b2,......を求めることになると思います.cosの方の係数がa, sinの方の係数がbです.(このあたりは十分説明し切れていませんが,標準テキストの表現と同じなので知っている方にはおなじみのことです.) さて,質問ですが,ホワイトノイズは各周波数成分(n)のパワーが均等になっているものだと思います. すなわちan^2+bn^2=1 という関係が全部のnで成り立つということですね.ただし,an, bnの値はこれでは決まらないので(0,1)の乱数を発生させてanを決め,それに応じたbnを決めました.位相のランダム性ということですが.そしてそれをフーリエ級数の時系列を表現する式に代入してプログラムでホワイトノイズ波形を作成しようとしたのですが,おかしいのです.ここまでの考え方で何か間違っているでしょうか. 自分としては以下の点を疑っています. 1.an, bnは正負の符号はどうなっていたでしょうか.この考え方では両方共正の値となっています.乱数を発生させても正・負は決めることができません.平方根をとる時に正の値だけになってしまいます. 2.時系列を表現する式というのはフーリエ逆変換と同じですが,FFTなどの方式は使わず,単純に和を取りました.Σan cos(theta)+bn sin(theta) というような式で初項はa0/2としました.最終項もちょっと違いますが,普通のテキストに載っている式です.フーリエ成分の重ねあわせと時間方向の進行があるので2重ループとなりますが. 3.乱数の発生のさせ方がまずい.Fortranのサイトから持ってきたものです.時間で発生させるものとか整数を与えて発生させるものなどいろいろです. 以上です.発生させた波形がどうおかしいのか言っていませんが,最初の数項だけはこうなっています. 0 128.288 1 128.345 2 0.443 3 42.991 4 0.497 5 26.035 6 0.667 7 18.964 ホワイトノイズ波形などそもそも作れるのかなと思いますが.どうでしょうか.よろしくお願いします.

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

1 だけ: an^2 + bn^2 = 1 を満たす an, bn をランダムに求めるなら an = cos θn, bn = sin θn のようにして θn を 0 以上 2π 未満の一様乱数にするかなぁ....

skmsk1941093
質問者

お礼

なるほど.そうですよね.角度の方で決めると,sin, cosで4象限がそれに応じて決まるので正・負も含めた乱数となるわけですね. 間違いが発生するとしたら,sin, cosに角度(位相)を放り込む場合,[-Pi, Pi]で受け付けるか[0, 2Pi]で受け付けるかということですね. ありがとうございます.

関連するQ&A

  • フーリエ係数

    画像のような波形信号のフーリエ係数を求めるときは [0-π]の範囲ではf(t)=4sin(t)で、[π-2π]の範囲ではf(t)=0として計算すればよいのでしょうか? そうすると計算式は積分範囲は[0-π]で a0=(1/π)*∫4sin(t)dt, an=(1/π)*∫4sin(t)*cos(nt)dt, bn=(1/π)*∫4sin(t)*sin(nt)dt, となるのでしょうか? また、周期2πで、[-π,π]において、f(t)=π-|t|、で表わされる関数f(t)のフーリエ係数は a0=π, an=(2/n)*(cos(nπ)-sin(nπ)), bn=0, になったのですが(計算があってるかはわかりません) フーリエ級数を求めるには、この後どうすればいいのでしょうか? よろしくお願いします。

  • フーリエ係数の公式

    フーリエ級数の係数 an=(1/π)∫f(x)cos(nx)dx, bn=(1/π)∫f(x)sin(nx)dx 積分区間:0≦x≦2π の導き方を詳しく教えてください。 フーリエ展開の定義式の両辺にcos又はsin(mx)を掛け、両辺を積分するという所まではわかります。 そこから先を”詳しく”お願いします。

  • フーリエ級数の問題

    f(x)は周期2πをもつとする。 f(x)のフーリエ級数を求める。 (1)f(x)=x(-(π/2)<x<(π/2)),π-x((π/2)<x<(3π/2)),  この条件でフーリエ級数を求めると、  グラフを描くと奇関数になるので、a0=0,an=0, bn=(4/nの2乗π)sin(π/2)n したがってフーリエ級数は、 f(x)=(4/π){sinx-(1/9)sin3x+(1/25)sin5x-・・・} でいいのでしょうか? (2)f(x)=xの2乗(-(π/2)<x<(π/2)),π/4((π/2)<x<(3π/2)),  グラフを描くと、偶関数になったので、bn=0, a0=(πの2乗)/6, an=(2/π){(π/nの2乗)cos(π/2)n-(2/nの3乗)sin(π/2)n} よって、  f(x)=((πの2乗)/6)+(2/π){-2cosx-(π/4)cos2x+(2/27)          cos3x+・・・} これでいいのでしょうか?  ご回答よろしくお願いします。

  • フーリエ級数展開について

    フーリエ級数展開について フーリエ係数anやbnはどうして周期Tの半分で割る必要があるのですか? 理屈をわかりやすく教えてください。

  • フーリエ級数の求め方

    区間[-π,+π] f(t)=+E (-π<t<0) f(t)=-E (0<t<π) 以上の条件でn=,1,2,3までの展開式とn項目の係数an,bnの一般式の形を示す この問題で、bn=1/π∫f(t)sin nt dt =-2E/π[-cosnt/n] (n>=1) =2E/nπ(cosnπ-cos0) となったのですが、anと展開式の求め方が分かりません。どなたかとき方とできたら計算結果を教えてください。

  • 実フーリエ係数an,bnをC言語を使って求める問題について質問です。

    実フーリエ係数an,bnをC言語を使って求める問題について質問です。 自分の考え方のどこが違うのか指摘していただけたら幸いです。 係数を求める式は、 an = 1/π ∫[0..2π]f(x)cos(nx)dx ...1式 bn = 1/π ∫[0..2π]f(x)cos(nx)dx ...2式 まず、1式のanについて考えます。 扱うデータ数をN、データとデータの間隔をΔxとし、上のanの式を離散化すると、 an = 1/π シグマ[x=0..N-1]f(x)cos(n*2π*x/N)Δx ...3式 ここで、f(x)=cosx, N=4, Δx=π/2, f(0)=1,f(1)=0,f(2)=-1,f(3)=0 を与えると3式は以下のようになる。 an = (1/π)*(π/2) シグマ[x=0..3]f(x)cos(n*2π*x/4) = 1/2 シグマ[x=0..3]f(x)cos(n*π*x/2) ...4式 同様に bn = 1/2 シグマ[x=0..3]f(x)sin(n*π*x/2) ...5式 4,5式を用いて、実フーリエ係数an,bnを求めるプログラムを作成する。 (今回は表示はanのみとする) ----------------------------------------------------------------------------- #include <stdio.h> #include <math.h> #define PI 3.1414926434897//円周率 int main(){ int i,j; int num=4;//データ数 double an[4],bn[4];//フーリエ実係数an,bn double data[4]={1,0,-1,0};//扱うデータ //初期化 for(i=0; i<num;i++){ an[i]=0; bn[i]=0; } //フーリエ変換 for(i=0; i<num; i++){ for(j=0; j<num; j++){ an[i] += data[j]*cos((2*PI*i*j)/num); bn[i] += data[j]*sin((2*PI*i*j)/num); } an[i] /= 2; bn[i] /= 2; } //実フーリエ係数anを表示 for(i=0; i<num; i++){ printf("a[%d]%lf\n",i,an[i]); } return 0; } ----------------------------------------------------------------------------- 実行結果は、以下のようにanを表示します。 a[0]0.000000 a[1]1.000000 a[2]0.000000 a[3]1.000000 フーリエ級数の考え方から、ある関数F(x)は、 F(x) = a0/2 + シグマ[n=1~∞](ancos(nx) + bnsin(nx)) ...6式 のようにcosとsinの波の合成で表すことができます。 今回は関数f(x)=cosx(データ数4)に対してフーリエ変換を行ったため、cosxの成分だけが残る。 つまりn=1のときのA1が1となり、他の成分A0,A2,A3は0になると思うのですが、実行結果のa[3]の出力も1となってしまっています。 どこに原因があるのか分からなくて困っているのでアドバイスよろしくお願いします。

  • 実フーリエ係数an,bnをC言語を使って求める問題について質問です。

    実フーリエ係数an,bnをC言語を使って求める問題について質問です。 以前カテゴリを数学として同じ質問を致しました。 今回はプログラムの方面からアドバイスをいただけたらと思い、質問します。 実フーリエ係数を求める式は、 an = 1/π ∫[0..2π]f(x)cos(nx)dx ...1式 bn = 1/π ∫[0..2π]f(x)cos(nx)dx ...2式 扱うデータ数をN、データとデータの間隔をΔxとし、上の式を離散化すると、 an = 1/π シグマ[x=0..N-1]f(x)cos(n*2π*x/N)Δx ...3式 bn = 1/π シグマ[x=0..N-1]f(x)sin(n*2π*x/N)Δx ...4式 ここからは、3,4式を用いて、実フーリエ係数an,bnを求めるプログラムを作成。 f(x)=cosxをフーリエ変換する場合を考えます。 データ数N=4としたとき、Δx=π/2 ----------------------------------------------------------------------------- #include <stdio.h> #include <math.h> #define PI 3.1414926434897//円周率 int main(){ int i,j; int num=4;//データ数 double an[4],bn[4];//フーリエ実係数an,bn double data[4]={1,0,-1,0};//扱うデータ //初期化 for(i=0; i<num;i++){ an[i]=0; bn[i]=0; } //フーリエ変換 for(i=0; i<num; i++){ for(j=0; j<num; j++){ an[i] += data[j]*cos((2*PI*i*j)/num); bn[i] += data[j]*sin((2*PI*i*j)/num); } an[i] /= 2; bn[i] /= 2; } //実フーリエ係数anを表示 for(i=0; i<num; i++){ printf("a[%d]%lf\n",i,an[i]); } return 0; } ----------------------------------------------------------------------------- 実行結果は、以下のようにanだけを表示します。 a[0]0.000000 a[1]1.000000 a[2]0.000000 a[3]1.000000 プログラムは合っていますでしょうか? (自分の予想ではcosxの成分だけが残るのでa[3]も0になると思いました。)

  • フーリエ級数

    大学からの課題なのですが、数学はあまり得意出ない上、高校で勉強した内容よりもレベルが上の難易度のようで、 色々と頑張っては見たのですが現在の自分の力だけではどうにも解く事が出来ないので、よかったらお教えください。 関数f(x)はxの全ての実数値に対し定義されていて、2πを周期に持つとする。 すなわち、f(x + 2π)=f(x),さらに,積分 ∫-π^π|f(x)|dxが存在するとする。このとき、関数f(x)は 以下のように展開できる。 f(x)=a0/2+Σ[n=1,∞](an cos nx + bn sin nx) (1) ここで、係数an,bn次式で計算される。 an=1/π∫-π^π f(x)cos nx dx (n=0,1,2,....), (2) bn=1/π∫-π^π f(x)sin nx dx (n=1,2,....), (3) さて特に、f(x)={ -1 (-π≦x<0,π=π) +1 (0≦x<π) }    (4) の場合を考える。このとき以下の問に答えよ。 【1】an=0(n=0,1,2,....)であることを示せ。 【2】bnが次式で与えられることを示せ。 bn={ 0 (n=2,4,...) 4/nπ (n=1,3,5,...) } 【3】 【1】式の無限級数の和を、n=5までの和で近似せよ。 すなわち、 f(x)= a0/2 + Σ[n=1,5](an cos nx + bn sin nx)=4/πΣ[n=1,3,5]sin nx/n (5)

  • 数学 フーリエ級数

    f(x)=|x|(π-|x|) で与えられる周期2πの関数について、 フーリエ係数a0,an,bnを求めたいんですけど、計算が苦手なものでなかなか上手くいきません。 参考書の公式をあてに a0=(π^2)/3 となったんですけど自信なしです(汗) an,bn に関してはお手上げです。 どなたかご教授お願いします!

  • フーリエ級数について

    現在フーリエ級数の問題を解いているんですが、解答がないので答えが合っているか教えて下さい。また間違えていたら解答と解き方を教えてください。 f(t)のフーリエ級数を求めよ。 f(t)=0 (-π<t<0)    t (0<t<π) 自分の解答 a0=π/4 , an=(1/2)*cos nπ , bn=(π/2)*sin nπ よろしくお願いします。