本篇为《信号处理》系列博客的第五篇,该系列博客主要记录信号处理相关知识的学习过程和自己的理解,方便以后查阅。
文章原地址:《基于MATLAB的FFT分析》
Matlab中使用FFT函数
基于MATLAB的FFT函数需要了解的知识点
- 频谱关于中间位置对称,只需要观察 $ 0:1:N/2 ( 这 (这 (这N/2+1 个 点 ) ( 时 域 采 集 N 个 点 , 频 域 只 需 要 观 察 个点)(时域采集N个点,频域只需要观察 个点)(时域采集N个点,频域只需要观察N/2+1$个点)
- MATLAB中FFT的频谱,应该看幅值
- X轴频率点的设置:采样频率为Fs,频谱图显示的最高频率为Fs/2(采样定理):X轴频率点: ( 0 : 1 : N / 2 ) ∗ F s / N (0:1:N/2)*Fs/N (0:1:N/2)∗Fs/N
- 复数幅值修正
需要说明的两个问题
- 画出的频谱图的频率分辨率为Fs/N
- 采样频率Fs大于信号最大频率的的2倍
原文作者心得
- 由于采样定理可知,当不满足采样定理的时候将出现混叠现象,所以FFT处理时默认Fs/2为最高信号频率
- 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。
待解决的问题
从数学层面理解FFT变换后的幅值的大小问题(心得第二点)
MATLAB代码
%%%傅里叶变换的例子%%%
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;
FFTAmplitude1 = FFTAmplitude0(1:SignalLen/2);%频谱关于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')