1、目的:熟悉MATLAB的FFT函数
2、基于MATLAB的FFT函数需要了解的知识点
- 频谱关于中间位置对称,只需要观察 0:1:N/2(这N/2+1个点)(时域采集N个点,频域只需要观察N/2+1个点)
- MATLAB中FFT的频谱,应该看幅值
- X轴频率点的设置:采样频率为Fs,频谱图显示的最高频率为Fs/2(采样定理):X轴频率点:(0:1:N/2)*Fs/N
- 复数幅值修正
3、需要说明的两个问题
- 画出的频谱图的频率分辨率为Fs/N
- 采样频率Fs大于信号最大频率的的2倍
4、自己的心得
- 由于采样定理可知,当不满足采样定理的时候将出现混叠现象,所以FFT处理时默认Fs/2为最高信号频率
- 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。
5、待解决的问题
- 从数学层面理解FFT变换后的幅值的大小问题(心得第二点)
6、MATLAB代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%------------------------------------------------------------------------------------%
%************************************** FFT *****************************************%
%------------------------------------------------------------------------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Date:XXXX.X.XXX
% Author:flypassion
% Version:1.0
clear all
close all
clc
%% Parameter Interface
SampleFre = 1000; %采样频率
SignalLen = 20000; %数据长度
%% Main
%--------------------------------------------------------------------------------------
t = (0:SignalLen-1)/SampleFre; %时间
SignalData = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); %采样频率>2倍信号最大频率
NoiseData = 2*randn(size(t));
SignalAddNoiseData = SignalData + NoiseData;
plot(1000*t(1:50),SignalAddNoiseData(1:50))
title('信号添加随机噪声')
xlabel('t(毫秒)')
%--------------------------------------------------------------------------------------
FFTData = fft(SignalAddNoiseData);
FFTAmplitude0 = abs(FFTData)/SignalLen; %频谱关于SignalLen/2对称
FFTAmplitude1 = FFTAmplitude0(1:SignalLen/2);
FFTAmplitude0(2:end) = 2*FFTAmplitude0(2:end); %复数域的幅值需要进行变换才能与时域的幅值对应
FFTAmplitude1(2:end) = 2*FFTAmplitude1(2:end);
Frequence0 = SampleFre*(0:(SignalLen-1))/SignalLen;
Frequence1 = SampleFre*((0:(SignalLen/2)-1))/SignalLen;
subplot(2,1,1)
plot(Frequence0,FFTAmplitude0)
title('双边频谱')
xlabel('f(Hz)')
ylabel('FFTAmplitude')
subplot(2,1,2)
plot(Frequence1,FFTAmplitude1)
title('单边频谱')
xlabel('f(Hz)')
ylabel('FFTAmplitude')
实验图片
7、参考链接