2016-06-29 3 views
0

Я просто изучаю Matlab и алгоритм быстрого преобразования Фурье.Как использовать FFT (быстрое преобразование Фурье) в Matlab

В качестве первого шага я попытался повторить этот пример: https://en.wikipedia.org/wiki/Fourier_transform#Example

Я использую следующий код:

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)); 

И я получил следующую картину:

Рисунок 2:

Figure 2

Рисунок 1 в порядке, но на рисунке 2 нет. Я вижу, что одна из проблем заключается в том, что на рисунке 2 я должен нарисовать вектор r против частоты, а не во времени. Другая проблема на рисунке 2 - масштаб по оси Y.

Таким образом, у меня есть 2 вопроса для того, чтобы дублировать пример:

  1. Как можно получить в частотной области (ось Х на фиг.2)?
  2. Как следует масштабировать вектор r (ось Y на рисунке 2)?

ответ

0

Ваша проблема в том, что вы на самом деле не создаете вектор частоты для построения графика fft. Причина, по которой fft построена по времени, заключается в том, что это то, что вы указали в вашей команде plot.

Вот рабочий контур FFT:

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

Я помню, как однажды в первый раз, что я хотел использовать ДПФ и БПФ для одного из моих исследовательских проектов, которые я использовал этот webpage, он подробно объясняет примеры о том, как сделать это. Я предлагаю вам пройти через это и попытаться воспроизвести для своего дела, так как это даст вам понимание и лучшее понимание того, как можно использовать FFt, как вы сказали, что вы новичок в Matlab. Не стесняйтесь спрашивать, если вам нужна более подробная помощь.

Кроме того, имейте в виду, что для БПФ лучше иметь длину сигнала от 2, таким образом, вы получите самые точные результаты, и если вы не сможете контролировать свою длину сигнала, вы можете взять наибольшую мощность 2 близко к этой длине, как обычно.

+0

Это не совсем релевантно к вопросу, но причина, имеющей длину сигнала или преобразовать размеры, которые являются степенями 2 не о точности результатов (никакой практический БПФ не будет точным в любом случае), речь идет о скорости. Преобразование размеров с небольшими основными коэффициентами выполняется быстрее, потому что проблему можно легко разделить. – CKT

+0

@CKT Я никогда не говорил, что длина сигнала - это проблема, это было просто предложение для него/нее как стартера. Скорость верна, но точность разрешения частоты напрямую зависит от длины сигнала мощности 2, это имеет место для FFT, а не DFT, вы можете попробовать себя и посмотреть. – 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; нули (28,1)]; >> max (abs (DFT (128) * x-fft (x)) ./ abs (DFT (128) * x)) ans = 1.5653e-13 Таким образом, нет, не имея силы 2, не обязательно будет давать вам худшую точность. Люди не используют силу 2 в БПФ для точности, они используют ее для скорости. В общем, вы не получите худшую точность для размеров без питания. Термины exp (__) не дают вам лучшего округления, когда N является степенью 2. – CKT

Смежные вопросы