傅里叶变换

傅里叶变换是一种线性的积分变换, 它提供了一种可以将信号从时间幅值坐标变换到频率幅值坐标的方法,其具体的定义如下:

在这里插入图片描述
上式即为傅里叶变换的表达式。

理解

傅里叶变换将信号分解为若干个简谐信号叠加的形式,通过傅里叶变换画出频谱图之后就可以找到信号中包含的频率成分。

在这里插入图片描述

fft应用

MATLAB中自带的fft()函数可以帮助我们完成傅里叶变换的计算过程,不过直接调用fft(),画图之后发现横纵坐标的值和我们想的不一样,我们对下面这样的一个信号做fft

Fs=1000; %采样率
N = 1; % 周期数
t=N; % 信号时长 s 
n=0:1/Fs:t-1/Fs; % 采样时间点,刚好采N 个周期
len = length(n); % 信号点数
y = sin(2*pi*20*n)+1.5*sin(2*pi*33*n)+0.6*sin(2*pi*50*n); % 采集到的离散信号
plot(n,y)
title('信号y')

画出上面表达式y的图像
在这里插入图片描述

直接调用fft画出图是这样的

Y = fft(y);
Y = abs(Y);
plot(Y(1:len/2));
title('直接调用fft')

在这里插入图片描述

从y的表达式可以看出,信号的包含3个频率成分,20Hz、33Hz、50Hz,其对应的幅值为1、1.5、0.6,但是从上面的图我们看不出这些信息,因此需要对变换之后的信号做一定的处理。

调用下面的程序

myfft(y,Fs);

function [f,Y] = myfft(data,Fs,is_plot)
if nargin < 3
    is_plot = true;
end
x=data;
N = length(x);
df=Fs/(N-1);%分辨率
f=(0:N-1)*df;%其中每点的频率
Y=fft(x(1:N))/N*2;%真实的幅值
if is_plot
    g = figure;
    figure(g);
    plot(f(1:N/2),abs(Y(1:N/2)));
    axis normal;
    title('fft频谱','Fontname','宋体');
    xlabel('频率(Hz)','Fontname','宋体'); 
    ylabel('幅值(m/s^2)','Fontname','宋体'); 
end
end

得到的图片如下,从这张图中我们就可以看出原始信号的频率和每个频率对应的幅值。
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐