2016-06-29 26 views
0

私はMatlabと高速フーリエ変換アルゴリズムを学んでいます。MatlabのFFT(高速フーリエ変換)の使い方

私はこの例を複製しようとした最初のステップとして:https://en.wikipedia.org/wiki/Fourier_transform#Example

Iは、次のコードを使用し

t = -6:0.01:6; 
s = cos(2 * pi * 3 * t) .* exp(-pi * t.^2); 
figure(1); 
plot(t, s); 
xlim([-2 2]); 
r = fft(s); 
figure(2); 
plot(t, abs(r)); 

およびIは、次のピクチャを得:

図2:

Figure 2

図1はOKですが、図2はOKです。問題の1つは、図2では、時間に対してではなく、の頻度に対してベクトルr をプロットする必要があることです。図2の別の問題は、Y軸のスケールです。

  1. がどのように私は、周波数領域(図2のX軸)を得ることができます。

    したがって、私は例を複製するために、2つの質問がありますか?

  2. ベクトルr(図2のY軸)をどのようにスケールする必要がありますか?

答えて

0

実際にfftをプロットするための周波数ベクトルを作成していないことが問題です。 fftが時間に対してプロットされる理由は、それがあなたのplotコマンドで指定したものであるからです。 (これは質問に完全に密接な関係ではなく、信号の長さを有するか、2の累乗のサイズを変換する理由は、結果の程度の精度ではありません

N=length(t); 
index=0:N-1; 
FrequencyResolution=SamplingRate/N; 
Frequency=index.*FrequencyResolution; 
data_fft=fft(detrend(data)); 
%the detrend isn't necessary but it does look nicer because it focuses the plot on changes around the mean of the data 
data_FFTmagnitude=abs(data_fft); 
plot(Frequency, data_FFTmagnitude) 
0

初めて私が勉強したプロジェクトの1つにDFTとFFTを使用したかったことを覚えていますが、これはwebpageを使用した例です。私はあなたがそれを通過し、あなたのケースを複製しようとすると、そうすることで、あなたがMatlabを初めて使うと言ったようにFFtを使うことができるようになります。より詳細なヘルプが必要な場合は、もう一度お尋ねください。

また、FFTの場合、2の累乗の信号長を持つ方が、最も正確な結果を得ることができます。また、信号長を制御できない場合は、誰もが通常そうするように、その長さに近い2。

+0

:ここ

は作業FFTの概要であります実用的なFFTはとにかく正確ではありません)、それはスピードです。問題をより簡単に細分化することができるため、小さな素因数の変換サイズはより高速に実行されます。 – CKT

+0

@CKT私は信号の長さが問題であるとは言いませんでしたが、それはスターターとしての彼/彼女のための示唆に過ぎませんでした。スピードは真ですが、周波数分解能の精度は、電力2の信号長を取ることによって直接影響を受けます。これはDFTではなくFFTの場合です。自分で試してみることができます。 – Soyol

+0

はい、あなた自身で試すことができます: >> DFT = @(N)exp(-1j * 2 * pi/N *(0:(N-1))*(0:(N-1)) ); >> x = randn(100,1); >> max(abs(DFT(100)* x-fft(x))./abs(DFT(100)* x) ans = 1.3516e-13 >> x = [x; 0(28,1)]; >> max(abs(DFT(128)* x-fft(x))./ abs(DFT(128)* x)) ans = 1。5653e-13 2の威力を持たないというわけではありませんが、必ずしもあなたに悪い精度を与えるわけではありません。人々は精度のためにFFTで2のべき乗を使用せず、スピードを上げるために使用します。一般に、2のべき乗以外のサイズの精度は悪化することはありません。 exp(__)の項は、Nが2の累乗であるとき、より良い丸めを与えることはありません。 – CKT

関連する問題