【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即该元素对应的时刻

相关推荐
布茹 ei ai24 分钟前
QtWeatherApp - 简单天气预报软件(C++ Qt6)(附源码)
开发语言·c++·qt·开源·开源项目·天气预报
Wpa.wk25 分钟前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
LinHenrY122726 分钟前
初识C语言(编译和链接)
c语言·开发语言·蓝桥杯
_OP_CHEN27 分钟前
【Python基础】(二)从 0 到 1 入门 Python 语法基础:从表达式到运算符的全面指南
开发语言·python
l1t27 分钟前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
我命由我1234536 分钟前
Python Flask 开发:在 Flask 中返回字符串时,浏览器将其作为 HTML 解析
服务器·开发语言·后端·python·flask·html·学习方法
csbysj202037 分钟前
Scala 类和对象
开发语言
拾忆,想起38 分钟前
设计模式:软件开发的可复用武功秘籍
开发语言·python·算法·微服务·设计模式·性能优化·服务发现
沐知全栈开发43 分钟前
HTTP/HTTPS 简介
开发语言
跟着珅聪学java44 分钟前
HTML中设置<select>下拉框默认值的详细教程
开发语言·前端·javascript