Matlab中的FFT使用说明
FFT是Fast Fourier Transform(快速傅里叶变换)的简称,FFT算法在MATLAB 中实现的函数是Y=fft(x,n)。刚接触频谱分析用到FFT时,几乎都会对MATLAB 的fft函数产生一些疑惑,下面以看一个例子(根据MATLA帮助修改)。
Fs = 2000; % 设置采样频率
T = 1/Fs; % 得到采用时间
L = 1000; % 设置信号点数,长度1 秒
t = (0:L-1)*T; % 计算离散时间,
% 两个正弦波叠加
f1 = 80;
A1 = 0.5; % 第一个正弦波100Hz,幅度0.5
f2
= 150;
A2 = 1.0 ; % 第2个正弦波150Hz,幅度 1.0
A3 = 0.5; % 白噪声幅度;
x = A1*sin(2*pi*f1*t) + A2*sin(2*pi*f2*t); % 产生离散时间信号;
y = x + A3*randn(size(t)); % 叠加噪声;
% 时域波形图
subplot(2,1,1)
plot(Fs*t(1:50),x(1:50))
title('Sinusoids Signal')
xlabel('time (milliseconds)')
subplot(2,1,2)
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')
NFFT = 2A nextpow2(L); % 设置FFT点数,一般为2 的N次方,如1024,512 等Y = fft(y,NFFT)/L; % 计算频域信号,
f = Fs/2*linspace(0,1,NFFT/2+1);
%频率离散化,fft后对应的频率是-Fs/2到Fs/2,由NFFT个离散频点表示
% 这里只画出正频率;
% Plot single-sided amplitude spectrum.
figure;
plot(f,2*abs(Y(1:NFFT/2+1)));
% fft 后含幅度和相位,一般观察幅度谱,并把负频率加上去,
title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)')
ylabel('|Y(f)|') 运行结果时域波形图如图所示: Sinusoids Signal 斗 2 0 -2 0 5 10 15 20 25 30 35 4Q 45 50 time (milliseconds)
time (mnliseconds) Signal Corrupted with Zero-Mean Random Noise 幅度谱如下:
Frequency (Hz)
由图可见,80Hz 的信号幅度为 0.4762,频率为80.08 ,150Hz 的信号频率为150.4,幅度0.9348 , 存在误差。
去掉白噪声后,结果为:
Single-Sided Amplitude Spectrum of y(t)
0.9
0.8
0.7
0.6 牙
0.5
Q.4
0.3
0,2
0.1 Single-Sided Amplitude Spectrum of y(t) X : 150.4 Y : 0 9391
X: 0O.OB Y; 0 4971
0 1G0 200 300 400 500 600 700 800 900 1000
Frequency (Hz)
可见幅度精度提高了,但频率任然有误差。如果修改
产生的复查,也没有噪声污染,结果如下:
可见结果与信号完全一致。
Fs为2048, L为4096,此时没有补0