• 締切済み
  • すぐに回答を!

MATLABを用いたFFT

現在40kHzの正弦波をMATLABを用いてFFTをかけましたがしかし思った結果になりません。作成したmファイルの内容は以下のとおりです。 data = xlsread('test001.xls','Sheet1');   %excelファイルの読み込み data = data(:,2);   %2列目を選択 Y = fft(data);    %fft Pyy = Y.*conj(Y)/2500; %スペクトルを求める f = 40000 * (0:2499)/2500;          %範囲を指定 plot(f,Pyy(1:2500))             %グラフを作成 本当に困っているので、解答お願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1935
  • ありがとう数6

みんなの回答

  • 回答No.1

何が思ったとおりにいかないんでしょうか。 とりあえず、そのプログラムで何かは表示されるんでは、と思いますが。 横軸があってない、ってことですか? >現在40kHzの正弦波 とのことですが、そのプログラムを見る限り、サンプリング周波数40kHzで取り込んだデータとして扱っているようですが、それで正しいのですか?サンプリング周波数はいくつなのでしょう?

共感・感謝の気持ちを伝えよう!

関連するQ&A

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

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

  • FFTの結果ついて

    ある50kHzの信号を1024点FFTにかけ、横軸周波数、縦軸をパワースペクトルに変換しました。  しかし、0Hzのところにとても大きな値が出力されました。 3Hzの正弦波を入力した際にはちょうど3Hzのところにピークが現れたので計算は合っていると思うので、原因がよくわかりません。   後、スペクトルをdb表示にしたいのですが、計算方法がわかりません。 申し訳ないですが、どなたか教えて下さい。

  • FFTを使って信号から特定の周波数を抜き去る方法

    FFTを用いてある時系列データから特定の周波数の成分を抜き去ろうと思っていますが、 うまくいかないのでお伺いします。 調べてみると、スペクトルを出すとき、例えば同じ振幅で周波数の異なるの正弦波を 10個入れても全て同じ振幅にならず、振幅の大きさにばらつきが出ていて周波数成 分の成分の推定がうまくいっていないようです。FFTの2乗のデータを小さな周波数区 間で積分してスペクトル密度にしても、先ほどの10個の正弦波の振幅がそろわない のと、周波数推定が悪くなりうまく、引き去れなくなっています。 よくある状況だと思いますが、どういう工夫が必要なのでしょうか。 ちなみに、FFTのルーチンはnumerical recipeとFFTWの二つで試しました。

  • FFTデータ数が少ないと直流成分が大きく変動する?

    FFTの振幅スペクトルから実効値算出のために単一正弦波をFFTしてみると、(1)のように計算データ点数が少ない場合、窓関数の位置によって「0Hz直流成分」のFFT結果値が大きく変動してしまいます。((2)(3)は窓関数がどの位置でも問題ありません。) この(1)(1サイクル64点=FFTデータ数64個)のような計算の場合、どのように実効値算出すればよいでしょうか?  また、正常な場合でもこれらのサンプル間隔(0、30Hz、60Hz等)の"すき間の部分”は考慮しなくても、全て計算結果に出力されているということでよいでしょうか? 単一正弦波(60Hz)   ((最大値5388.9v=実効値3810.5v)、サンプリング3.84KHz=1サイクル64点)   (実効値換算式=前半の√(実数^2+虚数^2)の合計/(FFTデータ数/2)/√2) (1)FFTデータ数 64個⇒0Hz(0.00~1905.2)???、60Hz(1905.2),120Hz(952.6)、180Hz(0.0)、          ⇒合計( ??? ) (2)FFTデータ数128個⇒0Hz(0.0), 30Hz(952.6),60Hz(1905.2),90Hz(952.6), 120Hz(0.0)、          ⇒合計(3810.4) ≒実効値 (3)FFTデータ数256個⇒0Hz(0.0),15Hz(0.0),30Hz(0.0)、                45Hz(952.6),60Hz(1905.2),75Hz(952.6), 90Hz(0.0),           ⇒合計(3810.4) ≒実効値

  • FFTプログラムで問題が生じました。

    C言語でFFTのプログラムを作成しています。入力として周波数の既知な正弦波を利用してプログラムの動作確認をしているのですが、サンプリング周期0.01secの状態でサンプリング数が4096点と8192点の時だけスペクトルの結果がおかしくなってしまいます。例えば、10Hzの入力に対して他の点数(512~32768点)では、きちんと10Hzの位置にスペクトルが現われるのですが4096点と8192点の時は、10Hzの他に同じ大きさの40Hzのスペクトルが現われてしまいます。入力が5Hzの時は、45Hzに現われます。ちょうど折り返し雑音のような誤作動なので何か明確な原因があるのではないかと思うのですが全く分かりません。このようなことはよくあるのでしょうか?それとも単にプログラムのミスでしょうか。回答お願いします。

  • MATLAB(再生している音の周波数をリアルタイムで変更したい)

    MATLAB(R2008a)を利用しています。 sin関数で作成した正弦波をwavplay関数やaudioplayer・play関数で再生しているのですが、再生中に正弦波の周波数をキーボードからの入力にあわせて滑らかに変更したいと思っています。 どのような方法があるのでしょうか。 audioplayerで作った音をstopで一度とめて、違う周波数の正弦波をすぐにplayで再生しようと思っても間に少し空白の時間ができてしまって困っております。 お知恵いただけると助かります。

  • パワースペクトルの0dBの値について

    matlabを用いて時系列データのパワースペクトルを計算、対数表示でグラフにプロットしています。 matlabのfft関数のヘルプに記載されていた例を参考に、以下のような自作の関数を組んで計算しているのですが、2つ質問があります。 1. この場合、パワースペクトルの0dBは、時系列の値ではいくつになるのでしょうか? 0dB = 1でしょうか? 2. 関数の中において、power_fftをN_fft(高速フーリエ変換時のデータ長さ)で割っている事の理由がわからなかったのですが、なぜ行っているのでしょうか? ------------------------------------------------ 以下、自作のパワースペクトル表示関数を示します function Power_db(Data_xx) fs = 1000; % サンプリング周波数 [Hz] N_fft = 2^12; % 4096個 xx_fft = fft(Data_xx,N_fft); power_xx = xx_fft.* conj(xx_fft) / N_fft; frequency = fs*(0:2047)/N_fft; % (0:2047)で500Hzまで plot(frequency,20*log10(power_xx(1:2048))) xlabel('Frequency [Hz]'); ylabel('Power Spectrum [dB]'); grid on; --------------------------------------------------------- 以上です。 何か足らない情報などがありましたらお申し付けください。 よろしくお願い致します。

  • 正弦波のべき乗は,どんな物理現象を指すのか?

    正弦波のべき乗は,どんな物理現象を指すのか? こんにちは。 正弦波のべき乗の波形を人工的に作成し,パワースペクトルを求めると,基本周波数とその倍音成分のようなものが出てきました。 単なる数値実験に過ぎませんが,何かこのような振動を生み出すような物理現象が実際にありそうな気がします。 もし,このような波形を実際に観測したという方がいたら,教えてください。 参考までに,正弦波を5乗した波形とその振幅スペクトルを添付します。

  • エクセルの任意のシートをcsv出力するVBScript

    c:\a01.xls という名前のエクセルファイルがあり、sheet1、sheet2、sheet3 というシートの構成とします。それぞれのシートには何件かの入力があるとします。 この エクセルファイルから Sheet2 の シートのデータを c:\csv01.csv にCSV出力するには どのような test.vbs を作成したらよいのでしょうか? 教えてください。

  • MATLABで外れ値をプロットする方法を教えてくだ

     MATLABで外れ値をプロットする方法を教えてください。  具体的には下記のとおりです。  MATLABで、中央値+中央値から±20%離れた時系列データをプロットするにはどうすればよいでしょうか? 冗長なprogramしか作成できないため、よい関数か、方法があれば教えていただきたく思い、 質問しました。 まず、時系列データですが、数十万点数からなる信号になっています。 この信号の中央値をだし、その中央値から±20%の範囲でひっかかるデータをplotしたく思っています。 中央値算出は、関数を知っていますので処理が早いのですが中央値から±20%の範囲でひっかかるデータをプロットするのにいまは、以下のような考えで行っています。 行データ、size(x(:)) ans=:1000000 1とおきます。 まず、 1)中央値を求める。 2)median+20%、median-20%を求める。 3) hold on;  for i=1:1:data-length   if(x(i)<=median-20% & x(i)>=median+20%) plot x(i) endif  end というようにしています。しかし、これではデータ一点一点検討する必要があるので冗長で、処理に時間が かかります。 そのため、for文を使わずに、 medi-20(:)=function(x(:),median-20) medi+20(:)=function(x(:),median+20) で計算できるような、関数functionを教えていただけると幸いです。 よろしくお願いします。