How to define the frequency domain for plotting the FFT?
115 次查看(过去 30 天)
显示 更早的评论
I am new to DSP and am trying to figure out how the fft function works. From what I understand it returns the DFT of a input sequence: a vector of complex numbers whose magnitude and phase are that of the frequency components. But I do not understand what these frequencies are and am a little confused from some explanations that I have seen. To better explain my point: imagine if the fft() function returned a frequency vector over which it was calculated:
[X, freq] = fft(x); % some signal x <--> X
plot(freq, abs(X)); % plot magnitude response
figure;
plot(freq, angle(X)); % plot phase response
I have seen the following example from the documentation page: <https://in.mathworks.com/help/matlab/ref/fft.html>
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1500; % Length of signal
t = (0:L-1)*T; % Time vector
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
X = S + 2*randn(size(t));
Y = fft(X);
All well and good. Following are the lines that I do not understand with the quote: "Compute the two-sided spectrum P2. Then compute the single-sided spectrum P1 based on P2 and the even-valued signal length L." (?)
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
"Define the frequency domain f and plot the single-sided amplitude spectrum P1" (?)
f = Fs*(0:(L/2))/L;
Can someone explain what the last few lines are doing? The rest simply involves plotting the spectrum against the frequency vector which is easy. Any help is appreciated. Thanks!
0 个评论
回答(1 个)
Matt J
2022-2-7
编辑:Matt J
2022-2-7
To better explain my point: imagine if the fft() function returned a frequency vector over which it was calculated:
The frequency axis sample locations are not uniquely determined by the input x. You need to know the time sampling period as well. Basically, the relationship constraining everything is N*dT*dF=1 where N is the number of samples, dT is the time sampling period, and dF is the frequency sampling period
Fs = 1000; % Sampling frequency
dT = 1/Fs; % Sampling period
N = 1500; % Length of signal
t=( (0:N-1)-ceil((N-1)/2) )*dT ; % Time vector
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
[X,freq]=continuousFTsamples(x,dT);
tiledlayout(1,2)
nexttile
plot(t,x); axis square; xlabel 'Time (sec)'; ylabel 'x(t)'
nexttile
plot(freq,abs(X)); axis square; xlabel 'Freq. (Hz)'; ylabel 'X(f)'; xlim([-140,140])
function [X,freq]=continuousFTsamples(x,dT,varargin)
X=fftshift( fft( ifftshift(x), varargin{:} ) )*dT;
N=numel(X);
dF=1/N/dT;
freq=( (0:N-1)-ceil((N-1)/2) )*dF;
end
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Spectral Analysis 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!