/****************************************************/

/****************************************************/

/****************************************************/

下面是具体说明

1、FFT:频谱关于中间位置对称,只需要观察  0:1:N/2(这N/2+1个点)(时域采集N个点,频域只需要观察N/2+1个点)

2、MATLAB中FFT的频谱,应该看幅值

3、X轴频率点的设置:采样频率为Fs,频谱图显示的最高频率为Fs/2(采样定理)

:X轴频率点:(0:1:N/2)*Fs/N

4、复数幅值修正

5、

/****************************************************/

/****************************************************/

/****************************************************/

栗子及实践部分

一、信号

%% FFT
clear;clc;close all
Fs=1000; % 采集频率
T=1/Fs; % 采集时间间隔
N=2000; % 采集信号的长度--采样点数
f1=33; % 第一个余弦信号的频率
f2=200; % 第二个余弦信号的频率 t=(0:1:N-1)*T; % 定义整个采集时间点
t=t'; % 转置成列向量 y=1.2+2.7*cos(2*pi*f1*t+pi/4)+5*cos(2*pi*f2*t+pi/6); % 时域信号

二、绘制时域信号

%% 绘制时域信号
figure
plot(t,y)
xlabel('时间')
ylabel('信号值')
title('时域信号')

  

  

三、FFT变换、并绘制-幅值、实部、虚部

%% fft变换
Y=fft(y); % Y为fft变换的结果,为复数向量
A=abs(Y); % 复数的幅值(模)
RE=real(Y); % 复数的实部
IM=imag(Y); % 复数的虚部 %% 绘制fft变换结果(幅值,实部,虚部)
figure
subplot(3,1,1)
plot(0:1:N-1,A)
xlabel('序号 0 ~ N-1')
ylabel('幅值')
grid on %% 频域只读取0:1:N/2
subplot(3,1,2)
plot(0:1:N-1,RE)
xlabel('序号 0 ~ N-1')
ylabel('实部')
grid on subplot(3,1,3)
plot(0:1:N-1,IM)
xlabel('序号 0 ~ N-1')
ylabel('虚部')
grid on

  

  

可以看出频域中的点关于(N/2)对称,所以只需要观察(0:1:N/2)

四、更改相位

 

幅值不受影响,但实部或虚部的值,会出现0的情况==>看MATLAB中FFT的频谱,应该看幅值

绘制半谱图(幅值的)后--我们发现-幅值-相位-频率---均和时域对应不上。

==>进行幅值-修正

五、进行幅值-修正--并绘制图形

%% fft变换
Y=fft(y); % Y为fft变换结果,复数向量
Y=Y(1:N/2+1); % 只看变换结果的一半即可
A=abs(Y); % 复数的幅值(模)
f=(0:1:N/2)*Fs/N; % 生成频率范围
f=f'; % 转置成列向量 %% 幅值修正
A_adj=zeros(N/2+1,1);
A_adj(1)=A(1)/N; % 频率为0的位置
A_adj(end)=A(end)/N; % 频率为Fs/2的位置
A_adj(2:end-1)=2*A(2:end-1)/N; %% 绘制频率幅值图
figure
subplot(2,1,1)
plot(f,A_adj)
xlabel('频率 (Hz)')
ylabel('幅值 (修正后)')
title('FFT变换幅值图')
grid on %% 绘制频谱相位图
subplot(2,1,2)
phase_angle=angle(Y); % angle函数的返回结果为弧度
phase_angle=rad2deg(phase_angle);
plot(f,phase_angle)
xlabel('频率 (Hz)')
ylabel('相位角 (degree)')
title('FFT变换相位图')
grid on

  

放大后可以看到,此时,幅值-频率都和时域一致

此时FFT的相位图是杂乱无章的--不用担心,没有频率处的相位是无意义的--我们只需要放大看各个(实际存在的)频率点的相位即可

可以看到--f1=33Hz处为45度,即pi/4--是正确的

六、实际操作:请分析一个未知的采集信号 (example.mat),并确定该采集信号的频率成分。其中, 信号的采集频率 Fs = 2500 Hz

代码

clear;clc;close all
load('example')
Fs=2500; % 采集频率
T=1/Fs; % 采集时间间隔
N=length(y); % 采集信号的长度 t=(0:1:N-1)*T; % 定义整个采集时间点
t=t'; % 转置成列向量 % 绘制时域信号
figure
plot(t,y)
xlabel('时间')
ylabel('信号值')
title('时域信号') % fft变换
Y=fft(y); % Y为fft变换结果,复数向量
Y=Y(1:N/2+1); % 只看变换结果的一半即可
A=abs(Y); % 复数的幅值(模)
f=(0:1:N/2)*Fs/N; % 生成频率范围
f=f'; % 转置成列向量 % 幅值修正
A_adj=zeros(N/2+1,1);
A_adj(1)=A(1)/N; % 频率为0的位置
A_adj(end)=A(end)/N; % 频率为Fs/2的位置
A_adj(2:end-1)=2*A(2:end-1)/N; % 绘制频率幅值图
figure
subplot(2,1,1)
plot(f,A_adj)
xlabel('频率 (Hz)')
ylabel('幅值 (修正后)')
title('FFT变换幅值图')
grid on % 绘制频谱相位图
subplot(2,1,2)
phase_angle=angle(Y); % angle函数的返回结果为弧度
phase_angle=rad2deg(phase_angle);
plot(f,phase_angle)
xlabel('频率 (Hz)')
ylabel('相位角 (degree)')
title('FFT变换相位图')
grid on

  

全部代码下载地址

 

FFT-Matlab初步实现的更多相关文章

  1. MATLAB中FFT的使用方法

    MATLAB中FFT的使用方法 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X, ...

  2. MATLAB中fft函数的正确使用方法

    问题来源:在阅读莱昂斯的<数字信号处理>第三章离散傅里叶变换时,试图验证实数偶对称信号的傅里叶变换实部为偶对称的且虚部为零.验证失败.验证信号为矩形信号,结果显示虚部是不为零且最大幅值等于 ...

  3. FFT的分析以及matlab实验

    FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换(DFT)的快速算法. 采样得到的数字信号,做FFT变换,N个采样点,经过FFT之后,就可以得到N个点 ...

  4. [转载]Matlab中fft与fftshift命令的小结与分析

    http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html 注:转载请注明出处——by author. 我们知道Fourier分析是信号处理里很重要的技术 ...

  5. [转载]MATLAB中FFT的使用方法

    http://blog.163.com/fei_lai_feng/blog/static/9289962200971751114547/ 说明:以下资源来源于<数字信号处理的MATLAB实现&g ...

  6. MatLab实现FFT与功率谱

    FFT和功率谱估计 用Fourier变换求取信号的功率谱---周期图法 clf; Fs=1000; N=256;Nfft=256;%数据的长度和FFT所用的数据长度 n=0:N-1;t=n/Fs;%采 ...

  7. Matlab计算的FFT与通过Origin计算的FFT

    实验的过程中,经常需要对所采集的数据进行频谱分析,软件的选择对计算速度影响挺大的.我在实验过程中,通常使用Origin7.5来进行快速傅里叶变换,因为方便快捷,计算之后,绘出来的图也容易编辑.但是当数 ...

  8. matlab 中fft的用法

    一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性. 例:N=8;n=0:N- ...

  9. Matlab周期图法使用FFT实现

    参考文章:http://www.cnblogs.com/adgk07/p/9314892.html 首先根据他这个代码和我之前手上已经拥有的那个代码,编写了一个适合自己的代码. 首先模仿他的代码,测试 ...

  10. 基2时抽8点FFT的matlab实现流程及FFT的内部机理

    前言 本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP的好, 还是老实调IP吧,了解内部机理即可,无需重复发明轮子. 参考 https:// ...

随机推荐

  1. 医院医疗类报表免费用,提反馈,还能赢取P30!

    医院医疗类报表免费用,提反馈,还能赢取P30! “葡萄城报表模板库是一款免费的报表制作.学习和参考工具,包含了超过 200 张高质量报表模板,涵盖了 16 大行业和 50 多种报表类型,为 30 余万 ...

  2. MySQL中关于主从数据库同步延迟的问题解决

    MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以 ...

  3. Maven添加镜像仓库、更改本地仓库位置

    添加镜像仓库 在conf目录下的settings.xml文件的145行左右 id表示该镜像的id mirrorOf表示为哪个仓库配置镜像,central为默认的中央仓库的id,也可以使用通配符*,来匹 ...

  4. # vmware异常关机后,虚拟系统无法启动的解决办法

    vmware异常关机后,虚拟系统无法启动的解决办法 先使用everything搜索所有后缀为.lck的文件,这些文件全部删除,如果不确定是否可以删除,先把这些文件转移到桌面,等能启动虚拟系统之后再删除 ...

  5. Linux-1.2关机重启reboot,shutdown

    关机重启:reboot,shutdown reboot 重启操作系统 shutdown -r now 重启,shutdown会给其他用户提示

  6. Java——BufferedImage对象

    BufferedImage对象中最重要的两个组件是Raster与ColorModel,分别用于存储图像的像素数据和颜色数据. 1.Raster对象的作用与像素存储 BufferedImage支持从Ra ...

  7. 第六篇 ajax

    加载异步数据 6-1 加载异步数据 XMLHttpRequest--传统的JavaScript方法实现Ajax功能 6-1-a <!DOCTYPE html PUBLIC "-//W3 ...

  8. 新技能get,文件夹隐藏

    attrib命令用来显示或更改文件属性. ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S ...

  9. 关于mail mailx 以及sendmail 的理解

    最近在弄邮件告警相关的东西,接触到了mail这一块,但是发送邮件的时间看到网上的用法 yum install mailx sednmail -y 这一块很迷糊 所以决定自己研究下 首先套用官话解释: ...

  10. Zabbix 3.2.6使用注意事项

    1.如果需要使用zabbix自带的SMTP发送邮件,需要在安装前升级系统的curl到7.20版本以上 2.zabbix对接PHP 7.1版本,因为PHP 7.1类型强化,会在安装完成zabbix,登录 ...