当前位置: 代码网 > it编程>编程语言>C/C++ > 【Matlab】快速傅里叶变换fft代码(单边谱)

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

2024年08月03日 C/C++ 我要评论
单边谱,横纵坐标还原代码。

单边谱,横纵坐标还原代码

主代码

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有关

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com