MATLAB:快速傅里叶变换(FFT)

快速傅里叶变换介绍

傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的余弦(或正弦)波信号的无限叠加。FFT 是离散傅立叶变换的快速算法,可以将一个信号变换到频域。那其在实际应用中,有哪些用途呢?

  1. 有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征(频率,幅值,初相位);

  2. FFT 可以将一个信号的频谱提取出来,进行频谱分析,为后续滤波准备;

  3. 通过对一个系统的输入信号和输出信号进行快速傅里叶变换后,两者进行对比,对系统可以有一个初步认识。

假设采样频率 F s Fs Fs,信号频率 F F F,信号长度 L L L,采样点数 N N N。那么 FFT 之后结果就是一个为 N N N 点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。

具体跟原始信号的幅度有什么关系呢?

  1. 假设原始信号的峰值为 A A A,那么 FFT 的结果的每个点(除了第一个点直流分量之外)的模值就是 A A A N / 2 N/2 N/2 倍,而第一个点就是直流分量(即 0 Hz),它的模值是直流分量的 N N N 倍;

  2. 每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量,它的相位是该频率的初相位,MATLAB 以 c o s cos cos 为底的,若信号时正弦形式 s i n ( t ) sin(t) sin(t),则变成 c o s ( t − π / 2 ) cos(t-\pi/2) cos(tπ/2) 即可。

采样频率 F s Fs Fs,被 N − 1 N-1 N1 个点平均分成 N N N 等份,每个点的频率依次增加。为了方便进行 FFT 运算,通常 N N N 取大于信号长度 L 的 2 的整数次方。

例如某点 n n n 所表示的频率为: F n = ( n − 1 ) ∗ F s / N Fn=(n-1)*Fs/N Fn=(n1)Fs/N 。由上面的公式可以看出, F n Fn Fn 所能分辨到频率为为 F s / N Fs/N Fs/N。如果采样频率 F s Fs Fs 为 1024Hz,采样点数为 1024 点,则可以分辨到 1Hz。

1024Hz 的采样率采样 1024 点,刚好是 1 秒,也就是说,采样 1 秒时间的信号并做 FFT,则结果可以分析到 1Hz。如果采样2秒时间的信号,则 N 为2048,并做 FFT,则结果可以分析到 0.5Hz。

如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。

假设 FFT 之后某点 n n n 用复数 a + b i a+bi a+bi 表示,该复数的模就是 A n = s q r t ( a ∗ a + b ∗ b ) An=sqrt(a*a+b*b) An=sqrt(aa+bb),相位就是 P n = a t a n 2 ( b , a ) Pn=atan2(b,a) Pn=atan2(b,a)。根据以上的结果,就可以计算出 n 点(n≠1,且n<=N/2)对应的信号的表达式为: A n / ( N / 2 ) ∗ c o s ( 2 π ∗ F n ∗ t + P n ) A_n/(N/2)*cos(2\pi*Fn*t+Pn) An/(N/2)cos(2πFnt+Pn),即 2 ∗ A n / N ∗ c o s ( 2 ∗ p i ∗ F n ∗ t + P n ) 2*An/N*cos(2*pi*Fn*t+Pn) 2An/Ncos(2piFnt+Pn);对于 n = 1 n=1 n=1 点的信号,是直流分量,幅度即为 A 1 / N A_1/N A1/N

由于 FFT 结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。

例子

假设我们有一个信号,它含有 5V 的直流分量,频率为 50Hz、相位为 -30 度、幅度为 7V 的交流信号以及一个频率为 90Hz、相位为 90度、幅度为 3V 的交流信号。数学表达式为:

x = 5 + 7 c o s ( 2 π ∗ 15 ∗ t − 30 π / 180 ) + 3 c o s ( 2 π ∗ 40 ∗ t − 90 π / 180 ) x = 5 + 7cos(2\pi*15*t - 30\pi/180) + 3cos(2 \pi *40*t - 90\pi/180) x=5+7cos(2π15t30π/180)+3cos(2π40t90π/180)

我们以 128Hz 的采样率对这个信号进行采样,总共采样 256 点。按照我们上面的分析, F n = ( n − 1 ) ∗ F s / N Fn=(n-1)*Fs/N Fn=(n1)Fs/N,我们可以知道,每两个点之间的间距就是 0.5Hz。我们的信号有3个频率:0Hz、15Hz、40Hz

出于编程方便,因为直流分量的幅值 A 1 / N A_1/N A1/N,其他点幅值为 A n / ( N / 2 ) A_n/(N/2) An/(N/2),故直流分量最后要除以 2 才是对的。

一般 FFT 所用数据点数 N N N 与原含有信号数据点数 L L L 相同,这样的频谱图具有较高的质量,可减小因补零或截断而产生的影响。

Matlab代码

clear
Fs = 128;       % 采样频率
T = 1/Fs;       % 采样时间
L = 256;        % 信号长度
t = (0:L-1)*T; % 时间
x = 5 + 7*cos(2*pi*15*t - 30*pi/180) + 3*cos(2*pi*40*t - 90*pi/180);   %cos为底原始信号
y = x + randn(size(t));     %添加噪声

figure;
plot(t,y)
title('加噪声的信号')
xlabel('时间(s)')
N = 2^nextpow2(L); %采样点数,采样点数越大,分辨的频率越精确,N>=L,超出的部分信号补为0
Y = fft(y,N)/N*2;   %除以N乘以2才是真实幅值,N越大,幅值精度越高
f = Fs/N*(0:1:N-1); %频率
A = abs(Y);     %幅值
P = angle(Y);   %相值
figure;
subplot(211);plot(f(1:N/2),A(1:N/2));   %函数fft返回值的数据结构具有对称性,因此我们只取前一半
title('幅值频谱')
xlabel('频率(Hz)')
ylabel('幅值')
subplot(212);plot(f(1:N/2),P(1:N/2));
title('相位谱频')
xlabel('频率(Hz)')
ylabel('相位')

参考:
https://blog.csdn.net/deng_sai/article/details/52473503

  • 17
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值