【Matlab】快速傅里叶变换fft代码(单边谱)

单边谱,横纵坐标还原代码
参考链接

主代码

matlab 复制代码
function main()
clc
clear
close all
%%
%仿真时间
dt=0.01;
t_end=10;
time=dt:dt:t_end;%注意,length(time)会对fft结果的精度有影响
%对应振幅,频率:10、5、2Hz
Z=20*sin(2*pi*20*time)+10*sin(2*pi*10*time)+5*sin(2*pi*5*time)+2*sin(2*pi*2*time);
figure(1)
plot(time,Z,'b-')
xlabel('时间/s')
ylabel('振幅')
%% fft变换
%注意,length(time)会对fft结果的精度有影响
[f,Y_amp]=fastf(Z,dt);
%fft结果
figure(101)
plot(f,Y_amp)
xlabel('频率/Hz')
ylabel('振幅')
%fft结果,双对数坐标
figure(102)
loglog(f,Y_amp)
xlabel('频率/Hz')
ylabel('振幅')

fastf.m

只和需要被fft的时间序列Z(编号乘以dt是对应的时间)与间隔时间dt有关

matlab 复制代码
function [f,Y_amp]=fastf(Z,dt)
%fft变换,单边谱,恢复频率轴和幅度
% https://blog.csdn.net/weixin_43215105/article/details/127932757?spm=1001.2014.3001.5506
%% fft
fs=1/dt;%采样频率
f_fft=fft(Z);%fft变换,matlab直接fft变换的结果的横轴、纵轴均不正确,需要变换处理
%% 单边谱,恢复频率轴和幅度
N=length(f_fft);%fft之后的序列长度

if mod(N, 2) ~= 0
    N=N-1;%如果向量长度为奇数去末尾数
end

Y=f_fft(1:N/2);%单边谱是双边谱的一般
Y=2*Y;
Y_amp=abs(Y)/N;%恢复振幅

df=fs/N;%频率分辨率
f=(1:N/2)*df;

时间序列Z如下图所示:
Z(向量)内元素的编号乘以dt即该元素对应的时刻

相关推荐
玩转单片机与嵌入式5 分钟前
玩转边缘AI(TInyML):需要掌握的C++知识汇总!
开发语言·c++·人工智能
茉莉玫瑰花茶38 分钟前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
张健11564096482 小时前
临界区和同一线程上锁
java·开发语言·jvm
头发够用的程序员2 小时前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试
夜猫逐梦2 小时前
【逆向经验】一篇文章讲透为什么CE搜不到Python游戏的内存值
开发语言·python·游戏
SilentSamsara3 小时前
闭包的本质:Python 如何捕获自由变量
开发语言·python·青少年编程·pycharm
十五年专注C++开发3 小时前
浅谈LLVM
开发语言·c++·qt·clang·llvm
白夜11173 小时前
C++(标签派发 Tag Dispatching)
开发语言·c++·笔记·算法
CSCN新手听安4 小时前
【Qt】Qt窗口(六)QMessageBox消息对话框的使用
开发语言·c++·qt